Gomoku ou Five in a row é um jogo de tabuleiro jogado por dois jogadores em uma grade de x com pedras em preto e branco. Quem conseguir colocar pedras seguidas (horizontal, vertical ou diagonal) vence o jogo.5
Regras
Neste KoTH, jogaremos a regra Swap2, o que significa que um jogo consiste em duas fases: na fase inicial, os dois jogadores determinam quem vai primeiro / quem joga de preto; depois disso, eles colocam uma pedra a cada rodada começando com o jogador. quem escolheu preto.
Fase inicial
Sejam os jogadores A e B e A deve abrir o jogo:
- A coloca duas pedras pretas e uma branca no quadro
- B pode escolher um dos três seguintes movimentos:
- o jogador B decide jogar preto: a fase inicial acabou
- o jogador B decide colocar uma pedra branca e joga em branco: a fase inicial acabou
- O jogador B decide jogar uma pedra preta e uma branca: A escolhe a cor
Fase do jogo
Cada jogador coloca uma pedra da sua cor no tabuleiro, começando com o jogador que joga preto, e continua até que não haja mais espaços livres para jogar (nesse caso, é um empate) ou um jogador consegue jogar pedras em um linha (nesse caso, o jogador vence).
Uma linha significa horizontal, vertical ou diagonal. Uma vitória é uma vitória - não importa se o jogador conseguiu marcar mais de uma linha.
Regras do jogo KoTH
- cada jogador joga contra o outro jogador duas vezes:
- inicialmente será decidido aleatoriamente quem vai primeiro
- no próximo jogo, o jogador que jogou por último vai primeiro
- uma vitória vale 2 pontos, um empate 1 e uma perda 0
- o objetivo é marcar o máximo de pontos possível
Seu bot
Para tornar esse desafio acessível para o maior número possível de idiomas, a entrada / saída será via stdin / stdout (baseado em linha). O programa juiz julgará seu programa imprimindo uma linha no stdin do seu bot e ele imprimirá uma linha no stdout .
Depois de receber uma EXIT
mensagem, você receberá meio segundo para terminar de gravar os arquivos antes que o juiz encerre o processo.
Aleatoriedade
Para tornar os torneios verificáveis, o juiz usa a randomização semeada e seu bot também deve, pelo mesmo motivo. O bot receberá uma semente via argumento da linha de comando que ele deve usar; consulte a próxima seção.
Argumentos
O bot recebe dois argumentos de linha de comando:
- nome do oponente
- semente por acaso
Estado do usuário
Como seu programa sempre será iniciado de novo para cada jogo, você precisará usar arquivos para manter as informações que deseja manter. Você tem permissão para ler / gravar qualquer arquivo ou criar / remover subpastas em seu diretório atual. Você não tem permissão para acessar nenhum arquivo em nenhum diretório pai!
Formato de entrada / saída
BOARD
denotará uma lista das pedras de corrente, só lista as posições onde uma pedra é colocado e cada entrada vai ser da forma ((X,Y),COLOR)
em que X
e Y
será um número inteiro no intervalo e será ou (preto) ou ( branco).COLOR
"B"
"W"
Além disso, SP
denota um único espaço, XY
uma tupla (X,Y)
de dois números inteiros, cada um no intervalo e indica uma escolha.|
Na fase inicial, existem três tipos diferentes de mensagens:
Prompt (judge) -> Answer (bot)
"A" SP "[]" -> XY XY XY
"B" SP BOARD -> "B" | "W" SP XY | XY XY
"C" SP BOARD -> "B" | "W"
- A primeira mensagem pede três tuplas, as duas primeiras serão as posições das pedras negras e a terceira a posição das brancas.
- A segunda mensagem pede:
"B"
-> escolha preto"W" SP XY
-> escolha branco e coloque uma pedra branca emXY
XY XY
-> coloque duas pedras (uma preta e a segunda branca)
- O último pergunta apenas qual a cor que você deseja tocar
Depois disso, o jogo regular começará e as mensagens se tornarão muito mais simples
N BOARD -> XY
onde N
é o número da rodada (começando com ) e será a posição em que você coloca uma pedra.XY
Há uma mensagem adicional que não espera uma resposta
"EXIT" SP NAME | "EXIT TIE"
onde NAME
é o nome do bot que ganhou. A segunda mensagem será enviada se o jogo terminar devido a ninguém ganhar e a não haver mais espaços livres para colocar pedras (isso implica que seu bot não pode ser nomeado TIE
).
Formatação
Como as mensagens do bot podem ser decodificadas sem espaços, todos os espaços serão ignorados (por exemplo, (0 , 0) (0,12)
é tratado da mesma forma que (0,0)(0,12)
). As mensagens do juiz contêm apenas um espaço para separar seções diferentes (ou seja, conforme observado acima SP
), permitindo que você divida a linha em espaços.
Qualquer resposta inválida resultará na perda dessa rodada (você ainda receberá uma EXIT
mensagem). Consulte as regras.
Exemplo
Aqui estão alguns exemplos de mensagens reais:
A []
B [((0,0),"B"),((0,1),"W"),((14,14),"B")]
1 [((0,0),"B"),((0,1),"W"),((1,0),"B"),((1,1),"W"),((14,14),"B")]
Juiz
Você pode encontrar o programa do juiz aqui : Para adicionar um bot a ele, simplesmente crie uma nova pasta na bots
pasta, coloque seus arquivos lá e adicione um arquivo meta
contendo nome , comando , argumentos e um sinalizador 0/1 (desativar / ativar stderr ) cada em uma linha separada.
Para executar um torneio, basta executar ./gomoku
e depurar uma única corrida de bot ./gomoku -d BOT
.
Nota: Você pode encontrar mais informações sobre como configurar e usar o juiz no repositório do Github. Existem também três exemplos de bots ( Haskell , Python e JavaScript ).
Regras
- em cada mudança de um bot * o torneio será executado novamente e o jogador com mais pontos ganha (o desempate é o primeiro envio)
- você pode enviar mais de um bot, desde que eles não adotem uma estratégia comum
- você não tem permissão para tocar em arquivos fora do seu diretório (por exemplo, manipular os arquivos de outros jogadores)
- se o seu bot travar ou enviar uma resposta inválida, o jogo atual será encerrado e você perderá a rodada
- embora o juiz (atualmente) não imponha um limite de tempo por rodada, é aconselhável manter o tempo gasto baixo, pois seria inviável testar todos os envios **
- abusar de bugs no programa do juiz conta como brecha
* Você é incentivado a usar o Github para enviar seu bot separadamente diretamente no bots
diretório (e potencialmente modificar util.sh
)!
** Caso se torne um problema, você será notificado, diria que qualquer coisa abaixo de 500ms (isso é muito!) Deve ficar bem por enquanto.
Bate-papo
Se você tiver dúvidas ou quiser falar sobre esse KoTH, sinta-se à vontade para participar do bate - papo !
Respostas:
KaitoBot
Ele usa uma implementação muito grosseira dos princípios MiniMax. A profundidade da pesquisa também é muito baixa, porque, caso contrário, leva muito tempo.
Pode editar para melhorar mais tarde.
Ele também tenta jogar preto, se possível, porque a Wikipedia parece dizer que o preto tem uma vantagem.
Eu nunca joguei Gomoku, então montei as três primeiras pedras aleatoriamente por falta de uma idéia melhor.
EDITAS: Alterou a semente dinamicamente porque, caso contrário, quando as sementes excederam 2 ^ 52, o javascript não conseguiu lidar com o incremento corretamente
fonte