Kit para executar partidas de Othello e Jogo da Velha invertido (Tic-Tac-Toe Misere) e implementar algoritmos de busca com adversário.
O kit contém os seguintes arquivos (todos os __init__.py
estao omitidos):
kit_games
├── server.py
├── server_tui.py
├── test_mcts.py <-- teste (muito basico) do seu MCTS
├── test_minimax_tttm.py <-- teste da poda alfa-beta no tic-tac-toe misere
├── test_othello_evaluations.py <-- teste das funcoes de avaliacao do othello p/ a poda alfa-beta
├── test_pruning.py <-- teste da poda alfa-beta em um jogo simplificado
└── advsearch
├── othello
| ├── board.py <-- encapsula o tabuleiro do othello
| └── gamestate.py <-- encapsula um estado do othello (config. do tabuleiro e cor que joga)
├── tttm
| ├── board.py <-- encapsula o tabuleiro do tic-tac-toe misere
| └── gamestate.py <-- encapsula um estado do tic-tac-toe-misere (config. do tabuleiro e cor que joga)
├── randomplayer
| └── agent.py <-- agente que joga aleatoriamente
├── humanplayer
| └── agent.py <-- agente para um humano jogar
├── timer.py <-- funcoes auxiliares de temporizacao
└── your_agent <-- renomeie este diretorio c/ o nome do seu agente
├── mcts.py <-- implemente o algoritmo MCTS aqui
├── minimax.py <-- implemente a poda alfa-beta aqui
├── othello_minimax_count.py <-- chame seu minimax com a heuristica de contagem
├── othello_minimax_mask.py <-- chame seu minimax com a heuristica posicional
├── othello_minimax_custom.py <-- chame seu minimax com uma heuristica customizada
├── tournament_agent.py <-- agente que vai jogar o torneio de othello
├── tttm_minimax.py <-- chame seu minimax sem limite de profundidade aqui
└── [vc pode adicionar outros arquivos e subdiretorios aqui]
O servidor foi testado em uma máquina GNU/Linux com o interpretador python 3.9.7.
Outras versões do interpretador python ou sistema operacional podem funcionar, mas não foram testados.
Para iniciar uma partida, digite no terminal:
python server.py game player1 player 2 [-h] [-d delay] [-p pace] [-o output-file] [-l log-history]
Nos parâmetros, game é o jogo a ser jogado (othello ou tttm para tic-tac-toe misere) 'player(1 ou 2)' são o caminhos dentro de advsearch
onde estão implementados os make_move dos jogadores.
Os argumentos entre colchetes são opcionais, seu significado é descrito a seguir:
-h, --help Mensagem de ajuda
-d delay, --delay delay
Tempo alocado para os jogadores realizarem a jogada (default=5s)
-p pace, --pace pace
Tempo mínimo que o servidor espera para processar a jogada (para poder ver partidas muito
rapidas sem se perder no terminal)
-l log-history, --log-history log-history
Arquivo para o log do jogo (default=history.txt)
-o output-file, --output-file output-file
Arquivo de saida com os detalhes do jogo (inclui historico)
O jogador 'random' se localiza em advsearch/randomplayer/agent.py
. Para jogar uma partida com ele,
basta substituir player1 ou 2 por esse caminho. Como exemplo, inicie
uma partida random vs. random de othello para ver o servidor funcionando:
python othello server.py advsearch/randomplayer/agent.py advsearch/randomplayer/agent.py -d 1 -p 0.3
O delay pode ser de 1 segundo porque o jogador random é muito rápido (e muito incompetente). O passo é de 0.3 segundos para acompanhar o progresso da partida (pode acelerar ou reduzir conforme a necessidade).
O jogador 'human' se localiza em advsearch/humanplayer/agent.py
. Você pode utilizar este player para jogar você mesmo e testar suas habilidades contra outro agente (inclusive o que você está construindo nesse trabalho).
Para jogar com ele, utilize o mesmo comando acima, trocando o player1 ou 2 por advsearch/humanplayer/agent.py
. Você terá o limite de 1 minuto para pensar na sua jogada. Digite as coorenadas da ação na ordem <coluna> <linha>
.
Iniciando pelo primeiro jogador, que jogará com as peças pretas, o servidor chama a função make_move(state)
do seu agente. A função recebe state
, um objeto da classe GameState
que contém um tabuleiro (objeto da classe Board
e o jogador a fazer a jogada (um caractere) (B
para as pretas ou W
para as brancas). Para os detalhes, veja gamestate.py
e board.py
de cada jogo.
O servidor então espera o delay e recebe a tupla (x,y) com coluna e linha com a jogada do jogador. O servidor processa a jogada, exibe o novo estado no terminal e passa a vez para o próximo jogador, repetindo esse ciclo até o fim do jogo.
No fim do jogo, o servidor exibe a pontuação de cada jogador e cria um arquivo results.xml
.
com todas as jogadas tentadas pelos jogadores (inclusive as ilegais). Um arquivo history.txt
também contém as jogadas, e esse é criado mesmo que a partida seja interrompida no meio (e.g. crash de um agente).
- O servidor checa a legalidade das jogadas antes de efetivá-las. A vez é devolvida para o jogador que tentou a jogada ilegal
- Jogadas ilegais demais resultam em desqualificação.
- O jogador 'random' apenas sorteia uma jogada entre as válidas no estado recebido.
- O jogador 'human' verifica a legalidade da jogada antes de enviá-la ao servidor.
- Em caso de problemas com o servidor, reporte via moodle ou email.
ISSO ABAIXO AINDA NAO FUNCIONA:
Para ver o tabuleiro e as peças com cores, instale a biblioteca pytermgui
(por exemplo, com pip install pytermgui
) e execute o server_tui.py
ao invés do server.py
.