Jogo King
Relat´
orio da Melhoria do Trabalho
Inteligˆencia Artificial
Tiago Fonseca, ei02100
19 de Julho de 2005
Resumo
Conte´
udo
1 Introdu¸c˜ao 3 1.1 Objectivo . . . 3 1.2 Motiva¸c˜ao . . . 3 2 Descri¸c˜ao 4 2.1 Regras do King . . . 4 2.2 Desenvolvimento do Programa . . . 5 2.3 Estrutura do Programa . . . 52.3.1 M´odulo de Inteligˆencia Artificial . . . 5
2.3.2 M´odulo de Interface Gr´afica . . . 6
2.4 Esquema de Representa¸c˜ao de Conhecimento . . . 9
2.5 Implementa¸c˜ao do Esquema de Representa¸c˜ao de Conhecimento . . . 9 3 Ambiente de Desenvolvimento 10 4 Avalia¸c˜ao do Programa 11 5 Resultados Experimentais 12 6 Agradecimentos 13 7 Conclus˜ao 13 8 Melhoramentos 13 A Exemplo de Execu¸c˜ao 15
Lista de Figuras
1 Arranque do jogo . . . 7
2 Possibilidade de ver as cartas dos advers´arios . . . 7
3 Escolha da dificuldade do advers´ario . . . 8
4 Ver pontua¸c˜ao corrente do jogo . . . 8
5 Conjunto de cartas do jogador . . . 9
6 In´ıcio do jogo . . . 15
7 Escolha da carta . . . 16
8 Ap´os a primeira jogada . . . 16
9 Ap´os a segunda jogada . . . 17
10 Pontua¸c˜ao no fim da m˜ao . . . 17
11 Chegada `a s´etima m˜ao . . . 18
12 Escolha do trunfo . . . 18
13 Escolha da carta . . . 19
1
Introdu¸
c˜
ao
1.1
Objectivo
O objectivo deste trabalho consiste na constru¸c˜ao de um jogo de King, em que vai ser permitido, a um jogador humano, defrontar trˆes jogadores com inteligˆencia artificial. A inteligˆencia artificial deve ser implementada com o uso do algoritmo Minimax com cortes Alfa-Beta.
1.2
Motiva¸
c˜
ao
A motiva¸c˜ao principal deste trabalho ´e a inicia¸c˜ao numa ´area da inform´atica, a ´area dos v´ıdeo-jogos, que, actualmente, conta com um mercado e uma ind´ustria em expans˜ao. Tamb´em foi motivante pela necessidade de aprendizagem de outras tantas tecnologias e ferramentas necess´arias para a elabora¸c˜ao do programa.
2
Descri¸
c˜
ao
2.1
Regras do King
O King ´e um jogo para quatro jogadores, o qual consiste num conjunto de dez m˜aos, cada uma constitu´ıda por treze vazas, no qual cada jogador vai tentar obter o m´aximo de pontua¸c˜ao. Durante todo o jogo os jogadores s˜ao obrigados a assistir ´a primeira carta de cada vaza, s´o podendo jogar uma carta de um naipe diferente quando j´a n˜ao dispuserem de nenhuma do mesmo naipe.[1]
Em cada m˜ao s˜ao distribu´ıdas treze cartas. Das dez m˜aos, seis s˜ao de pontua¸c˜ao negativa e quatro de pontua¸c˜ao positiva. Os objectivos e pontua¸c˜oes de cada uma s˜ao: • 1a m˜ao - N˜ao fazer vazas. Cada vaza vale 20 pontos negativos. No total ser˜ao
distribu´ıdos 260 pontos.
• 2a m˜ao - N˜ao receber copas. Os jogadores n˜ao poder˜ao come¸car uma vaza com
co-pas se ainda possu´ırem cartas de outro naipe. Cada copa vale 20 pontos negativos. No total ser˜ao distribu´ıdos 260 pontos.
• 3a m˜ao - N˜ao receber reis nem valetes. Cada uma destas cartas valem 30 pontos
negativos. No total ser˜ao distribu´ıdos 240 pontos.
• 4a m˜ao - N˜ao receber damas. Cada dama vale 50 pontos negativos. No total ser˜ao
distribu´ıdos 200 pontos.
• 5a m˜ao - N˜ao receber o rei de copas. Os jogadores n˜ao poder˜ao come¸car uma vaza
com copas se ainda possu´ırem cartas de outro naipe, e quando tiverem oportu-nidade de jogar o rei de copas, s˜ao obrigados a fazˆe-lo. O rei de copas vale 160 pontos negativos.
• 6a m˜ao - N˜ao fazer as ´ultimas duas vazas. Cada vaza vale 90 pontos negativos.
No total ser˜ao distribu´ıdos 180 pontos.
• 7a a 10a m˜ao - Nestas m˜aos, cada jogador ter´a o direito de escolher um trunfo1 ou
leiloar2 esse direito. Cada vaza vale 25 pontos positivos. Ser˜ao distribu´ıdos 325
pontos positivos por m˜ao, num total de 1300 pontos.
1O trunfo ´e um naipe que permite, ´as cartas desse naipe, ganhar a qualquer outra carta de outro naipe.
2No leil˜ao, os outros jogadores poder˜ao oferecer um n´umero de vazas em troca do direito de escolher o trunfo, sendo que cada licita¸c˜ao ter´a de ser maior que a anterior. O jogador poder´a sempre recusar a oferta, por maior que seja. O naipe s´o dever´a ser revelado depois de o jogador aceitar a oferta.
2.2
Desenvolvimento do Programa
Os primeiros elementos a serem criados foram as classes que permitem o armazenamento de informa¸c˜ao relativo ao jogo, aos jogadores e conjuntos de cartas, que nesta fase utilizava um vector de inteiros para armazenar as cartas, as quais ainda tinham poucos m´etodos. De seguida foram criados v´arios m´etodos destas classes3, como por exemplo
o m´etodo que devolve qual a jogada desejada pelo computador, que numa primeira fase ainda s´o conseguia ir ao primeiro n´ıvel de profundidade, e tamb´em foram criadas duas novas classes, uma que lida com as pontua¸c˜oes do jogo e que tamb´em contˆem a fun¸c˜ao heur´ıstica, e uma outra classe que apenas serve para facilitar a utiliza¸c˜ao das posi¸c˜oes dos v´arios jogadores.
A seguir o m´etodo que calculava a jogada do computador foi melhorado, acrescentando-lhe a possibilidade de pesquisar a v´arias profundidades e tamb´em devido ´a imple-menta¸c˜ao dos Cortes Alpha-Beta, as cartas passaram a ser representadas por um inteiro de 64 bits, e tamb´em foi criado uma classe que representava uma carta, com m´etodos que facilitaram a interpreta¸c˜ao do c´odigo. De seguida foi melhorada a fun¸c˜ao heur´ıstica, e implementou-se outro m´etodo de pesquisa de solu¸c˜ao4.
Em ´ultimo foi criada a interface gr´afica e foram efectuados pequenas correc¸c˜oes e optimiza¸c˜oes ao c´odigo, como por exemplo, melhoramento da fun¸c˜ao heur´ıstica e na fun¸c˜ao de remo¸c˜ao das cartas jogas numa vaza.
2.3
Estrutura do Programa
2.3.1 M´odulo de Inteligˆencia Artificial
Este m´odulo contˆem todo o c´odigo respons´avel pelo desenrolar do jogo, por exemplo, a distribui¸c˜ao das cartas no arrancar do jogo, a verifica¸c˜ao das cartas e o comprimento das regras do jogo, e tamb´em, como o nome indica, a implementa¸c˜ao dos algoritmos de inteligˆencia artificial.
A inteligˆencia artificial foi implementada atrav´es do algoritmo Minimax[2], que con-siste na em uma ´arvore de pesquisa com os v´arios desenrolares de jogo poss´ıveis, e que em cada n´ıvel de profundidade vai ser escolhido qual o desenrolar prefer´ıvel para cada jogador, com a escolha a ser alternada pelos jogadores.
Tamb´em foi implementado o algoritmo de Cortes Alfa-Beta, que consiste na eli-mina¸c˜ao de ramos da ´arvore de pesquisa. Este algoritmo tem a capacidade de reduzir o tempo de processamento sem alterar os resultados obtidos, pois s´o s˜ao cortados ramos que nunca seriam escolhidos pelo algoritmo de Minimax.
A fun¸c˜ao heur´ıstica usada no algoritmo Minimax ´e constitu´ıda pela soma da pon-tua¸c˜ao obtida na vaza, com um peso que ´e dado a cada carta jogada (Tabela 1), para
3Altura da entrega do relat´orio intercalar 4Altura da entrega do relat´orio final
Tabela 1: Peso das cartas na fun¸c˜ao heur´ıstica Carta Peso duque 0 terno 1 quadra 2 quina 3 sena 4 bisca 5 oito 6 nove 7 dez 8 valete 9 dama 10 rei 11 ´ as 12
deste modo jogar-se as cartas mais fortes ou mais fracas logo de inicio ou no fim, con-forme a m˜ao que se tiver a jogar. Depois cada m˜ao recebeu pequenas altera¸c˜oes nos pesos das cartas. Nas m˜aos em que receber certas cartas implica receber pontos nega-tivos, essas mesmas cartas passam a ter o dobro do peso. Para a segunda m˜ao e para as quatro ´ultimas m˜aos, os pesos das copas e das cartas do mesmo naipe que o trunfo, respectivamente, passam a valer mais 13 valores.
Foi tamb´em necess´ario criar uma fun¸c˜ao heur´ıstica para escolher o trunfo. Esta fun¸c˜ao determina qual o naipe mais indicado atrav´es da soma de todos os pesos das cartas de um mesmo naipe, o que tiver o maior somat´orio ´e o escolhido. O peso das cartas ´e semelhante ao da outra fun¸c˜ao heur´ıstica, mas com todos os pesos serem acrescidos de 1 valor.
2.3.2 M´odulo de Interface Gr´afica
O programa ´e constitu´ıdo por uma interface gr´afica (Figura 1) que permite, ao utili-zador, desenrolar um jogo de King de forma muito simples. Permite ver as cartas dos advers´arios (Figura 2), para efeitos de avalia¸c˜ao da capacidade da inteligˆencia artificial, escolher o n´ıvel de dificuldade dos advers´arios (Figura 3), e ver a pontua¸c˜ao actual do jogo (Figura 4). Para apoio ao utilizador, existe uma barra de estado que indica o que fazer para poder prosseguir no jogo.
Figura 1: Arranque do jogo
Figura 3: Escolha da dificuldade do advers´ario
2.4
Esquema de Representa¸
c˜
ao de Conhecimento
A informa¸c˜ao necess´aria de representa¸c˜ao para o jogo s˜ao o conjunto de cartas (Figura 5), que ´e usado para armazenar tanto as cartas do jogador como as cartas que os advers´arios podem possuir.
Figura 5: Conjunto de cartas do jogador
2.5
Implementa¸
c˜
ao do Esquema de Representa¸
c˜
ao de
Conhe-cimento
Para armazenar um conjunto de cartas utilizou-se um inteiro de 32 bits, em que cada bit representa uma carta, duque de paus corresponde ao primeiro bit, terno de paus ao segundo e por ai em diante, com o ´as de copas a ser representado pelo bit 52. A ordem das figuras ´e duque, terno, quadra, quina, sena, bisca, oito, nove, dez, valete, dama, rei e ´as; e dos naipes ´e paus, espadas, ouros e copas.
3
Ambiente de Desenvolvimento
O programa foi desenvolvido em sistema operativo GNU/Linux, distribui¸c˜ao Debian[4]. O m´odulo de inteligˆencia artificial foi desenvolvido no IDE Eclipse[5], em linguagem C++. O m´odulo de interface gr´afica foi desenvolvido utilizando o IDE Glade[6], usando a biblioteca GTKMM[7] (adapta¸c˜ao do GTK para C++), para editar os ficheiros foi usado o editor de texto Gvim[8].
4
Avalia¸
c˜
ao do Programa
Para compara¸c˜ao do desempenho do programa com outros programas, o modo de ava-lia¸c˜ao aconselhado ´e o confronto directo entre os m´odulos de inteligˆencia artificial, de modo que, no final, o m´odulo que mais vit´orias e/ou melhores pontua¸c˜oes tiver obtido, ser´a o que tem a melhor implementa¸c˜ao.
5
Resultados Experimentais
Durante o desenvolvimento do trabalho foram sendo realizados v´arios testes para ve-rifica¸c˜ao do bom funcionamento do programa, bem como para an´alise da evolu¸c˜ao do desempenho da inteligˆencia artificial. Na vertente da an´alise do desempenho, notaram-se grandes melhorias a quando a implementa¸c˜ao do algoritmo de Cortes Alfa-Beta, bem como na altera¸c˜ao da forma de armazenamento das cartas, de vector de 52 inteiros para um inteiro de 64 bits. Tamb´em foram realizados testes a uma abordagem diferente na procura da jogada pelo computador.
No Minimax normal, ´e criada uma ´arvore de pesquisa e ´e a partir dela que se obt´em a ’melhor’ jogada poss´ıvel de ser realizada. O que se tentou ver era se, em vez de se utilizar uma s´o ´arvore de pesquisa, com todas as poss´ıveis jogadas de ser realizadas, utilizar v´arias ´arvores, em que cada uma ia ter uma simula¸c˜ao de vis˜ao perfeita de jogo, reduzindo a expans˜ao da ´arvore e deste modo podendo chegar mais longe na profundidade de pesquisa. Com a combina¸c˜ao dos v´arios resultados obtidos por todas as pesquisas, poderia conseguir-se, no mesmo tempo de processamento, uma jogada ’melhor’ do que a obtida utilizando o outro m´etodo.
Atrav´es da analise dos tempos de pesquisa, esta segunda forma de obten¸c˜ao da jogada mostrou n˜ao ser compensat´oria, devido ao facto de a ´arvore de pesquisa, mesmo com a simula¸c˜ao de vis˜ao perfeita de jogo, continuar a ter um expans˜ao muito grande, chegando a demorar quase tanto tempo que o outro m´etodo para processar uma ´arvore apenas com mais uma profundidade de pesquisa, como se pode ver pela tabela 2. Com estes resultados, optou-se por usar o primeiro m´etodo.
Tabela 2: Jogadas poss´ıveis calculadas
M´etodo N´umero de jogadas Normal com profundidade = 2 34 ∗ 106
6
Agradecimentos
Queria aqui lembrar que este ´e um relat´orio de melhoria de trabalho, e como tal, parte do trabalho aqui apresentado foi desenvolvido em conjunto com os meus parceiros, Carlos Cordeiro e Pedro Carneiro.
De referir tamb´em, que a imagem “bonded.png”, usada para a obten¸c˜ao das texturas das cartas, foi obtida a partir da colec¸c˜ao de jogos Gnome Games[9].
7
Conclus˜
ao
Com este trabalho foi poss´ıvel realizar um programa que mostra ter um bom desempe-nho em termos de capacidade artificial e com uma interface gr´afica simples e de f´acil interpreta¸c˜ao. Quanto aos requisitos do trabalho, foram todos realizados, tendo esta melhoria servido para criar a interface gr´afica, que era uma lacuna da primeira vers˜ao do trabalho entregue, e tamb´em para fazer outros pequenos melhoramentos, que permi-tiram reduzir o tempo de processamento, bem como melhorar as escolhas das jogadas.
8
Melhoramentos
Os melhoramentos poss´ıveis de serem realizados s˜ao, na sua maior parte, referentes ao m´odulo de inteligˆencia artificial, em que os m´etodos mais utilizados na procura da jogada podem ser optimizados, bem como a implementa¸c˜ao do leil˜ao do direito de escolha do trunfo.
No m´odulo de interface gr´afica pode ser melhorado o aspecto, e aumentar a funcio-nalidades do oferecidas.
Referˆ
encias
[1] COPAG, http://loja.copag.com.br/portalcopag/jsp/institucional/ regras/king.jsp
[2] AI depot, Paulo Pinto, http://ai-depot.com/LogicGames/MiniMax.html [3] Claude Chaunier, http://clauchau.free.fr/gamma.html, 14 Dezembro 1998 [4] Debian, http://www.debian.org/
[5] Eclipse, http://eclipse.org [6] Glade, http://glade.gnome.org/ [7] GTK, http://www.gtkmm.org [8] Vim, http://www.vim.org
A
Exemplo de Execu¸
c˜
ao
Para arrancar o programa basta correr o comando “./king”. Na directoria onde o pro-grama for corrido, tamb´em tem de conter o ficheiro “bonded.png”. Para o programa funcionar, o computador tem de ter instalado a biblioteca GTKMM[7] (adapta¸c˜ao do GTK para C++).
Depois de arrancar o jogo, s´o ´e necess´ario seguir as indica¸c˜oes que v˜ao aparecendo na barra de estado e desfrutar.
Figura 7: Escolha da carta
Figura 9: Ap´os a segunda jogada
Figura 11: Chegada `a s´etima m˜ao
Figura 13: Escolha da carta