O fundo
Meu filho Leonhard (4 anos) adora labirintos. Não sei de onde ele conhece os labirintos, mas ele os pinta e sabe muito bem como eles funcionam:
Recentemente, ele começou a fazer um jogo com suas pinturas. Estas são as regras dele:
- um quadrado preto indica o ponto de partida.
- um gancho indica a saída do labirinto (é onde você é puxado).
- você pode coletar coroas.
- você pode coletar pepitas de ouro (as coisas redondas).
- você pode ir e voltar, mas não mais do que isso.
- setas podem guiá-lo para a saída. (Se ele pinta um labirinto para eu resolver, eles geralmente são enganosos).
Versão anotada:
- azul: ponto de partida
- laranja: coroas
- amarelo: área com pepitas de ouro
- verde: gancho (saída)
- rosa: setas (principalmente enganosas)
A tarefa
Talvez você saiba que, aos 4 anos de idade, as crianças começam a contar tortas de porquinho e, às vezes, ele não segue suas próprias regras, principalmente se descobrir que não consegue mais chegar ao fim do labirinto.
É aí que você entra em jogo: já que estou procurando jogos para crianças , você transforma a ideia dele em um jogo em que a trapaça não é possível.
Bem, precisamos de mais algumas definições que eu diria:
- o campo de jogo é um retângulo
n
* dem
quadrados com o mesmo tamanho. - um quadrado pode ter de 0 a 4 paredes, uma de cada lado.
- uma coroa vale 50 pontos.
- uma pepita de ouro vale 20 pontos.
- andar em um quadrado que já foi percorrido subtrai 1 ponto.
- os quadrados são marcados de forma a identificar com que frequência o jogador andou (0, 1 ou 2 vezes)
- o jogador pode andar em 4 direções, exceto se houver uma parede.
- Dispositivo de entrada pode ser qualquer coisa. Por favor, considere o suporte ao teclado.
- O labirinto deve ser solucionável. Ou seja, deve ser possível alcançar o gancho desde o ponto inicial e deve ser possível coletar todos os objetos de valor (mesmo que isso não resulte na maior pontuação possível).
- Se o jogador ficar preso, o jogo termina.
- O jogador não deve morrer caindo do tabuleiro. Você pode colocar uma parede ao redor do labirinto completo ou envolver as bordas, o que quiser.
- o programa recebe um argumento da palavra (0-65535) como entrada. Esta é a semente do gerador de números aleatórios. Chamar o programa com a mesma semente novamente resulta no mesmo labirinto.
Bônus:
- calcule o máximo de pontos que podem ser coletados. Considere que, devido a -1 pontos, pode ser melhor não coletar todos os itens.
- Mostre a melhor solução (a maneira mais curta de obter o máximo de pontos)
As regras
Este é um concurso de popularidade, pois quero poder ler e entender o código e talvez me adaptar às novas idéias do meu filho. Desculpe, codifique os jogadores, talvez você queira criar uma cópia desta pergunta com regras mais adequadas para jogar golfe, por exemplo, uma versão do console com todos os caracteres definidos.
O jogo mais popular em 3 de maio se tornará a resposta aceita. E, ei, por que não publicá-lo em uma loja de aplicativos?
fonte
Respostas:
Javascript
Trabalho em progresso. Infelizmente, o labirinto nem sempre é solucionável - o limite de retrocesso é o verdadeiro obstáculo.
Edit 1 Cosmetic
Edit 2 Melhor jogabilidade, mas o grande problema ainda está lá
fonte
Java
Eu nunca reclamei sobre GolfScript ou CJam, mas aqui está uma resposta em Java para você. Este foi um desafio realmente agradável. ;)
O processo de criação do labirinto real usa o algoritmo de busca em profundidade , mas com uma abordagem iterativa. Aqui está como isso funciona.
Começamos com uma matriz de
int
valores 2D , sendo cada elemento um -1. Um elemento aleatório com índices pares é escolhido e seu valor se torna 0:Em seguida, o programa entra em um loop, verificando as células disponíveis até atingir um estado em que não há células disponíveis. Isso pode acontecer várias vezes e é quando começa a voltar atrás. Nesse momento, todos os 0s encontrados se tornam 1s. Também durante esse período é quando determina se uma saída deve ser colocada nesse local. Portanto, no final de tudo, a matriz pode ficar assim:
Quando há um número predeterminado de 1s ou 0s em determinados pontos da matriz, o loop sai. Então, usando a matriz, o labirinto resultante é desenhado:
É fácil ver que os -1s na matriz representam paredes e os 0s e 1s são corredores. Os itens são distribuídos aleatoriamente por todo o labirinto. A elipse vermelha é o "jogador" que você controla.
O labirinto é envolvido em um painel de rolagem por conveniência, para que, se o tamanho exceder o tamanho máximo do quadro, você possa rolar para ver o resto do labirinto.
Eu diria que o único problema com isso é como é realizada a verificação do final do jogo. Pensei em várias maneiras de fazê-lo, mas acabei recorrendo a codificar tudo. Estou aberto a sugestões de como isso pode ser feito.
fonte
MazeMaker.java:168: error: cannot find symbol printArray(); ^ symbol: method printArray() location: class MazeMaker
printArray
usado para gerar a matriz, mas a excluí e esqueci de remover a chamada do método.Python
Sei que estou atrasado para a festa, mas aqui está minha opinião sobre esse desafio. Eu fui baseado em texto, pois ainda não aprendi a jogar pygame. É Python 3. Altere a entrada para raw_input e também deve funcionar em python2.
O gancho (saída) é representado por "J". "W" são coroas (50). "G" são pepitas de ouro (20). O jogador é "O". Eu experimentei usar "P" para o player, mas achei "O" mais fácil de identificar.
Usei a primeira geração de labirinto de profundidade padrão e depois adicionei o ouro, as coroas, o gancho e a posição atual do jogador. Não implementei os critérios para que todo o tesouro possa ser obtido.
fonte