Upload
patricio-lima
View
291
Download
1
Embed Size (px)
Citation preview
Inteligência Artificial:
Relatório Final do Trabalho Prático
Patrício Ferreira: [ [email protected]]
Faculdade de Engenharia da Universidade do Porto
Departamento de Engenharia Electrotécnica e de Computadores
Rua Roberto Frias, s/n, 4200-465 Porto, Portugal
6 Junho 2010
Hexxagon Página 2
Resumo
Trabalho realizado no âmbito de cadeira de inteligência artificial, visa implementação de um
jogo de tabuleiro Hexxagon, em Prolog, com interface gráfica em java. Vai permitir três
formas de jogo:
Humano vs Humano
Humano vs Computador
Computador vs Computador
Objectivos
O trabalho tem como objectivo, dotar-nos de capacidade de programação em lógica e de
resoluções de problemas lógicos, e da aplicação da inteligência para fazer dotar o computador
de capacidades parecidas com as dos homens - o que faz o homem parecer inteligente.
Neste trabalho, foi implementado um jogo onde considerou-se três modos, sempre com dois
jogadores cada partida, que podem ser: humano contra humano, humano contra computador
ou computador contra computador.
O jogo em si é simples, tendo poucas limitações e regras, contudo a sua implementação
apresentou algum grau de dificuldade.
Primeiramente faram desenvolvidos as funções mais básicas como, as regras do movimento
das peças, as de visualização do tabuleiro, depois foi desenvolvida e aperfeiçoada os
principais módulos de inteligência.
O algoritmo minimax foi o principal módulo de inteligência para o jogo.
Hexxagon Página 3
Descrição do Problema
Este jogo de estratégia criado pela companhia Argo Games e publicado em 1993, é jogado
num tabuleiro hexagonal com 61 hexágonos onde 58 dessas são onde os jogadores podem
mover-se. Inicialmente cada jogador começa com 3 peças.
Sendo assim, para desenvolver este jogo em Prolog, é considerado um tabuleiro do jogo
como sendo um tabuleiro com 81 casas (nove casas por nove casas) onde 58 dessas casas
pode-se mover as peças. Onde as restantes só são utilizadas para facilitar a representação
matricial do tabuleiro.
Serão representados da seguinte forma:
Y \X 0 1 2 3 4 5 6 7 8
0
1
2
3
4
5
6
7
8
A tabela acima mostra como estará disposto o tabuleiro, onde as células amarelas são onde
pode-se mover as peças, as células brancas não fazem parte do espaço de movimento das
peças, e as células vermelhas e azuis são as posições iniciais das peças dos dois jogadores.
O jogo é para dois jogadores, sendo esses jogadores representados por utilizadores humanos,
ou pelo próprio computador.
O jogo pode começar desde que as peças estejam dispostas da seguinte forma mostrada na
figura abaixo.
Hexxagon Página 4
Fig. 1 Estado inicial do jogo.
Regras do jogo
O jogo desenrola-se em jogadas intercaladas pelos jogadores. Cada jogador na sua vez salta
uma peça que lhe pertença (da sua cor) para qualquer célula que esteja no máximo a distância
de duas células da origem com o intuito de se aproximar das peças do adversário, ficando a
distância de uma célula, quando isso acontecer a peça do adversário será sua e
consequentemente a cor da peça para a cor da sua peça.
O objectivo é terminar o jogo (quando ficar todo preenchido) com o maior número de peças.
O jogador não pode saltar para uma célula ocupada se não for possível fazer vizinhança com
as peças do adversário o jogador pode ainda saltar uma só casa e assim a peça duplica ficando
um na célula de origem e outra na célula de destino.
Hexxagon Página 5
Inicio do jogo
O tabuleiro é inicializado com 6 peças, sendo 3 peças para cada jogador. As peças são
distinguidas por cores.
O jogador que começa a jogada numa partida é escolhido aleatoriamente.
Objectivo do jogo
O objectivo final do jogo é ter no final, mais peças que o adversário.
Movimento das peças
No jogo pode-se saltar para qualquer célula, desde que esta esteja a menos de duas
casas e esteja vazia.
Sempre que salta para uma célula e na vizinhança contenha peças do adversário estas
transformam em peças do jogador.
O jogador pode mover as peças em todas as direcções, no tabuleiro.
Pode ainda fazer duplicar uma peça se esta saltar uma só casa.
Vencedor da partida
Ganha a partida o jogador que tiver mais peças no tabuleiro.
Hexxagon Página 6
Implementação do Jogo A implementação do jogo pode ser entendida em quatro etapas descritas em baixo. Desde a
construção do tabuleiro e a sua inicialização, à manipulação do mesmo, construção das
jogadas estratégias adoptadas para a implementação da parte de inteligência artificial.
Inicialização do Tabuleiro
Foi construída um tabuleiro de 9x9 com 58 campos onde as células adicionais, são
auxiliares. Em que cada jogador é-lhe atribuído 6 peças. Existe dois tipos de tabuleiro.
No inicio de cada partida o tipo de tabuleiro tal como o jogador que joga primeiro e
escolhida de forma aleatória pelo programa.
Em baixo segue-se a descrição dos principais predicados e exemplos de inicialização
do tabuleiro:
Predicados:
o table(T,N) – permite seleccionar uma dos tipos de tabuleiros existentes.
o Print_table(T) – imprime estado do tabuleiro T, em forma hexagonal.
Fig 1: Visualização do tabuleiro
Hexxagon Página 7
Manipulação do Tabuleiro
Foram criados predicados para manipular as peças na tabela. Tabela que é
representado por uma lista de listas, em Prolog.
Na base de factos contem as possíveis direcções de movimento das peças, que facilita
o movimento no tabuleiro. Para facilitar o movimento, a contagem dos pontos e
jogadas válidas, foram criadas predicados que contabiliza o número de vizinhos,e os
vizinhos dos vizinhos.
Predicados:
dir((X,Y),D):- devolve a direção unitária contida em D ex: dir((0,-1),n), na
direção norte(n), anda zero para direita e 1 para cima.
neighbours(P,X,Y,Table,Neig) – Dado um determinado jogador (P) as
coordenadas (X,Y) de uma peça e um tabuleiro (Table) é retornada em Neig um
vizinho(à uma célula de distancia).
neighbours_list(P,X,Y,Table,Neigs)- Dado um determinado
jogador (P) as coordenadas (X,Y) de uma peça e um tabuleiro (Table) é retornada em
Neigs todos os vizinhos(à uma célula de distancia).
Construção de Jogadas
Foram criadas um conjunto de predicados capazes de ler as coordenadas das peças no
tabuleiro, avaliar jogadas possíveis e efectuar jogadas com as melhores peças.
Predicados:
o valid_mov(Xi,Yi,Xf,Yf,T,P):- Verifica se um direcção é válida,
isto é, se é possivel fazer a jogada de dadas coordenadas sem violar as regras
de movimento.
o possible_jumps(X,Y,Table,Jumps) - Dado um determinado
jogador (P) as coordenadas (X,Y) de uma peça e um tabuleiro (Table) é
retornada o conjunto de coordenadas (Jumps) onde é possivel mover.
o play(X,Y,T,P,Xf,Yf,TF):- verifica se uma jogada é valida, sendo
valida realiza a jogada, onde T é o estado corrente, e TF é o estado do tabuleiro
depois da jogada.
o change(Table,X,Y,P,TF):- modifica os vizinhos com coordenadas
X,Y como peças do jogador P.
Hexxagon Página 8
Módulo de Inteligência
Para os tipos de jogo Computador Vs Computador e Humano Vs Computador foram
criados predicados com o objectivo de fazer jogadas mais inteligentes. Decisões que
são tomadas de acordo com o numero de pontos que são feitas pelo jogador e pelo
adversário.
o Minimax
Para resolver o problema das decisões criou-se predicados que usam o algoritmo
Minimax. Onde as possíveis decisões do jogador e do adversário são organizadas e
dispostas numa arvore por ordem de profundidade, onde tentará maximizar os pontos
das jogadas do jogador (computador) e minimizar os pontos da jogada do adversário.
A figura abaixo mostra como serão dispostas na árvore, onde os valores numéricos são
os pontos das respectivas jogadas.
Fig 2: Disposição das possíveis jogadas do Jogador e do adversário.
Os pontos são contabilizados de acordo com a quantidade de peças de cada jogador.
Predicados:
o minimax(EST,Jog,Prof,Valor,Jogada):- Predicado
principal do jogo, que dado um estado actual e precisão da
decisão(profundidade), ela escolhe a melhor jogada.
o max_value(ESTS,Jog,Prof,VT,JT,Valor,Jogada):-
predicado usado pelo minimax, que dado um conjunto de estados ela
escolhe a melhor, ou seja a jogada com maior valor.
Hexxagon Página 9
o min_value([E|L],Jog,Prof,VT,JT,Valor,Jogada):-
similar ao max_value, mas escolhe o menor valor.
o choose_max(V1,J1,V2,J2,VB,JB):- dado duas jogadas ela
retorna a melhor(com maior valor) em JB.
o choose_min(V1,J1,V2,J2,VB,JB):- dado duas jogadas ela
retorna a melhor(com menor valor) em JB.
o evaluate(EST,P,V):- é a função de avaliação da arvore
minimax, quando esta atinge a profundidade desejada.
o one_move(T,P,X,Y):- dado o estado do tabuleiro ela retorna um
movimento possível da peça P.
O módulo de inteligência foi testado de duas formas, primeiro colocando modo Computador
Vs Computador com o mesmo nível de inteligência, e depois um com nível de inteligência
mais baixo ou que joga aleatoriamente.
Hexxagon Página 10
Análise de Resultados O jogo foi testado e todos os requisitos foram satisfeitos, excepto a interface gráfica.
Para cada modo de jogo fizeram-se os seguintes testes.
Humano Vs Humano
Para testar o este modo, põe-se dois adversários quaisquer a jogar.
Em baixo mostra-se figuras da execução do modo Humano Vs Humano
Fig 3:Inicio Jogo Humano Vs Humano
Hexxagon Página 11
Fig 4: Fim do jogo Humano Vs Humano.
Humano Vs Computador
Para testar este modo primeiro testou-se o algoritmo minimax escolhendo
coordenadas aleatórias, e tabelas aleatórias, só depois foi testado no jogo.
É notável que em diferentes níveis de dificuldade (profundidade), a dificuldade
das jogadas é diferente.
Em baixo é mostrado imagens do modo.
Hexxagon Página 12
Fig 5: Inicio de jogo Humano Vs Computador
Hexxagon Página 13
Fig 6: Fim de jogo Humano Vs Computador
Computador Vs Computador
O modo computador Vs Computador foi testado de duas formas:
Primeiro os dois jogadores têm o mesmo nível de inteligência, onde as vezes
ganha umas as vezes ganha outro, dado tem o mesmo conhecimento.
A segunda os dois jogadores tem inteligência diferente, onde um joga
aleatoriamente (sem inteligência) e o outro joga prevendo as melhores jogadas,
Como consequência, o segundo sempre ganha o jogo.
Em baixo são mostrados imagens deste modo.
Hexxagon Página 14
Fig 7: Fim de Jogo Computador Vs Computador
Ambiente de desenvolvimento
O jogo foi feito totalmente em linguagem Prolog, onde foi utilizadas as
ferramentas de edição de texto do Swi-Prolog . Os compiladores utilizados
foram os da Sicstus Prolog e da Swi-Prolog. O programa também corre em
ambiente da Swi-Prolog e da Sicstus. O Jogo pode correr tanto em Microsoft
Windows SO como em Linux SO.
Hexxagon Página 15
Conclusões
No trabalho feito, foram implementadas os seguintes requisitos:
Jogo Humano Vs Humano
Jogo Humano Vs Computador
Jogo Computador Vs Computador com diferentes níveis de conhecimento.
No módulo de inteligência utilizou-se o algoritmo Minimax para prever as melhores jogadas,
algoritmo que apresenta algumas desvantagens:
Utiliza muitos estados para prever as melhores jogadas, o que o torna pouco eficiente.
Existem estados que poderiam ser descartados mas são avaliados. Uma alternativa a isso é a
utilização do Minimax cortes alfa-beta, que descarta essas possibilidades, tornando o minimax
mais eficiente.
Uma vantagem do minimax em relação a outros algoritmos de pesquisa, é a facilidade na
programação do mesmo.
A realização da interface gráfica e melhoramento do algoritmo Minimax são perspectivas,
caso tivesse mais tempo.
Referências Bibliográficas
http://kidrocket.org/game_hexxagon.php
http://paginas.fe.up.pt/~eol/IA/0910/TRABALHOS/pesqadv_hexxagon.html
http://www.mobygames.com/game/dos/hexxagon
http://www.springfrog.com/games/hexxagon/
http://www.mellekoning.nl/files/hexxagon/hexxagon.php
Software:
Sicstus Prolog
Swi-Prolog Editor
Hexxagon Página 16
Anexos
Manual do Utilizador
O programa corre nas consolas Prolog da Sicstus e da Swi-Prolog.
Em seguida são mostrados os passos desde a compilação até a execução do jogo.
Compilação
Para compilar basta numa das consolas consultar o ficheiro do jogo
Hexxagon.pl da seguinte forma.
Fig 8: Compilar o ficheiro
Ou na consola escrever “consult („Caminho para o ficheiro‟).
Fig 9: Compilar o ficheiro
Hexxagon Página 17
Correr o Jogo
Para correr basta na consola escrever “hexxagon.” ou “begin.”
Aparecerá o menu na imagem abaixo onde poderá escolher uma das 5 opções.
1. Computador Vs Computador
2. Computador mais Inteligente Vs Computador menos inteligente
3. Humano Vs Humano
4. Humano Vs Computador
5. Sair
As escolhas são feitas com os números do teclado de 1 à 5
Fig 10: Inicio do Jogo escolha do modo
Caso escolhe a opção 1 ou seja Computador Vs Computador os estados são
alternados pressionando na tecla ENTER. Na consola é pré-visualizada o
tabuleiro as coordenadas das jogadas dos dois jogadores, e a respectiva
pontuação.
Em baixo é apresentado a ilustração do descrito acima.
Hexxagon Página 18
Fig 11: Representação da Jogada
Para o modo Computador inteligente Vs Computador menos Inteligente é
similar ao descrito acima.
Já no caso do Humano Vs Humano (opção 3) é um pouco diferente, pois pede
as coordenadas de origem e de destino das jogadas.
Sendo a apresentação do tabuleiro e das pontuações são feitas da mesma forma
em todos os modos.
No modo Humano Vs Computador, quando joga o computador, a jogada é feita
automática, a na vez do humano é pedido as coordenadas.
Hexxagon Página 19
Fig 12: Inserção das coordenadas no Modo Humano Vs Computador
O jogo termina quando todos os campos tiverem preenchidos ou quando já não
houver mais peças de um dos jogadores, e é mostrado o vencedor.
Fig 13: Fim de jogada.
Hexxagon Página 20
Exemplo de Execução
Computador Vs Computador
Inicio do jogo.
Fig 14: Inicio do Jogo, Escolha de opção de jogo.
Hexxagon Página 21
Fig 15: Primeira Jogada
Hexxagon Página 22
Fig 16: Segunda Jogada
Hexxagon Página 23
Fig 17: Jogada de 0-8 para 1-7
Hexxagon Página 24
Fig 18: Computador 1 17 pontos, Computador 2 18 pontos
Hexxagon Página 25
Fig 19: Joga Computador 1
Hexxagon Página 26
Fig 20: Penultima Jogada
Hexxagon Página 27
Fig 21: Ultima Jogada, Ganha o computador 2