2017-06-15 29 views
1

我想在Prolog上寫點和框,代碼在這裏不起作用。我想繪製一個框並在棋盤上移動。當使用「play.」時會出現錯誤,我不知道是否有錯誤。
代碼有什麼問題?
我需要這個代碼在2天的考試幫助的原因請。prolog上的點和框

:- use_module(minimax). 
:- dynamic(score/2). 
:- dynamic(turn/1). 

% bestMove(+Pos, -NextPos) 
% Compute the best Next Position from Position Pos 
% with minimax or alpha-beta algorithm. 
bestMove(Pos, NextPos) :- 
    minimax(Pos, NextPos, _). 

% play 
% Start the game. 
play :- 
    nl, 
    write('===================='), nl, 
      write('= Dots and Boxes Game ='), nl, 
      write('===================='), nl, nl, 
      write('Human starts the game'), nl, 
       EmptyBoard = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      show(EmptyBoard), nl, 
       % play .... 

% show(+Board) 
% Show the board to current output. 
show([X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12]) :- 
    write(' + '), show2(X1), 
    write(' + '), show2(X2), 
    write(' + '), nl, 
     show2(X3), write('  '), show2(X4), write(' '), show2(X5), nl, 
     write(' + '), show2(X6), 
    write(' + '), show2(X7), 
    write(' + '), nl, 
     show2(X8), write('  '), show2(X9), write(' '), show2(X10), nl, 
     write(' + '), show2(X11), 
    write(' + '), show2(X12), 
    write(' + '), nl. 

% show2(+Term) 
% Write the term to current outupt 
% Replace 0 by ' '. 
show2(X) :- 
    X = 0, !, 
    write(' '). 

show2(X) :- 
    write(X). 

% set score to 0  
score(p1,0). 
score(p2,0). 

updatescore :- 
    turn(Player), 
    score(Player,S), 
    S2 is S+1, 
    retract(score(Player,S)), 
    assert(score(Player,S2)). 

turn(p1). 
next(p2). 

next :- 
    turn(p1), 
    retract(turn(p1)) , 
    assert(turn(p2)), 
    go. 

next :- 
    turn(p2), 
    retract(turn(p2)), 
    assert(turn(p1)), 
    go. 

go :- win, !, 

    turn(p2), % AI move on P2 turn 
    write('AI plays '), 
    ai, !, 

    show(NextBoard), 
    turn(Player), 
    write(Player), write(' Human Turn'), nl, 
    read(X), 
    call(X). 

win :- 
    finished, 
    score(p1,X), 
    score(p2,Y), 
    win(X,Y). 

win(X,Y) :- 
    X > Y, 
    write('Human wins! '), 
    writef('score1=%w score2=%w',[X,Y]), !, 
    Y > X, 
    write('Computer wins! '), 
    writef('score1=%w score2=%w',[X,Y]), !, 
    X == Y, 
    write('It\' a draw! '), 
    writef('score=%w',[X]). 
+1

它在哪裏工作? – WhatsThePoint

+0

你的意思是? –

+1

什麼行導致錯誤? – WhatsThePoint

回答

0

我解決了玩法。問題。它會在播放之前出現%符號,並以「。」結尾。 Prolog問題。現在我有3 * 3的插件板。

play :- 
    nl, 
    write('===================='), nl, 
      write('= Dots and Boxes Game ='), nl, 
      write('===================='), nl, nl, 
      write('Human starts the game'), nl, 
       EmptyBoard = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      show(EmptyBoard). 

% show(+Board) 
% Show the board to current output. 
show([X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12]) :- 
    write(' + '), show2(X1), 
    write(' + '), show2(X2), 
    write(' + '), nl, 
     show2(X3), write('  '), show2(X4), write(' '), show2(X5), nl, 
     write(' + '), show2(X6), 
    write(' + '), show2(X7), 
    write(' + '), nl, 
     show2(X8), write('  '), show2(X9), write(' '), show2(X10), nl, 
     write(' + '), show2(X11), 
    write(' + '), show2(X12), 
    write(' + '), nl. 

% show2(+Term) 
% Write the term to current outupt 
% Replace 0 by ' '. 
show2(X) :- 
    X = 0, !, 
    write(' '). 

show2(X) :- 
    write(X). 

% set score to 0  
score(p1,0). 
score(p2,0). 

updatescore :- 
    turn(Player), 
    score(Player,S), 
    S2 is S+1, 
    retract(score(Player,S)), 
    assert(score(Player,S2)). 

turn(p1). 
next(p2). 

next :- 
    turn(p1), 
    retract(turn(p1)) , 
    assert(turn(p2)), 
    go. 

next :- 
    turn(p2), 
    retract(turn(p2)), 
    assert(turn(p1)), 
    go. 

go :- win, !, 

    turn(p2), % AI move on P2 turn 
    write('AI plays '), 
    ai, !, 

    show(NextBoard), 
    turn(Player), 
    write(Player), write(' Human Turn'), nl, 
    read(X), 
    call(X). 

win :- 
    finished, 
    score(p1,X), 
    score(p2,Y), 
    win(X,Y). 

win(X,Y) :- 
    X > Y, 
    write('Human wins! '), 
    writef('score1=%w score2=%w',[X,Y]), !, 
    Y > X, 
    write('Computer wins! '), 
    writef('score1=%w score2=%w',[X,Y]), !, 
    X == Y, 
    write('It\' a draw! '), 
    writef('score=%w',[X]). 
+2

所以你回答了你的問題,這很好。但是不要在答案中提出新的問題。打開一個新的SO問題。 – lurker

+0

thx您的意見。我沒有想法如何移動線:)) –

+1

**我沒有想法如何移動線**是一個新的問題,應通過單擊** Ask Question **按鈕發佈爲新的StackOverflow問題。您將其作爲評論發佈。 SO不是一個論壇,你可以開始討論並繼續進行討論,你可以發佈一個問題,希望至少得到一個好的答案,有時候更多。 –