This notebook uses the student profile
%predicado que define as condições do vencedor vence(Jogada, Posicao) :- vencenalinha(Jogada,Posicao). vence(Jogada, Posicao) :- vencenacoluna(Jogada, Posicao). vence(Jogada, Posicao) :- vencenadiagonal(Jogada, Posicao). % regras para vencer vencenalinha(Jogada, Posicao) :- Jogada = [Posicao,Posicao,Posicao,_,_,_,_,_,_]. vencenalinha(Jogada, Posicao) :- Jogada = [_,_,_,Posicao,Posicao,Posicao,_,_,_]. vencenalinha(Jogada, Posicao):- Jogada = [_,_,_,_,_,_,Posicao,Posicao,Posicao]. vencenacoluna(Jogada, Posicao):- Jogada = [Posicao,_,_,Posicao,_,_,Posicao,_,_]. vencenacoluna(Jogada, Posicao):- Jogada = [_,Posicao,_,_,Posicao,_,_,Posicao,_]. vencenacoluna(Jogada, Posicao):- Jogada = [_,_,Posicao,_,_,Posicao,_,_,Posicao]. vencenadiagonal(Jogada, Posicao):- Jogada= [Posicao,_,_,_,Posicao,_,_,_,Posicao]. vencenadiagonal(Jogada, Posicao):- Jogada = [_,_,Posicao,_,Posicao,_,Posicao,_,_]. % predicado para ajudr o computador jogar com ele mesmo outrojoga(x,o). outrojoga(o,x). % regras para a dinamica do jogo joga(Jogada, Posicao) :- vence(Jogada, Posicao), !, write([jogador, Posicao, vence]). joga(Jogada, Posicao) :- outrojoga(Posicao,Outraposicao), move(Jogada,Posicao,Novajogada), !, display(Novajogada), joga(Novajogada,Outraposicao). % as move([*,B,C,D,E,F,G,H,I], Jogada, [Jogada,B,C,D,E,F,G,H,I]). move([A,*,C,D,E,F,G,H,I], Jogada, [A,Jogada,C,D,E,F,G,H,I]). move([A,B,*,D,E,F,G,H,I], Jogada, [A,B,Jogada,D,E,F,G,H,I]). move([A,B,C,*,E,F,G,H,I], Jogada, [A,B,C,Jogada,E,F,G,H,I]). move([A,B,C,D,*,F,G,H,I], Jogada, [A,B,C,D,Jogada,F,G,H,I]). move([A,B,C,D,E,*,G,H,I], Jogada, [A,B,C,D,E,Jogada,G,H,I]). move([A,B,C,D,E,F,*,H,I], Jogada, [A,B,C,D,E,F,Jogada,H,I]). move([A,B,C,D,E,F,G,*,I], Jogada, [A,B,C,D,E,F,G,Jogada,I]). move([A,B,C,D,E,F,G,H,*], Jogada, [A,B,C,D,E,F,G,H,Jogada]). display([A,B,C,D,E,F,G,H,I]) :- write([A,B,C]),nl,write([D,E,F]),nl, write([G,H,I]),nl,nl. % chama o jogo do computador com ele mesmo autojogo :- joga([*,*,*,*,*,*,*,*,*],x). % Predicado para jogar computador com outro jogador: x_pode_ganhar_em_uma(Jogada) :- move(Jogada, x, Novajogada), vence(Novajogada, x). %O predicado responde_o gera a resposta do computador (jogando o) da Jogada atual. responde_o(Jogada,Novajogada) :- move(Jogada, o, Novajogada), vence(Novajogada, o), !. responde_o(Jogada,Novajogada) :- move(Jogada, o, Novajogada), not(x_pode_ganhar_em_uma(Novajogada)). responde_o(Jogada,Novajogada) :- move(Jogada, o, Novajogada). responde_o(Jogada,Novajogada) :- not(member(b,Jogada)), !, write('Empate!'), nl, Novajogada = Jogada. %Xmove associa numero com uma posicao X do tabuleiro move_x([*,B,C,D,E,F,G,H,I], 1, [x,B,C,D,E,F,G,H,I]). move_x([A,*,C,D,E,F,G,H,I], 2, [A,x,C,D,E,F,G,H,I]). move_x([A,B,*,D,E,F,G,H,I], 3, [A,B,x,D,E,F,G,H,I]). move_x([A,B,C,*,E,F,G,H,I], 4, [A,B,C,x,E,F,G,H,I]). move_x([A,B,C,D,*,F,G,H,I], 5, [A,B,C,D,x,F,G,H,I]). move_x([A,B,C,D,E,*,G,H,I], 6, [A,B,C,D,E,x,G,H,I]). move_x([A,B,C,D,E,F,*,H,I], 7, [A,B,C,D,E,F,x,H,I]). move_x([A,B,C,D,E,F,G,*,I], 8, [A,B,C,D,E,F,G,x,I]). move_x([A,B,C,D,E,F,G,H,*], 9, [A,B,C,D,E,F,G,H,x]). move_x(Jogada, _, Jogada) :- write('movimento errado.'), nl. jogacomoutro :- explica, joga([*,*,*,*,*,*,*,*,*]). explica :- write('escolha um numero para representar sua jogada X em cada lance'), nl, display([1,2,3,4,5,6,7,8,9]). joga(Jogada) :- vence(Jogada, x), write('Voce venceu'). joga(Jogada) :- vence(Jogada, o), write('Computador venceu!!'). joga(Jogada) :- read(N), move_x(Jogada, N, Novajogada), display(Novajogada), responde_o(Novajogada, Novanovajogada), display(Novanovajogada), joga(Novanovajogada). % para criar o laço de jogo
jogacomoutro
% Student exercise profile :- set_prolog_flag(occurs_check, error). % disallow cyclic terms :- set_prolog_stack(global, limit(8 000 000)). % limit term space (8Mb) :- set_prolog_stack(local, limit(2 000 000)). % limit environment space