2016-05-30 3 views
1

私は基本的なTick-tack-toeゲームを持っています.2人のプレイヤーが9つのセルのグリッド上を移動します。問題は、フリストプレイヤーが最後にwinnigを動かすと、ゲームが止まらず、プレイヤー2はまだプレイできるということです。 2人目の選手が何とか勝利を収めていれば、実際に勝利を収めているにもかかわらず、勝者になるでしょう。 2人目の選手がフリースタイルで勝った場合、同じエラーは発生しません。ドローはうまく動作します。 Here`sコード:Prolog:Tick-tack-toe game

:- 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. 

とエラーthat`s私が手:Game doesnt stop when player 1 wins

は、事前に感謝:)私を助けることができる願っています。

編集:「プレイヤー2勝」は「完了」述部で表示されます。成功したフィニッシュラインの3'o 'または' x 'は、1番勝ちまたは2番勝ちで終了するはずです。私は、 `私はOriginal code with comments

+0

もう少し説明できますか? –

+0

@lurkerアップデートをしました。助けて欲しいですか? –

+0

'line'述語の前に" open "というコメントがあります(' */'で終わらない) – lurker

答えて

0

を取得し、問題の問題を理解することに役立つかもしれない元のコードが含まれることは、ゲームの主な述語である:

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

あなたはプレイヤーの1つの移動後doneをチェックしません。

Prologの構文では、論理 "or"は;と書かれています。だから、play述語を表現する一つの方法は次のとおりです。ゲームが行われた場合(すなわち、終了)と言う

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

「move1後、チェックし、そうでない場合は、プレイヤー2が移動を行い、その後、チェックが繰り返されます

+0

ありがとう@kfx!それはすべての今働いている:) –