Advertisement
mwchase

At long last, I have finished a game

Sep 28th, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 1.95 KB | None | 0 0
  1. :- dynamic
  2.     board/1
  3. .
  4.  
  5. board(no).
  6.  
  7. player(x).
  8. player(o).
  9.  
  10. turn(B,x) :- count(B,x,C), count(B,o,C).
  11. turn(B,o) :- count(B,x,Cx), Co is Cx - 1, count(B,o,Co).
  12.  
  13. win(B,P) :- player(P), row(B,R), tuple_count(R,P,3).
  14.  
  15. subscript((Item,X,Y),0,Item,(X,Y)).
  16. subscript((Y,Item,X),1,Item,(X,Y)).
  17. subscript((X,Y,Item),2,Item,(X,Y)).
  18.  
  19. count((R1,R2,R3),P,C) :-
  20.     tuple_count(R1, P, C1)
  21.     , tuple_count(R2, P, C2)
  22.     , tuple_count(R3, P, C3)
  23.     , C is C1 + C2 + C3
  24.     , !
  25. .
  26.  
  27. print_winner(B) :- win(B, P), write(P), write(' wins!'),!.
  28. print_winner(_).
  29.  
  30. print_row((X,Y,Z)) :- write(X), write('|'), write(Y), write('|'), write(Z), nl.
  31. print_board((X,Y,Z)) :-
  32.     print_row(X)
  33.     , write('-+-+-')
  34.     , nl
  35.     , print_row(Y)
  36.     , write('-+-+-')
  37.     , nl
  38.     , print_row(Z)
  39.     , print_winner((X,Y,Z))
  40. .
  41.  
  42. tuple_count((P,P,P), P, 3).
  43. tuple_count((P,P,_), P, 2).
  44. tuple_count((P,_,P), P, 2).
  45. tuple_count((_,P,P), P, 2).
  46. tuple_count((P,_,_), P, 1).
  47. tuple_count((_,P,_), P, 1).
  48. tuple_count((_,_,P), P, 1).
  49. tuple_count(_,_,0).
  50.  
  51. row((Fst,_,_),Fst).
  52. row((_,Snd,_),Snd).
  53. row((_,_,Thd),Thd).
  54. row(((X,_,_),(Y,_,_),(Z,_,_)),(X,Y,Z)).
  55. row(((_,X,_),(_,Y,_),(_,Z,_)),(X,Y,Z)).
  56. row(((_,_,X),(_,_,Y),(_,_,Z)),(X,Y,Z)).
  57. row(((X,_,_),(_,Y,_),(_,_,Z)),(X,Y,Z)).
  58. row(((_,_,X),(_,Y,_),(Z,_,_)),(X,Y,Z)).
  59.  
  60. can_move(B,(X,Y)) :- \+ win(B,_), subscript(B,Y,R,_), subscript(R,X,' ',_).
  61. do_move(B1,(X,Y),B2) :-
  62.     turn(B1,P)
  63.     , subscript(B1,Y,R1,Rows)
  64.     , subscript(R1,X,' ',Items)
  65.     , subscript(R2,X,P,Items)
  66.     , subscript(B2,Y,R2,Rows)
  67. .
  68.  
  69. move(B1,(X,Y),'',B2) :- can_move(B1, (X,Y)), do_move(B1,(X,Y),B2),!.
  70. move(B,_,'cannot move there',B).
  71.  
  72. start_game :-
  73.     B = ((' ', ' ', ' '),(' ', ' ', ' '),(' ', ' ', ' '))
  74.     , retract(board(_))
  75.     , asserta(board(B))
  76.     , print_board(B)
  77. .
  78.  
  79. move(X,Y) :-
  80.     board(B1)
  81.     , move(B1,(X,Y),M,B2)
  82.     , write(M)
  83.     , nl
  84.     , retract(board(_))
  85.     , asserta(board(B2))
  86.     , print_board(B2)
  87. .
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement