Prolog:Tick-tack-toe游戏

时间:2016-05-30 10:23:31

标签: algorithm prolog

我有一个基本的Tick-tack-toe游戏,其中2个玩家都在9个单元格的网格上进行移动。问题是,在第一个进行最后一次和winnig移动之后,游戏不会停止,玩家2仍然可以玩。如果第二名球员,不知何故,他也会赢得胜利,他将成为赢家,尽管球员1实际上获得了胜利。如果第二位玩家获胜,它不会犯同样的错误。画得很好。这是代码:

:- dynamic o/1.
:- dynamic x/1.

/* the various combinations of a successful horizontal, vertical
or diagonal line */

ordered_line(1,2,3).
ordered_line(4,5,6).
ordered_line(7,8,9).
ordered_line(1,4,7).
ordered_line(2,5,8).
ordered_line(3,6,9).
ordered_line(1,5,9).
ordered_line(3,5,7).

/*line predicate to complete lines

line(A,B,C) :- ordered_line(A,B,C).
line(A,B,C) :- ordered_line(A,C,B).
line(A,B,C) :- ordered_line(B,A,C).
line(A,B,C) :- ordered_line(B,C,A).
line(A,B,C) :- ordered_line(C,A,B).
line(A,B,C) :- ordered_line(C,B,A).


full(A) :- x(A).
full(A) :- o(A).

empty(A) :- not(full(A)).

all_full :- full(1),full(2),full(3),full(4),full(5),
full(6),full(7),full(8),full(9).


done :- ordered_line(A,B,C), x(A), x(B), x(C), write('Player 2 win.'),nl.

done :- ordered_line(A,B,C), o(A), o(B), o(C), write('Player 1 win.'),nl.

done :- all_full, write('Draw.'), nl.

move1 :- write('Player 1 (o) enter a move: '), read(X), between(1,9,X),  
empty(X), assert(o(X)).
move1:-all_full.
move2 :-  write('Player 2 (x) enter a move: '), read(X), between(1,9,X),  
empty(X),assert(x(X)).
move2:- all_full.
printsquare(N) :- o(N), write(' o ').
printsquare(N) :- x(N), write(' x ').
printsquare(N) :- empty(N), write('   ').

printboard :- printsquare(1),printsquare(2),printsquare(3),nl,
          printsquare(4),printsquare(5),printsquare(6),nl,
          printsquare(7),printsquare(8),printsquare(9),nl.

clear :- x(A), retract(x(A)), fail.
clear :- o(A), retract(o(A)), fail.

play :- not(clear), repeat, move1, printboard, move2,printboard, done.

这就是我得到的错误: Game doesnt stop when player 1 wins

希望你能帮助我:)提前致谢。

编辑:“玩家2获胜”显示在“完成”谓词中。成功完成3'o'或'x'游戏结束后,玩家1胜或玩家2胜。我将包含原始代码,这可能有助于理解我得到的问题Original code with comments

1 个答案:

答案 0 :(得分:0)

问题在于游戏的主要谓词:

play :- not(clear), repeat, move1, printboard, move2,printboard, done.

在玩家1移动后,您不会检查done

在Prolog的语法中,逻辑“或”写为;。因此,表达play谓词的一种方法是:

play :- not(clear), repeat, move1, printboard, (done; move2, printboard, done).

其中说“在move1之后,检查游戏是否完成(即完成);如果没有,则玩家2进行移动,然后重复检查。