0, X3=X5, X3=X7, who_won (X3),!.
find_win (0).
Якщо переможець знайдений викликається предикат who_won.
Предикат who_won додає переможцю очко, за допомогою предиката edit_global_score, «скидає» стан ігрового поля до вихідного edit_global_field (0,0,0,0,0,0,0,0,0), змінює стан ігрового процесу (закінчення гри) edit_global_game_end (1) і виводить повідомлення про переможця.
Якщо переможець не знайдений, то викликається предикат count_field, який перевіряє наявність вільних комірок на полі.
count_field (End): - global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9),_empty(X1,A),_empty(X2,B),_empty(X3,C),_empty(X4,D),_empty(X5,E),_empty(X6,F),_empty(X7,G),_empty(X8,H),_empty(X9,I),=A+B+C+D+E+F+G+H+I.
Предикат scan_end_game перевіряє ситуацію закінчення гри (всі комірки заповнені) та за допомогою предиката edit_global_game_end змінює стан факту закінчення гри в базі даних.
scan_end_game (9): - edit_global_game_end (1).
scan_end_game (_).
Якщо гра не закінчена, викликається предикат game і слід хід комп'ютера.
Хід комп'ютера.
Хід користувача починається з предиката game з параметром 2.
Предикат global_game_end (Endgame) виконує перевірку на випадок закінчення гри.
Далі виконаються предикат select_move, який аналізує ситуацію ігрового поля і приймає рішення, який хід найбільш правильний (якщо немає ситуації гарантованого виграшу чи гарантованого програшу хід здійснюється випадковим чином).
select_move (Xod): - random (8, TempXod), Xod=TempXod + 1,!.
Далі виконується предикат make_move (1, Xod, XodEst).
Допоміжний предикат scan_move перевіряє можливість виконання заданого ходу.
scan_move (1,1): - global_field (X1, _, _, _, _, _, _, _, _), X1 gt; 0,! ._ move (2,1):- global_field (_, X2, _, _, _, _, _, _, _), X2 gt; 0,! ._ move (3,1): - global_field (_, _, X3, _, _, _, _, _, _), X3 gt; 0,! ._ move (4,1): - global_field (_, _, _, X4, _, _, _, _, _), X4 gt; 0,! ._ move ( 5,1): - global_field (_, _, _, _, X5, _, _, _, _), X5 gt; 0,! ._ move (6,1): - global_field (_, _, _, _ , _, X6, _, _, _), X6 gt; 0,! ._ move (7,1): - global_field (_, _, _, _, _, _, X7, _, _), X7 gt; 0 ,! ._ move (8,1): - global_field (_, _, _, _, _, _, _, X8, _), X8 gt; 0,! ._ move (9,1): - global_field (_, _, _, _, _, _, _, _, X9), X9 gt; 0,!.
scan_move (_, 0).
Якщо заданий хід можна виконати те, предикат edit_global_field змінює ситуацію на ігровому полі (в обрану позицію заноситься символ гравця x), міняючи вміст фактів бази даних, а предикат draw_field виводить поточний стан ігрового поля на екран.
Предикат draw_field має допоміжний предикат scan_x_o.
За допомогою предиката scan_x_o здійснюється вибір символу для виводу на екран (x, o, залежно від поточного стану перевіряється комірки).
Предикат find_win перевіряє наявність переможця на поточному ході гри.
find_win (1): - global_field (X1, X2, X3, X4, X5, X6, X7, X8, X9), X1 lt; gt; 0, X1=X2, X1=X3, who_won (X1),! ._ win (1): - global_field (X1, X2, X3, X4, X5, X6, X7, X8, X9), X4 lt; gt; 0, X4=X5, X4=X6, who_won (X4 ),!. _win (1): - global_field (X1, X2, X3, X4, X5, X6, X7, X8, X9), X7 lt; gt; 0, X7=X8, X7=X9, who_won (X7),! ._ win ( 1): - global_field (X1, X2, X3, X4, X5, X6, X7, X8, X9), X1 lt; gt; 0, X1=X4, X1=X7, who_won (X1),! ._ win (1):- global_field (X1, X2, X3, X4, X5, X6, X7, X8, X9), X2 lt; gt; 0, X2=X5, X2=X8, who_won (X2),! ._ win (1): -global_field (X1, X2, X3, X4, X5, X6, X7, X8, X9), X3 lt; gt; 0, X3=X6, X3=X9, who_won (X3),! ._ win (1): - global_field ( X1, X2, X3, X4, X5, X6, X7, X8, X9), X1 lt; gt; 0, X1=X5, X1=X9, who_won (X1),! ._ win (1): - global_field (X1, X2, X3, X4, X5, X6, X7, X8, X9), X3 lt; gt; 0, X3=X5, X3=X7, who_won (X3),!.
find_win (0).
Якщо переможець знайдений викликається предикат who_won.
Предикат who_won додає переможцю очко, за допомогою предиката edit_global_score, «скидає» стан ігрового поля до вихідного edit_global_field (0,0,0,0,0,0,0,0,0), змінює стан ігрового процесу (закінчення гри) edit_global_game_end (1) і виводить повідомлення про переможця.
Якщо переможець не знайдений, то викликається предикат count_field, який перевіряє наявність вільних комірок на полі.
програма гра хрестики нулики
count_field (End): - glob...