Vamos jogar um jogo de Meta jogo da velha!
Este é um torneio do rei da colina do Meta jogo da velha. As regras do Meta jogo da velha são as seguintes:
Todas as regras regulares do jogo da velha aplicam-se.
Existem nove quadros organizados para formar um quadro principal. Igual a:
0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8
placa 0 refere-se à placa superior esquerda, placa 1 refere-se à placa intermediária superior ... assim
0|1|2 ----- 3|4|5 ----- 6|7|8
Se eu disser o quadro 3, lado a lado 4, significa o lado central do quadro no meio esquerdo.
Você só pode mover-se em uma das placas menores.
Se você ganhar uma das tábuas menores, essa tábua inteira será considerada como sua peça.
Se um dos quadros for preenchido antes que um dos bot o vença, será considerado como ninguém.
Quem vencer o quadro principal vence!
No entanto, há uma reviravolta importante. Digamos que eu entre no tabuleiro 7, bloco 2. Isso significa que, no seu turno, você só pode entrar no tabuleiro 2. Então, digamos que você entre no tabuleiro 2, bloco 5. Agora, no meu turno, só posso participar do tabuleiro 5. Digamos que o quadro 1 esteja cheio. (Não há mais vagas sobrando, ou um de nós já venceu o quadro 1) Agora, se eu entrar no quadro 5, lado 1, você poderá entrar em qualquer um dos quadros que desejar.
Essas regras podem ser consideradas como:
- Você deve jogar no tabuleiro correspondente à posição jogada pelo jogador anterior.
- Se X jogar no tabuleiro 2, peça 5; O deve jogar no tabuleiro 5
- Se o quadro alvo estiver cheio (um empate) ou já tiver um vencedor, a próxima jogada é irrestrita.
- Um tabuleiro com um vencedor não pode ser jogado, mesmo em uma jogada sem restrições.
Se isso é um pouco confuso, você pode tentar online aqui.(certifique-se de alternar de "vitórias no primeiro bloco" para "3 blocos seguidos")
Agora, aqui estão as regras do desafio.
Você deve escrever um bot que jogue este jogo.
O bot 1 é Xs e é o primeiro. Ele será chamado com estes argumentos de linha de comando (sem os itens entre parênteses):
X (whose turn) --------- (board 0) --------- (board 1) --------- (board 2) --------- (board 3) --------- (board 4) --------- (board 5) --------- (board 6) --------- (board 7) --------- (board 8) --------- (master board) xx (last move)
O primeiro caractere representa quem é o bot. Nesse caso, o bot 1 é reproduzido como X. As próximas 9 linhas referem-se às 9 placas. A 11ª linha refere-se ao quadro principal. O "xx" é a última jogada. Agora, o bot1 deve imprimir dois números entre 0 e 8. O número 1 é o quadro em que seu bot está se movendo e o número 2 é o bloco no referido quadro. O controlador acompanhará esse movimento. Digamos que o bot 1 imprima 38. Agora o quadro ficará assim:
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
e bot2 serão chamados com estes argumentos:
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
Agora o bot 2 deve se mover no quadro 8 (porque o bot1 colocou um x no bloco 3). Digamos que bot2 imprime 84. Agora o quadro se parece com isso.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
agora o bot1 será chamado com estes argumentos:
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
Agora o bot1 deve se mover no quadro 4. No entanto, o bot1 é um bot pequeno e impertinente e decide se mover no quadro 3. Imprime '30'. O conselho não muda nada. O bot principal acompanha isso. Agora o bot2 será chamado com estes argumentos:
O --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- xx
Agora, o bot 2 pode ir aonde quiser (exceto 38 e 84, é claro). Isso continua até que alguém vença três das placas-mãe seguidas. Depois, há uma segunda luta em que bot2 é X e começa primeiro.
Isso se repete até que cada bot jogue todos os outros bot.
Pontuação
A pontuação funciona assim:
O vencedor de cada partida ganha 100 + number of open spots
pontos. Dessa forma, é mais valioso se o seu bot vencer rapidamente. Toda vez que seu bot faz um movimento inválido, ele perde 1 ponto. Se, após 250 rodadas, nenhum bot vencer, cada bot perde 10 pontos e passamos à próxima rodada.
Tudo será colocado em um diretório que contém
O bot do controlador. Este é um programa C ++ que eu escrevi. Você pode olhar o código-fonte bot do controlador aqui. Informe-me se vir algo que não está certo no controlador.
Um arquivo de texto chamado
instructions.txt
Este arquivo será mais ou menos assim:[Total number of bots that are competing] [bot1Name] [bot1 command to run] [bot2Name] [bot2 command to run] ...
Uma pasta para cada bot. Esta pasta conterá seu programa (seja um script ou um binário) e um arquivo de texto chamado
data.txt
que seu bot possa ler e gravar o que quiser.
Especificações técnicas e esclarecimentos de regras
Qualquer bot que tentar ler / escrever algo de qualquer lugar que não esteja dentro da pasta será expulso do jogo.
Seu programa deve ser capaz de executar em um macbook executando o Yosemite. As linguagens atualmente suportadas são python (2.7.9 e 3.4.2), C / C ++, objetivo-C, perl, ruby, bash, PHP, Java, C #, javascript e Haskell. Há muito mais, mas estes são apenas os que consigo pensar agora. Adicionarei mais conforme o tempo passa. Se você quiser competir em um idioma específico, envie uma mensagem ou comentário e eu o adicionarei à lista, se possível.
Se um tabuleiro for vencido, mas ainda houver espaço, você ainda não poderá entrar em um dos espaços abertos.
Observe que o diretório de trabalho do seu envio será o diretório que contém o controlador e todos os outros bots, NÃO o diretório que contém o seu bot.
Por favor, publique junto com o código do seu controlador o comando correto para compilar (se aplicável) e executar seu bot. A maior parte disso será feita no terminal OS X, que é bastante semelhante a um terminal linux.
Os robôs devem ser concluídos em menos de um segundo. Infelizmente, não sou suficientemente competente para adicionar um timer ao bot do controlador. No entanto, cronometrarei manualmente os bots.
Resultados!
Bem, eu estava certa. Eu esqueci de fazer o bot do controlador verificar se o masterBoard está cheio. Se o masterBoard estiver cheio, TODOS os movimentos são inválidos, mas continuam a chamar os bots, e é provavelmente por isso que houve tantos movimentos inválidos. Eu o consertei agora. Aqui estão os resultados oficiais com a versão mais atual de todos os bots.
Bot 1, goodRandBot, has 1 wins and made 0 illegal moves, for a total of 133 points.
Bot 2, naiveBot, has 3 wins and made 48 illegal moves, for a total of 361 points.
Bot 3, depthBot, has 5 wins and made 0 illegal moves, for a total of 664 points.
Bot 4, middleBot, has 1 wins and made 20 illegal moves, for a total of 114 points.
With 4 bots, This program took 477.471 seconds to finish.
Depth Bot é o atual campeão! Pelo menos por enquanto.
fonte
XXX000---
transmitido o vencedor de uma placa ? ou é que 'ninguém consegue, apesar de O ter vencido primeiro'?Respostas:
Python 2.7, profundidade
Uma implementação de poda alfa-beta sem nada demais. Ele tenta ordenar movimentos de uma maneira menos ingênua para maximizar as eliminações alfa-beta. Provavelmente tentarei acelerar, mas sinceramente não sei o quanto o Python pode ser competitivo se se trata de uma questão de velocidade.
Para executá-lo, você pode simplesmente fazê-lo
python Depth.py <input>
, embora eu sugira o uso,pypy
pois ele acelera notavelmente.Além disso, não sei o quão rápido é o seu sistema, mas você pode modificar o primeiro argumento
DepthPlayer
no final para que seja mais alto se ele ainda puder ser executado no tempo especificado (no meu sistema, ele concluiu quase todas as coisas muito rapidamente com uma profundidade de 7 ou 8, mas houve alguns casos que estavam próximos ou acima de um segundo, então eu o configurei em 6 para ser seguro).fonte
sys.argv
não retorna uma string separada por nova linha. Ele fornece uma lista de seqüências de caracteres neste formato:['Depth.py', 'X', '---------', '---------', ...]
Eu a corrigi editando as duas últimas linhas,command = '\n'.join(sys.argv[1:]) print DepthPlayer(6).run(command)
espero que você não se importe.Java, ingênuo
Se possível, vence. Caso contrário, impede que um oponente vença.
fonte
Naive.class
em um diretório nomeadonaiveBot
dentro do diretório principal.java Naive <args>
comando, assumindo que as variáveis de ambiente incluem o ponteiro paraC:\Program Files\Java\jdk1.8.0\bin
. Eu espero que isso ajude.java -classpath naiveBot Naive
;);legalAnywhere
for verdade, seu envio falhará porque você tenta usar os painéis que já foram ganhos por um jogador.Python 2, MiddleBot
MiddleBot gosta do meio. Antes que o jogo central (4) seja vencido, ele tentará agarrar o quadrado central de tantos jogos quanto possível, forçando o oponente de volta ao jogo do meio repetidas vezes.
Uma vez feito isso, ele tenta ganhar todos os jogos que conseguir, ou apenas preenche o primeiro espaço disponível, se não (precisa trabalhar no seu jogo final, eu acho)
Para executá-lo,
python MiddleBot.py <input>
ele parece feliz em menos de um segundo para mim, então espero que seja para você tambémfonte
É melhor jogar meu próprio bot na mistura.
python 2, goodRandomBot
Este bot não se importa para onde se move, desde que seja uma jogada válida. Seleciona aleatoriamente todos os movimentos válidos e faz uma média de
0
movimentos inválidos.fonte