Professional Documents
Culture Documents
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
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.
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.
Pgina 6 de 10
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
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