Jogo da Velha

O projeto de programação a ser implementado terá como tema o Jogo da Velha, explicado a seguir. O progama deverá ser entregue até o dia 28/06/2004 às 23:59. A forma de entrega será pelo Teleduc - protfólio.  Os treinos serão feitos pelo sistema de submissão.

Abaixo encontram-se as explicações sobre o programa.

Tabuleiro

O jogo será jogado num tabuleiro 3x3. As casas serão denotadas por pares de coordenadas como segue:
    _____ _____ _____
| | | |
|[0,2]|[1,2]|[2,2]|
|_____|_____|_____|
| | | |
|[0,1]|[1,1]|[2,1]|
|_____|_____|_____|
| | | |
|[0,0]|[1,0]|[2,0]|
|_____|_____|_____|

As casas serão representadas por uma lista de números como acima.

Regras do Jogo

Quem joga primeiro será chamado de PRETO, e o outro jogador é BRANCO. 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 PRETO. Uma jogada consiste em colocar uma pedra em uma casa vazia.  Não é permitido "passar" a vez.  Caso o tabuleiro esteja cheio e nenhum dos jogadores tenha formado três pedras em linha, o jogo acaba em empate.

Exemplo de partida

A seguir exibimos uma partida para ilustrar o jogo.

PRETO
BRANCO
[0, 2] [1, 1]
[2, 1] [2, 2]
[0, 0] [0, 1]
[2, 0] [1, 0]
[1, 2]

A partida acabou empatada. Posição final:

    _____ _____ _____
| | | |
| P | P | B |
|_____|_____|_____|
| | | |
| B | B | P |
|_____|_____|_____|
| | | |
| P | B | P |
|_____|_____|_____|


O que voce deve implementar

Voce deverá escrever um programa em Prolog que joga este jogo, tanto do lado do PRETO como do lado do BRANCO. Seu programa deverá ser um módulo e definir quatro predicados:

preto_inicia(-Resposta)

Este predicado será chamado com uma variável livre como argumento e deve retornar a casa onde seu programa jogará o primeiro lance como PRETO. Além disso, pode executar as inicializações necessárias em suas estruturas internas.

preto_responde(+Jogada, -Resposta)

Este predicado será chamado com a última jogada do BRANCO como primeiro argumento, e deve retornar a jogada-resposta no segundo argumento. Além disso, pode executar as atualizações necessárias em suas estruturas internas.

branco_inicia(+Jogada, -Resposta)

Este predicado será chamado com a última jogada do PRETO como primeiro argumento e retorna a casa onde seu programa jogará o primeiro lance como BRANCO no segundo argumento. Além disso, pode executar as inicializações necessárias em suas estruturas internas.

branco_responde(+Jogada, -Resposta)

Este predicado será chamado com a última jogada do PRETO como primeiro argumento, e deve retornar a jogada-resposta como segundo argumento. Além disso, pode executar as atualizações necessárias em suas estruturas internas.

Para evitar conflitos com outros programas, usaremos módulos. Cada módulo definirá um espaço de nomes diferente, evitando conflitos. Para usar pacotes em SWI Prolog, basta que seu arquivo comece com as seguintes linhas:

:- module(raNNNNNN, []).
onde NNNNNN é o seu RA. Exemplo: se seu RA é 973451, use ra973451 como nome do pacote. Seu programa pode deve ser submetido num único arquivo chamado raNNNNNN.prolog, onde novamente NNNNNN é o seu RA.

Funcionamento mínimo

O funcionamento mínimo é importante pois ele tem implicação direta na nota do aluno.  Programas cumprindo o funcionamento mínimo terão nota maior ou igual a 5.0, enquanto que os que não cumprirem o funcionamento mínimo terão nota menor que 5.0.

Neste projeto, o funcionamento mínimo é o seguinte: seu programa não poderá perder mais do que 10% das partidas disputadas por desclassificação.  Perder uma partida por desclassificação significa fazer uma jogada inválida ou não retornar em tempo hábil.

Avaliação

Os programas de todos os alunos que entregarem no prazo, ou até dez dias após o prazo, serão colocados num campeonato. Este campeonato consiste em jogar uns contra os outros e ver quem acumula mais pontos. Os pontos são contados da seguinte forma: 2 para vitória, 1 para empate, 0 para derrota (desclassificação 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].   Por exemplo, se houver quatro jogadores A, B, C e D que obtiveram 7, 4, 7 e 6 pontos respectivamente no campeonato, então as notas serão assim: A=10, B=5, C=10, D=8,33.

Após tudo isso, será descontada nota devido aos dias de atraso, se houver.  Como punição por atraso, o aluno perde nota à razão de 10% ao dia. Por exemplo, um aluno que tiraria 7 e tenha 5 horas de atraso ficaria após o desconto com 7 - 7*5/24*10% = 6,85.

A nota dos que não cumprirem o funcionamento mínimo será 5 multiplicado pela fração de partidas onde o programa não perdeu por desclassificação.  Por exemplo, se em 110 partidas o programa se desclassificou em 20 delas, a nota é 5*(90/110) = 4,09.

Como sempre, programas iguais ou suficientemente parecidos serão punidos com nota zero para todos os envolvidos e informação à Coordenadoria de Graduação para as devidas providências.


Joao Meidanis

Last modified: Sun May 23 15:37:27 BRT 2004 by JM