Programa Pac-Man
Configuração
Você joga como Pac-Man. Você deseja coletar pellets, frutas e pellets potentes antes de qualquer outra pessoa, evitando fantasmas.
Regras
- Todo Pac-Man válido estará em um único labirinto. O jogador com a maior pontuação acumulada após 10 jogos vencerá.
- Um jogo termina quando todos os Pac-Men estão mortos, todos os pellets desaparecem ou se passam 500 turnos
- Se um Pac-Man morre, ele continua a jogar como um fantasma
- Comer um pellet Power fará com que você fique invencível por 10 turnos e permite que você coma Ghosts
- Comer um fantasma teleportará o fantasma para um local aleatório
- Fantasmas não podem comer nada, exceto Pac-Men, e não recebem pontos
- Ao comer os seguintes itens como Pac-Man, você obterá os seguintes pontos:
- Pellet: 10
- Pelota de poder: 50
- Fruta: 100
- Fantasma: 200
O labirinto
Se houver n Pac-Men, em seguida, um labirinto de tamanho sqrt(n)*10
por sqrt(n)*10
será gerada usando o algoritmo de Prim (devido à sua baixo fator de rio), então trançado completamente, dando preferência a becos sem saída já existentes. Além disso, essa trança pode ser feita através das bordas, para que haja alguns caminhos de cima para baixo e da esquerda para a direita.
Haverá:
2n
Fantasmas4n
Power Pellets2n
Frutan
Pac-Men em locais onde os quadrados dos vizinhos conectados estão vazios.- Todos os pontos vazios restantes serão preenchidos com pellets
Portanto, um mapa inicial com 10 jogadores será mais ou menos assim (Ghosts = verde, Pellets = aqua, fruta = vermelho, Pac-Man = amarelo):
Entrada / Saída
No início do jogo , você receberá uma única linha de caracteres, representando as paredes em todos os quadrados do mapa. Para cada quadrado, começando com o canto superior esquerdo, movendo para a direita e passando para a próxima linha, você receberá um dígito hexadecimal representando a situação da parede:
0: No walls
1: North wall
2: East wall
3: East & North wall
4: South wall
5: South & North wall
6: South & East wall
7: Won't occur
8: West wall
9: West & North wall
A: West & East wall
B: Won't occur
C: West & South wall
D: Won't occur
E: Won't occur
F: Won't occur
Simplificando, Norte = 1, Leste = 2, Sul = 4 e Oeste = 8, somados.
Então, a cada turno , você receberá sua posição atual e os itens em sua linha de visão (se você é um Pac-Man. Todos os fantasmas recebem todos os quadrados de -5 a +5 de sua posição relativa). Sua linha de visão será baseada na direção em que você viajou no último turno. Se você viajou para o norte, receberá todos os quadrados diretamente ao norte, leste e oeste de você até que uma parede interrompa sua vista e um único quadrado noroeste e nordeste, se nenhuma parede interromper sua vista. Se você optar por não se mover, você receberá os quadrados nas 8 direções.
Para o visual, I
significa invisível, V
significa visível, P
significa Pac-Man (assumindo que o Pac-Man esteja voltado para o norte):
|I I|V|I|
|I V|V V|
|V V P|I|
|I I|I|I|
Cada quadrado será dado por uma coordenada e, em seguida, seu conteúdo. Seu conteúdo é representado pelos seguintes caracteres:
P
: 1 ou mais Pac-ManG
: 1 ou mais fantasmaso
: PelotaO
: Pelota do poderF
: Pedaço de frutaX
: Nada
Se houver um fantasma e mais alguma coisa em um quadrado, G
será retornado.
Portanto, se você estivesse no quadrado 23,70
, você acabou de se mudar para o norte, o quadrado acima de você é um beco sem saída e contém um pellet de energia, e você tem paredes em ambos os lados, sua entrada seria:
23,70X 22,70O
No seu quadrado atual, ele mostrará G
se você é um fantasma, P
se houver outro Pac-Man no seu quadrado, caso contrário, umX
Em seguida, você retornará os seguintes itens via STDOUT:
Um único caractere representando uma direção ( N
orth, E
ast, S
outh, W
est ou X
Stay).
Antes de passar em uma direção, você também pode passar em qualquer coordenada como x,y
e as paredes desse quadrado serão passadas de volta (como descrito acima)
O programa deve estar em execução contínua até que Q
seja transmitido a ele via STDIN. Os programas serão reiniciados para cada jogo.
Não é permitido acessar outras informações fora do que é transmitido ao STDIN (incluindo outros dados do Pac-Men ou os dados mantidos pelo programa host).
Se você não retornar um movimento dentro de 1000 ms, o programa será encerrado (executando na minha máquina Win8 bastante decente). Você terá 2 segundos para processar o layout inicial do labirinto quando for fornecido
O host será escrito em Python, e o código para testar seu bot está disponível.
Casos excepcionais
- Se vários Pac-Men terminarem no mesmo local, não obtenha o conteúdo do quadrado atual, a menos que exatamente 1 deles seja invencível; nesse caso, o invencível Pac-Man receberá o pellet.
- Um Pac-Man comido por um fantasma não será teleportado para outro lugar. Se dois Pac-Men estiverem em um quadrado e um for invencível, o fantasma será teleportado.
- Ser teleportado como um fantasma impede que você se mova por 1 turno. Ao jogar como um fantasma, você simplesmente terá sua vez ignorada
- Tentar mover-se através de uma parede será interpretado como "Permanecer"
Cada um dos fantasmas iniciais receberá um dos quatro traços de personalidade, conforme descrito aqui , com a seguinte modificação:
- Os erros descritos não serão duplicados
- Todos eles estarão ativos desde o início
- Eles são vulneráveis apenas ao jogador que comeu o pellet
- Eles mudarão indefinidamente de dispersão para perseguição, cada um com um número fixo de turnos antes da troca
- Ao mudar para perseguir, eles encontrarão o Pac-Man mais próximo a perseguir e perseguirão esse Pac-Man pela duração de sua perseguição. (Se houver um empate por proximidade, o Pac-Man será escolhido pseudo-aleatoriamente)
- Blinky não vai acelerar
- Inky escolherá o fantasma mais próximo para basear seus cálculos depois de mudar para perseguir.
- Clyde encontrará todos os jogadores a 8 quadrados de distância e seguirá o jogador mais distante.
- Todos os fantasmas, exceto Clyde, não terão como alvo um jogador a mais de 5 quadrados de distância
Aceitarei código compilável de um idioma padrão ou um .exe (com o código que o acompanha).
Dicas de programação
Você pode com o meu controlador. Você precisa colocar uma pasta / bots / your_bot_name / no mesmo diretório que o programa. Dentro da pasta, você precisa adicionar um command.txt contendo um comando para executar seu programa (ex python my_bot.py
:) e seu bot.
O código do controlador está no Github (código Python, requer Pygame se você quiser gráficos). Testado no Windows e Linux
PONTUAÇÃO
ghostbuster: 72,840 pontos
pathy: 54.570 pontos
míope: 50.820 pontos
evitarinteração: 23,580 pontos
físico: 18,330 pontos
randomwalk: 7.760 pontos
dumbpac: 4.880 pontos
fonte
Respostas:
GhostBuster - Python
Seleciona um ponto aleatório no mapa, usa o algoritmo A * para encontrar o melhor caminho a seguir. Quando chegar ao seu destino, ele escolherá um novo e continuará. Ele tentará evitar fantasmas, mas com o FOV limitado, ocasionalmente os encontrará. Evitará andar em locais já visitados.
Usa algum código de Sparr, obrigado pela lógica.
Windows 7, Visual Studios com ferramentas Python. Deve funcionar em caixas linux.
fonte
míope
Esse pac evita fantasmas adjacentes, a menos que ele possa comê-los, se move para frutas ou pellets adjacentes e caminha aleatoriamente como último recurso.
fonte
avoider
Evite todos os fantasmas como um pacman, e todos os pacmen quando um fantasma. Tenta evitar qualquer um de seu tipo, se possível, e evita girar 180, se possível.
fonte
Físico, Haskell
O físico Pac-Man acredita que a lei da gravitação universal de Newton pode ajudá-lo a vencer o jogo. Então ele apenas aplica a todos os outros objetos que ele conhece durante o jogo. Como o físico é velho e tem pouca memória, ele só consegue se lembrar das coisas em 5 rodadas. Hooooly, a memória ruim realmente o ajuda a marcar melhor.
Esta resposta tem dois arquivos:
Main.hs
, contém a parte interessante.Pacman.hs
, apenas um código chato para lidar com o protocolo. Você pode usá-lo para escrever sua própria solução haskell. Não contém código AI.Oh, espere, nós temos um
Makefile
também.Aqui vem eles:
Main.hs
Pacman.hs
Makefile
command.txt
fonte
Main' Expected
Pacman '" quando tento fazê-lo. Além disso, para executá-lo, preciso apenas fazê-lo ou há outro comando que preciso executar?physicist
executável. Editado e adicionadocommand.txt
, agora.physicist.hs
paraMain.hs
pode funcionar. Eu atualizei a resposta.dumbpac
Esse pac apenas se move aleatoriamente, sem levar em consideração o layout do labirinto, fantasmas ou outros fatores.
Perl:
Python:
fonte
Caminhada aleatória
esse pac caminha aleatoriamente, mas não nas paredes
fonte
Pathy, Python 3
Este bot usa muito o caminho para encontrar. Dada a posição inicial e a condição final, ele usa o BFS simples para encontrar o caminho mais curto. A localização do caminho é usada em:
command.txt
pathy.py
fonte
objects = [(tuple(map(int, x[:-1].split(',')))[::-1], x[-1]) for x in line.split(' ')]
lança um #ValueError: invalid literal for int() with base 10: '8o'