Vous êtes sur la page 1sur 10

Relatrio de Avaliao Intercalar do 1 Trabalho Prtico da Disciplina de Programao em Lgica

Spider 4 em Linha
(Trabalho 12)

Grupo 55 (Turma 5) 80509011 ei08011@fe.up.pt Andr Daniel Moreira Pinto Riboira 70509052 ei07052@fe.up.pt Joo Guilherme Ribeiro de Brito Pgina 1 de 10

Resumo
Este trabalho pretende implementar o jogo Spider 4 em Linha em linguagem Prolog, possibilitando jogos com dois adversrios humanos, com um adversrio humano e um computador ou com dois adversrios computadores. Para mais informaes relativamente s regras deste jogo por favor consulte o captulo Descrio do Problema.

Introduo
O objectivo deste trabalho adquirir conhecimentos de programao lgica utilizando a linguagem de programao Prolog, bem como utilizar conceitos lgicos para resoluo de problemas associados a regras e jogadas de jogos de tabuleiro. A escolha deste jogo deve-se sobretudo simplicidade das regras, que permite a rpida compreenso por qualquer jogador que nunca o tenha jogado, embora possibilite estratgias de jogo interessantes. Este jogo tem algumas particularidades que o distinguem da maioria dos restantes jogos de tabuleiro, nomeadamente o facto das peas serem atradas para as extremidades do tabuleiro, tal como se estivessem sujeitas a foras magnticas. A maior motivao para a escolha deste jogo foi sem dvida o facto de derivar de um jogo extremamente simples (o 4 em Linha) mas ter o desafio da lei da gravidade a que est sujeito o jogo original ser nesta verso substituda por foras em 4 direces distintas, o que possibilita jogadas e estratgias que surpreendem o jogador menos atento.

Descrio do Problema
Este jogo composto por um tabuleiro de 64 casas (8 casas por 8 casas), e poder ser jogado por dois jogadores. O funcionamento muito semelhante ao 4 em Linha tradicional, mas com a diferena que os jogadores podem inserir peas a partir de qualquer um dos lados do tabuleiro, o que vai alterar radicalmente a estratgia do jogo.

Pgina 2 de 10

Exemplo do tabuleiro na posio inicial: T1 E1 E2 E3 E4 E5 E6 E7 E8 F1 F2 F3 F4 F5 F6 F7 F8 T2 T3 T4 T5 T6 T7 T8 D1 D2 D3 D4 D5 D6 D7 D8

As casas T1 a T8, F1 a F8, E1 a E8 e D1 a D8 representam as entradas a partir das quais os jogadores podem inserir as suas peas. As casas T1 a T8 representam as entradas do topo, as casas F1 a F8 representam as entradas do fundo, as casas E1 a E8 representam as entradas da esquerda e, por fim, as entradas D1 a D8 representam as entradas da direita. Estas casas apenas so representadas aqui para facilitar a compreenso do jogo, pois no fazem parte das casas do jogo.

Objectivo do Jogo
O objectivo deste jogo, tal como do 4 em Linha original, conseguir um alinhamento de 4 peas da cor do jogador no tabuleiro. Esse alinhamento poder ser horizontal, vertical ou diagonal.

Desenvolvimento de uma partida


Os jogadores jogam vez, e apenas uma jogada de cada vez. Em cada jogada podem colocar uma pea no tabuleiro, a partir de qualquer uma das entradas laterais. As peas de cada jogador possuem cores distintas. A pea colocada a partir de uma das entradas do tabuleiro atrada para o lado oposto da entrada, ocupando o lugar disponvel o mais afastado possvel da entrada escolhida, no podendo ficar sobreposta a qualquer pea j inserida no tabuleiro.

Pgina 3 de 10

Exemplo de uma jogada inicial do jogador com as peas brancas, inserindo a pea a partir da entrada D4: T1 E1 E2 E3 E4 E5 E6 E7 E8 F1 F2 F3 F4 F5 F6 F7 F8 T2 T3 T4 T5 T6 T7 T8 D1 D2 D3 D4 D5 D6 D7 D8

Exemplo de uma jogada do jogador com as peas pretas, inserindo a pea a partir da entrada T4: T1 E1 E2 E3 E4 E5 E6 E7 E8 F1 F2 F3 F4 F5 F6 F7 F8 T2 T3 T4 T5 T6 T7 T8 D1 D2 D3 D4 D5 D6 D7 D8

Pgina 4 de 10

Exemplo de uma jogada do jogador com as peas brancas, inserindo a pea a partir da entrada F1: T1 E1 E2 E3 E4 E5 E6 E7 E8 F1 F2 F3 F4 F5 F6 F7 F8 T2 T3 T4 T5 T6 T7 T8 D1 D2 D3 D4 D5 D6 D7 D8

Exemplo de uma jogada do jogador com as peas pretas, inserindo a pea a partir da entrada D4: T1 E1 E2 E3 E4 E5 E6 E7 E8 F1 F2 F3 F4 F5 F6 F7 F8 T2 T3 T4 T5 T6 T7 T8 D1 D2 D3 D4 D5 D6 D7 D8

Vencedor da Partida
O jogador que conseguir colocar 4 peas seguidas da sua cor (vlido em leituras horizontais, verticais ou diagonais) ganha o jogo.

Pgina 5 de 10

Exemplo de uma jogada do jogador com as peas brancas, inserindo a pea a partir da entrada F1 e ganhando o jogo: T1 E1 E2 E3 E4 E5 E6 E7 E8 F1 F2 F3 F4 F5 F6 F7 F8 T2 T3 T4 T5 T6 T7 T8 D1 D2 D3 D4 D5 D6 D7 D8

Fim da Partida
A partida deste jogo chega ao final se for encontrado um vencedor, ou caso nenhum jogador consiga esse objectivo e todas as casas do tabuleiro sejam preenchidas com peas, o jogo acaba em empate.

Tempo de Durao de uma Partida


As partidas no possuem limite de tempo pr-definido, mas tm uma durao mdia entre 10 a 20 minutos.

Representao do Estado do Jogo


Sabendo que este jogo assenta num tabuleiro de 8 linhas e 8 colunas, estando as casas de jogo organizadas ortogonalmente, optamos por representar o referido tabuleiro atravs de uma lista de listas em que cada um dos elementos representa uma casa. Cada casa poder ter 3 estados: V de vazio, B de branca e P de preta, indicando respectivamente se a casa est vazia, se possui uma pea branca ou uma pea preta.
Possvel estado inicial: estado = [ [ [ [ [ [ [ [ [ V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V V V V V V V V ], ], ], ], ], ], ], ] ] .

Pgina 6 de 10

Possvel estado intermdio: estado = [ [ B, V, [ V, V, [ V, V, [ B, P, [ V, V, [ V, V, [ V, V, [ V, V, Possvel estado final: estado = [ [ [ [ [ [ [ [ [ B, B, B, B, V, V, V, V, V, V, V, P, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, P, V, V, V, V, V, V, P, P, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V V V V V V V V V V V V V V V V ], ], ], ], ], ], ], ] ] . ], ], ], ], ], ], ], ] ] .

Representao de um Movimento
Em cada jogada, o jogador apenas ter que indicar qual a entrada atravs da qual pretende inserir a pea no tabuleiro. A representao deste movimento poder ser efectuada da seguinte forma:
inserir_peca(Jogador, Entrada, Posicao, Tabuleiro, NovoTabuleiro).

Nesta situao, o programa recebe o jogador, a entrada (T: topo, F: fundo, E: esquerda, D: direita) e a posio da entrada (de 1 a 8). Recebe tambm o tabuleiro actual e guarda o tabuleiro com o resultado em NovoTabuleiro. Para efectuar uma jogada, iremos desenvolver diversos predicados de manipulao da matriz, de forma a que o predicado da jogada seja um nico para qualquer uma das entradas do tabuleiro. Assim sendo, iremos desenvolver um predicado que troque as colunas de uma matriz pelas suas linhas (de forma a tratarmos as entradas do topo e do fundo), um que inverta uma linha (de forma a tratarmos as entradas do topo e da esquerda), e predicados para efectuar a jogada (retornando uma matriz com o resultado). O procedimento a seguir ser o seguinte:

Verifica se a entrada a de topo ou do fundo. Se for, troca as colunas pelas linhas da matriz. Obtm a linha correspondente jogada. Verifica se a entrada a de topo ou da esquerda. Se for, inverte a linha obtida. Efectua a jogada: procura a primeira ocorrncia de v (vazio) e substitui-a pela letra associada ao jogador. Gera a matriz com a nova linha gerada pela jogada e retorna-a como resultado (novo tabuleiro).

Pgina 7 de 10

Visualizao do Tabuleiro
O tabuleiro do jogo ser representado em modo de texto, sobre forma de uma matriz de caracteres. Para uma melhor visualizao ser utilizado o caracter O para representar as peas brancas e o caracter X para as peas pretas. Alm do tabuleiro de jogo sero tambm representadas as entradas do tabuleiro. Assim sendo, um exemplo de uma possvel representao de um tabuleiro seria o seguinte:
E1 E2 E3 E4 E5 E6 E7 E8 T1 T2 T3 T4 T5 T6 T7 T8 +---+---+---+---+---+---+---+---+ | O | | | | | | | | +---+---+---+---+---+---+---+---+ | | | | | | | | | +---+---+---+---+---+---+---+---+ | | | | | | | | | +---+---+---+---+---+---+---+---+ | O | X | | | | | | | +---+---+---+---+---+---+---+---+ | | | | | | | | | +---+---+---+---+---+---+---+---+ | | | | | | | | | +---+---+---+---+---+---+---+---+ | | | | | | | | | +---+---+---+---+---+---+---+---+ | | | | X | | | | | +---+---+---+---+---+---+---+---+ F1 F2 F3 F4 F5 F6 F7 F8 D1 D2 D3 D4 D5 D6 D7 D8

Concluses e Perspectivas de Desenvolvimento


Aps a anlise do trabalho realizado, podemos concluir que atingimos parte dos objectivos a que nos propusemos. A implementao do jogo Spider 4 em Linha poder ser realizada com sucesso atravs da utilizao da linguagem Prolog, e ser certamente possvel jogar o mesmo atravs do interface criado em ambiente de texto. Apesar de ainda ser uma verso preliminar, j temos noo dos algoritmos que iro ser utilizados, bem como a interface final do jogo. Neste momento j possvel representar o tabuleiro de jogo e realizar algumas operaes sobre o mesmo, que ir possibilitar a realizao de jogadas entre dois humanos. Assim sendo, estimamos que j atingimos o marco dos 25% do trabalho realizado considerado como necessrio para que o jogo atinja a verso final. Falta ainda implementar um procedimento para gerar a matriz com o resultado da jogada, que ir consistir na substituio na matriz recebida da linha gerada pela jogada. Aps este desenvolvimento ser possvel realizar jogos entre dois humanos. Falta tambm implementar os processos que iro permitir que um humano jogue contra o computador, ou que dois computadores joguem entre si.

Pgina 8 de 10

Bibliografia
Para realizao do trabalho:

[1] Eugnio Oliveira e Lus Paulo Reis, Materiais da Disciplina de Programao em Lgica, disponvel online a partir de http://www.fe.up.pt/~eol/LP/0809 (Consultado em Outubro de 2008). [2] Vrios Autores, SICStus Prolog Users Manual, Release 3.10.1, Abril de 2003.
Para a realizao do relatrio:

[3] Vrios Autores, BrainKing Regras do Jogo (Spider 4 em Linha), disponvel online em http://brainking.com/pt/GameRules?tp=16 (Consultado em Outubro de 2008)

Pgina 9 de 10

Anexos
Representao do Estado Inicial tabuleiro( [ [ [ [ [ [ [ [ [ v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v v v v v v v v ], ], ], ], ], ], ], ] ] ).

Cabealhos de alguns Predicados de Jogada % joga_linha( linha, resultado, jogador ). joga_linha( [v|A], [J|A], J ). joga_linha( [X|A], [X|B], J ):- joga_linha( A, B, J ). % inverte_linha( linha, resultado ). inverte_linha( A, B ):- rev( A, [], B ). rev( [X|A], B, R ):- rev( A, [X|B], R ). rev( [], R, R ). % --- obtm uma determinada linha de uma matriz %linha_tabuleiro( matriz, resultado, numero_linha ). linha_tabuleiro([A|_], A, 1). linha_tabuleiro([_|A], B, N):- N1 is N-1, linha_tabuleiro(A, B, N1). % --- troca as linhas pelas colunas da matriz tabuleiro espelha_matriz:- tabuleiro(A), roda_matriz(A,R), write(R). % roda_matriz(matriz, resultado) roda_matriz([HE|T],R):- A=HE, linhas(T,B,TB), linhas(TB,C,TC), linhas(TC,D,TD), linhas(TD,E,TE), linhas(TE,F,TF), linhas(TF,G,TG), linhas(TG,H,_), colunas(A,B,C,D,E,F,G,H,R). linhas([H|T],H,T). colunas([],[],[],[],[],[],[],[],[]). colunas([HA|TA],[HB|TB],[HC|TC],[HD|TD],[HE|TE],[HF|TF],[HG|TG],[HH|TH],[H|T]):colunas(TA,TB,TC,TD,TE,TF,TG,TH,T),H=[HA,HB,HC,HD,HE,HF,HG,HH]. Predicado que Permite a Visualizao Simples do Tabuleiro (Modo de Texto) linha( [] ). linha( [v|T2] ) :- print('| '), linha(T2). linha( [T1|T2] ) :- print('| ') , print(T1), print(' '), linha(T2). imprime_tabuleiro( T ):- print(' T1 matriz(T, 0). T2 T3 T4 T5 T6 T7 T8\n'),

matriz( [T1|T2], Contador ) :- Contador2 is Contador + 1, print(' +---+---+---+---+---+---+---+---+\n'), print('E'), print(Contador2), print(' '), linha(T1), print('| '), print('D'), print(Contador2), print('\n'), matriz(T2, Contador2). matriz( [] , _) :- print(' print(' +---+---+---+---+---+---+---+---+\n'), F1 F2 F3 F4 F5 F6 F7 F8\n').

Pgina 10 de 10