Abaixo encontram-se as explicações sobre o programa.
_____ _____ _____ | | | | | 1 | 2 | 3 | |_____|_____|_____| | | | | | 4 | 5 | 6 | |_____|_____|_____| | | | | | 7 | 8 | 9 | |_____|_____|_____|As casas serão representadas por um número entre 1 e 9, inclusive.
Cada jogador tem três pedras. Quem joga primeiro será chamado de X, e o outro jogador é O. O objetivo de cada jogador é posicionar suas três pedras em linha reta (vertical, horizontal ou diagonal). O tabuleiro começa vazio, e alternadamente os jogadores fazem suas jogadas, comçando pelo jogador X. Enquanto não estiverem as seis pedras no tabuleiro, uma jogada consiste em colocar uma pedra em uma casa vazia. Quando as três pedras de cada jogador já estiverem no tabuleiro, uma jogada passa a ser a movimentação de uma pedra para uma posição vizinha não ocupada. Define-se como casa vizinha aquela à qual se pode chegar movendo-se uma posição no sentido vertical, horizontal, ou diagonal.
Cada jogador só pode mexer em suas próprias pedras. Não é permitido "passar" a vez.
A seguir exibimos umapartida para ilustrar o jogo.
Os três primeiros lances de cada jogador são indicados por casas, e os
restantes por listas da forma (a b)
,
onde a
é a posição de origem e b
é a posição
de destino da pedra que foi movida.
X | O |
1 | 5 |
6 | 3 |
7 | 4 |
[1, 2] | [4, 1] |
[7, 4] | [5, 8] |
[2, 5] |
O X venceu, pois conseguiu fazer uma linha reta. Note que o O já estava perdido na penúltima jogada, pois só podia mexer a pedra 5, deixando o lugar vago para o X ganhar. Posição final:
_____ _____ _____ | | | | | O | | O | |_____|_____|_____| | | | | | X | X | X | |_____|_____|_____| | | | | | | O | | |_____|_____|_____|
A partida pode terminar empatada se nenhum dos jogadores tiver ganho depois de trancorridas n jogadas.
Voce deverá escrever um programa em PROLOG que joga este jogo, tanto do lado do X como do lado do O. Seu programa deverá ter quatro predicados:
x_inicia(-Jogada)
Este predicado será chamado com uma variável livre como argumento e deverá instanciá-la com o valor da casa onde seu programa jogará o primeiro lance como X. Além disso, pode executar as inicializações que julgar necessárias.
x_responde(+Jogada, -Resposta)
Este predicado será chamado com o primeiro argumento instanciado com o valor da última jogada do O, e deve instanciar o seu segundo argumento com o valor da jogada-resposta.
o_inicia(+Jogada, -Resposta)
Este predicado será chamado com uma variável livre como argumento e deverá instanciá-la com o valor da casa onde seu programa jogará o primeiro lance como O. Além disso, pode executar as inicializações que julgar necessárias.
o_responde(+Jogada, -Resposta)
Este predicado será chamado com o primeiro argumento instanciado com o valor da última jogada do X, e deve instanciar o seu segundo argumento com o valor da jogada-resposta.
Para evitar conflitos com outros programas, usaremos módulos. Cada módulo definirá um espaço de nomes diferente, evitando conflitos. É muito simples usar módulos em SWI-Prolog. Basta que seu programa comece com a seguinte linha:
:- module(raNNNNNN, []).onde
NNNNNN
é o seu RA. Exemplo: se seu login é 973451, use
ra973451
como nome do módulo. Seu programa deve ser
submetido num arquivo chamado raNNNNNN.prolog
, onde
novamente NNNNNN
é o seu RA.
Neste projeto, o funcionamento mínimo é o seguinte: seu programa não poderá perder mais do que 10% das partidas disputadas por ter feito jogadas inválidas.
Os programas de todos os alunos que entregarem no prazo, ou até dez dias após o prazo, serão colocados num campeonato. Para cada dia de atraso, o aluno perde um ponto na nota. Este campeonato consiste em jogar uns contra os outros e ver quem acumula mais pontos. Os pontos são contados como: 3 para vitória, 1 para empate, 0 para derrota (jogada inválida conta como derrota).
Os jogadores serão ordenados pelo total de pontos. Os que não fizeram o funcionamento mínimo serão removidos da lista. O primeiro colocado tira 10 (dez). O último colocado fica com 5 (cinco). Os outros terão sua nota calculada por interpolação de seu total de pontos em relação ao interalo [5,10]. Após tudo isso, serão descontados os pontos devidos aos dias de atraso, se houver.
A nota dos que não cumprirem o funcionamento mínimo será 5 multiplicado pela fração de partidas onde o programa não fez jogadas inválidas.
Como sempre, programas iguais ou suficientemente parecidos serão punidos com nota zero para todos os envolvidos.