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