Помощь в написании студенческих работ
Антистрессовый сервис

Разработка программы с использованием языка логического программирования Prolog

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра вычислительной техники. Настоящий программный продукт предназначен для игры «Крестики — нолики». «Крестики — нолики» — игра для двух участников, в которой игроки… Читать ещё >

Разработка программы с использованием языка логического программирования Prolog (реферат, курсовая, диплом, контрольная)

[Введите текст]

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра вычислительной техники

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту по дисциплине: «Функциональное и логическое программирование»

Тема: Разработка программы с использованием языка логического программирования Prolog

Новосибирск 2010 г.

1. ОПИСАНИЕ НАЗНАЧЕНИЯ ПРОГРАММНОГО ПРОДУКТА

Настоящий программный продукт предназначен для игры «Крестики — нолики». «Крестики — нолики» — игра для двух участников, в которой игроки по очереди вписывают «x» или «o» в таблицу 3×3. Цель игрока — первым заполнить строку, столбец или диагональ таблицы.

2. ОПИСАНИЕ ДАННЫХ

Данными в программе являются 3 динамических факта для базы данных. Факты состоят из ряда полей:

первый факт содержит 9 полей, обозначающих текущую ситуацию на поле (рис. 1),

второй факт содержит 2 поля, обозначающих текущий счет игры, третий факт содержит 1 поле и обозначает конец игры.

Путём редактирования данных осуществляется игровой процесс. Используется целочисленный тип данных.

Рисунок 1 — Пример игрового поля

3. ОПИСАНИЕ МЕТОДОВ РЕШЕНИЯ

В программе реализовано 2 режима:

Ход пользователя — в этом режиме обрабатывается ход пользователя;

Ход компьютера — в этом режиме обрабатывается ход компьютера.

Оба хода реализованы с помощью предиката game.

Ход пользователя.

Ход пользователя начинается с предиката game с параметром 1.

Предикат global_game_end (Endgame) выполняет проверку на случай окончания игры.

Далее выводится подсказка для пользователя, что его очередь ходить, и он должен ввести значение ячейки с номером ячейки для хода (нумерация по порядку слева на право).

Предикат make_move (1, Xod, XodEst) отвечает за выполнение хода.

Вспомогательный предикат scan_move проверяет возможность выполнения заданного хода.

scan_move (1,1): — global_field (X1,_,_,_,_,_,_,_,_), X1>0 ,!.

scan_move (2,1): — global_field (_, X2,_,_,_,_,_,_,_), X2>0 ,!.

scan_move (3,1): — global_field (_,_, X3,_,_,_,_,_,_), X3>0 ,!.

scan_move (4,1): — global_field (_,_,_, X4,_,_,_,_,_), X4>0 ,!.

scan_move (5,1): — global_field (_,_,_,_, X5,_,_,_,_), X5>0 ,!.

scan_move (6,1): — global_field (_,_,_,_,_, X6,_,_,_), X6>0 ,!.

scan_move (7,1): — global_field (_,_,_,_,_,_, X7,_,_), X7>0 ,!.

scan_move (8,1): — global_field (_,_,_,_,_,_,_, X8,_), X8>0 ,!.

scan_move (9,1): — global_field (_,_,_,_,_,_,_,_, X9), X9>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<>0, X1=X2,X1=X3, who_won (X1),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0, X4=X5,X4=X6, who_won (X4),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X7<>0, X7=X8,X7=X9, who_won (X7),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X4,X1=X7, who_won (X1),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0, X2=X5,X2=X8, who_won (X2),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0, X3=X6,X3=X9, who_won (X3),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X5,X1=X9, who_won (X1),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>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),

scan_empty (X1,A),

scan_empty (X2,B),

scan_empty (X3,C),

scan_empty (X4,D),

scan_empty (X5,E),

scan_empty (X6,F),

scan_empty (X7,G),

scan_empty (X8,H),

scan_empty (X9,I),

End=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>0 ,!.

scan_move (2,1): — global_field (_, X2,_,_,_,_,_,_,_), X2>0 ,!.

scan_move (3,1): — global_field (_,_, X3,_,_,_,_,_,_), X3>0 ,!.

scan_move (4,1): — global_field (_,_,_, X4,_,_,_,_,_), X4>0 ,!.

scan_move (5,1): — global_field (_,_,_,_, X5,_,_,_,_), X5>0 ,!.

scan_move (6,1): — global_field (_,_,_,_,_, X6,_,_,_), X6>0 ,!.

scan_move (7,1): — global_field (_,_,_,_,_,_, X7,_,_), X7>0 ,!.

scan_move (8,1): — global_field (_,_,_,_,_,_,_, X8,_), X8>0 ,!.

scan_move (9,1): — global_field (_,_,_,_,_,_,_,_, X9), X9>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<>0, X1=X2,X1=X3, who_won (X1),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0, X4=X5,X4=X6, who_won (X4),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X7<>0, X7=X8,X7=X9, who_won (X7),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X4,X1=X7, who_won (X1),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0, X2=X5,X2=X8, who_won (X2),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0, X3=X6,X3=X9, who_won (X3),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X5,X1=X9, who_won (X1),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>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),

scan_empty (X1,A),

scan_empty (X2,B),

scan_empty (X3,C),

scan_empty (X4,D),

scan_empty (X5,E),

scan_empty (X6,F),

scan_empty (X7,G),

scan_empty (X8,H),

scan_empty (X9,I),

End=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 и следует ход пользователя.

4. ОПИСАНИЕ ПРОГРАММЫ

global_field (integer, integer, integer, integer, integer, integer, integer, integer, integer) Факт базы данных, определяющий состояние игрового поля.

global_score (integer, integer) Факт базы данных, определяющий состояние счёта.

global_game_end (integer) Факт базы данных определяющий конец игры.

repeat Предикат реализующий цикличный вывод главного меню.

menu С данного предиката начинается программа. Предикат выводит на экран пункты меню и предлагает пользователю выбрать один из них.

case (integer) Предикат реализует выбор одного из пунктов меню.

show_score () Предикат выводит на экран текущее состояние счёта.

who_first () Предикат опрашивает пользователя о праве первого хода.

first (integer) Предикат выводит сообщение о том, кому принадлежит первый ход и запускает игру.

game (integer) Предикат, осуществляющий непосредственный игровой процесс в двух вариациях, в зависимости от ходящего.

make_move (integer, integer, integer) Предикат выполняющий ход игрока.

draw_field (integer, integer, integer, integer, integer, integer, integer, integer, integer) Предикат выполняющий прорисовку игрового поля.

scan_x_o (integer) Вспомогательный предикат выбирающий символ необходимый для вывода в ячейку поля.

edit_global_field (integer, integer, integer, integer, integer, integer, integer, integer, integer) Предикат изменяющий состояние игрового поля в базе данных.

edit_global_score (integer) Предикат изменяющий состояние счёта в базе данных.

edit_global_game_end (integer) Предикат, изменяющий текущее состояние игрового процесса (конец игры).

count_field (integer) Предикат подсчитывающий количество занятых ячеек поля.

scan_empty (integer, integer) Вспомогательный предикат проверяющий ячейку поля на пустоту.

find_win (integer) Предикат проверяющий наличие выигрышной комбинации на поле.

who_won (integer) Предикат определяющий победителя раунда.

scan_move (integer, integer) Вспомогательный предикат, проверяющий возможность заданного хода.

select_move (integer) Предикат определяющий ход компьютера.

scan_end_game (integer) Предикат проверяющий ситуацию окончания игры.

5. ОПИСАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА

Программа имеет простой пользовательский интерфейс:

При запуске программы на экран выводиться главное меню (рис. 2):

Рисунок 2 — Главное меню В соответствии с каждым пунктом меню пользователь получает возможность:

начать новую игру, просмотреть текущий счёт, закончить игру.

При выборе первого пункта пользователь видит опрос о праве первого хода (рис. 3):

Рисунок 3 — Право первого хода Выбрав, кому будет принадлежать первый ход, пользователь начинает игровой процесс. На экран выводится игровое поле и сообщение о первом ходе (рис. 4).

Рисунок 4 — Игровое поле Пользователю предлагается сделать ход (ввести порядковый номер ячейки, нумерация слева на право, куда пользователь хочет походить, если номер введён неправильно, выводится предложение о повторном вводе).

По окончанию игры на экран выводится игровое поле и главное меню (рис. 5).

Рисунок 5 — Окончание игры

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Стерлинг Л., Шапиро Э. Искусство программирования на языке Пролог. — М.: Мир, 1990. — 333 с.

2. Братко И. Программирование на языке Пролог для искусственного интеллекта: Пер. с англ. — М.: Мир, 1990. 560 с., ил.

3. Материал из Википедии — свободной энциклопедии. — 2010. [Электронный ресурс]. URL: http://ru.wikipedia.org/wiki/ Крестики-нолики.

ПРИЛОЖЕНИЕ

Исходный код программы

%===================================================%

DATABASE — mydb

global_field (integer, integer, integer, integer, integer, integer, integer, integer, integer)

global_score (integer, integer)

global_game_end (integer)

%===================================================%

PREDICATES

repeat

case (integer)

menu

show_score ()

who_first ()

first (integer)

game (integer)

make_move (integer, integer, integer)

draw_field (integer, integer, integer, integer, integer, integer, integer, integer, integer)

scan_x_o (integer)

edit_global_field (integer, integer, integer, integer, integer, integer, integer, integer, integer)

edit_global_score (integer)

edit_global_game_end (integer)

count_field (integer)

scan_empty (integer, integer)

find_win (integer)

who_won (integer)

scan_move (integer, integer)

select_move (integer)

scan_end_game (integer)

%===================================================%

CLAUSES

scan_empty (0,NX): — NX=0.

scan_empty (_, NX): — NX=1.

count_field (End): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9),

scan_empty (X1,A),

scan_empty (X2,B),

scan_empty (X3,C),

scan_empty (X4,D),

scan_empty (X5,E),

scan_empty (X6,F),

scan_empty (X7,G),

scan_empty (X8,H),

scan_empty (X9,I),

End=A+B+C+D+E+F+G+H+I.

edit_global_score (1):;

global_score (You, Comp),

retract (global_score (_,_), mydb),

NewYou=You+1,

assertz (global_score (NewYou, Comp), mydb).

edit_global_score (2):;

global_score (You, Comp),

retract (global_score (_,_), mydb),

NewComp=Comp+1,

assertz (global_score (You, NewComp), mydb).

edit_global_score (_).

edit_global_game_end (X):;

retract (global_game_end (_), mydb),

assertz (global_game_end (X), mydb),!.

who_won (1): — edit_global_score (1), edit_global_field (0,0,0,0,0,0,0,0,0), edit_global_game_end (1), write («> You won! =)»), nl, nl,!.

who_won (2): — edit_global_score (2), edit_global_field (0,0,0,0,0,0,0,0,0), edit_global_game_end (1), write («> You lose.:(«), nl, nl,!.

who_won (_).

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X2,X1=X3, who_won (X1),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0, X4=X5,X4=X6, who_won (X4),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X7<>0, X7=X8,X7=X9, who_won (X7),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X4,X1=X7, who_won (X1),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0, X2=X5,X2=X8, who_won (X2),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0, X3=X6,X3=X9, who_won (X3),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X5,X1=X9, who_won (X1),!.

find_win (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0, X3=X5,X3=X7, who_won (X3),!.

find_win (0).

scan_move (1,1): — global_field (X1,_,_,_,_,_,_,_,_), X1>0 ,!.

scan_move (2,1): — global_field (_, X2,_,_,_,_,_,_,_), X2>0 ,!.

scan_move (3,1): — global_field (_,_, X3,_,_,_,_,_,_), X3>0 ,!.

scan_move (4,1): — global_field (_,_,_, X4,_,_,_,_,_), X4>0 ,!.

scan_move (5,1): — global_field (_,_,_,_, X5,_,_,_,_), X5>0 ,!.

scan_move (6,1): — global_field (_,_,_,_,_, X6,_,_,_), X6>0 ,!.

scan_move (7,1): — global_field (_,_,_,_,_,_, X7,_,_), X7>0 ,!.

scan_move (8,1): — global_field (_,_,_,_,_,_,_, X8,_), X8>0 ,!.

scan_move (9,1): — global_field (_,_,_,_,_,_,_,_, X9), X9>0 ,!.

scan_move (_, 0).

edit_global_field (NewX1,NewX2,NewX3,NewX4,NewX5,NewX6,NewX7,NewX8,NewX9):;

global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9),

retract (global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), mydb),

assertz (global_field (NewX1,NewX2,NewX3,NewX4,NewX5,NewX6,NewX7,NewX8,NewX9), mydb).

scan_x_o (1): — !, write («x»).

scan_x_o (2): — !, write («o»).

scan_x_o (0): — !, write (««).

draw_field (X1,X2,X3,X4,X5,X6,X7,X8,X9): — clearwindow,

write («——————-»), nl,

write («| «), scan_x_o (X1), write («| «), scan_x_o (X2), write («| «), scan_x_o (X3), write («|»), nl,

write («——————-»), nl,

write («| «), scan_x_o (X4), write («| «), scan_x_o (X5), write («| «), scan_x_o (X6), write («|»), nl,

write («——————-»), nl,

write («| «), scan_x_o (X7), write («| «), scan_x_o (X8), write («| «), scan_x_o (X9), write («|»), nl,

write («——————-»), nl, nl.

make_move (First, 1, 1): — scan_move (1,Pusto), Pusto<1,!, global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field (First, X2, X3,X4,X5,X6,X7,X8,X9), draw_field (First, X2, X3,X4,X5,X6,X7,X8,X9),!.

make_move (First, 2, 1): — scan_move (2,Pusto), Pusto<1,!, global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field (X1,First, X3, X4,X5,X6,X7,X8,X9), draw_field (X1,First, X3, X4,X5,X6,X7,X8,X9),!.

make_move (First, 3, 1): — scan_move (3,Pusto), Pusto<1,!, global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field (X1,X2,First, X4, X5,X6,X7,X8,X9), draw_field (X1,X2,First, X4, X5,X6,X7,X8,X9),!.

make_move (First, 4, 1): — scan_move (4,Pusto), Pusto<1,!, global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field (X1,X2,X3,First, X5, X6,X7,X8,X9), draw_field (X1,X2,X3,First, X5, X6,X7,X8,X9),!.

make_move (First, 5, 1): — scan_move (5,Pusto), Pusto<1,!, global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field (X1,X2,X3,X4,First, X6, X7,X8,X9), draw_field (X1,X2,X3,X4,First, X6, X7,X8,X9),!.

make_move (First, 6, 1): — scan_move (6,Pusto), Pusto<1,!, global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field (X1,X2,X3,X4,X5,First, X7, X8,X9), draw_field (X1,X2,X3,X4,X5,First, X7, X8,X9),!.

make_move (First, 7, 1): — scan_move (7,Pusto), Pusto<1,!, global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field (X1,X2,X3,X4,X5,X6,First, X8, X9), draw_field (X1,X2,X3,X4,X5,X6,First, X8, X9),!.

make_move (First, 8, 1): — scan_move (8,Pusto), Pusto<1,!, global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field (X1,X2,X3,X4,X5,X6,X7,First, X9), draw_field (X1,X2,X3,X4,X5,X6,X7,First, X9),!.

make_move (First, 9, 1): — scan_move (9,Pusto), Pusto<1,!, global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field (X1,X2,X3,X4,X5,X6,X7,X8,First), draw_field (X1,X2,X3,X4,X5,X6,X7,X8,First),!.

make_move (_,_, 0): — !.

scan_end_game (9):-edit_global_game_end (1).

scan_end_game (_).

game (1):;

global_game_end (Endgame), Endgame=0,!,

write («Your step (1−9): «), readint (Xod),

make_move (1, Xod, XodEst), XodEst>0,

find_win (Find_win), Find_win<1 ,!,

count_field (End), scan_end_game (End),

game (2).

game (1): — global_game_end (End), End=0,!, game (1).

game (2):;

global_game_end (Endgame), Endgame=0,!,

select_move (Xod),

%write («Computer's lead: «, Xod), nl, readchar (QWERTY),

make_move (2, Xod, XodEst), XodEst>0,

find_win (Find_win), Find_win<1 ,!,

count_field (End), scan_end_game (End),

game (1).

game (2): — global_game_end (End), End=0,!, game (2).

game (_):-!.

first (1): — draw_field (0,0,0,0,0,0,0,0,0),

write («> Your step is the first!»), nl, nl,

game (1), menu.

first (2): — draw_field (0,0,0,0,0,0,0,0,0),

write («> Your step is the second»), readchar (JKHBVJD), nl, nl,

game (2), menu.

first (_): — clearwindow, write («>! Incorrect input ! Please try again.»), nl, nl, who_first ().

who_first ():;

write («The first step?»), nl, nl,

write («1. You’s»), nl,

write («2. Computer’s»), nl,

write («=>»), readint (Select), nl,

first (Select).

show_score ():;

global_score (You, Comp),

write («You: «), write (You), nl,

write («Computer: «), write (Comp).

select_move (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0,X3<>0,X4<>0,X5<>0,X6<>0,X7<>0,X8<>0,X9<>0,!.

select_move (2): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X3<>0,X4<>0,X5<>0,X6<>0,X7<>0,X8<>0,X9<>0,!.

select_move (3): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X4<>0,X5<>0,X6<>0,X7<>0,X8<>0,X9<>0,!.

select_move (4): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X5<>0,X6<>0,X7<>0,X8<>0,X9<>0,!.

select_move (5): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X4<>0,X6<>0,X7<>0,X8<>0,X9<>0,!.

select_move (6): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X4<>0,X5<>0,X7<>0,X8<>0,X9<>0,!.

select_move (7): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X4<>0,X5<>0,X6<>0,X8<>0,X9<>0,!.

select_move (8): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X4<>0,X5<>0,X6<>0,X7<>0,X9<>0,!.

select_move (9): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X4<>0,X5<>0,X6<>0,X7<>0,X8<>0,!.

%

select_move (3): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X2,X3=0,!.

select_move (6): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0,X4=X5,X6=0,!.

select_move (9): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X7<>0,X7=X8,X9=0,!.

select_move (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0,X2=X3,X1=0,!.

select_move (4): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X5<>0,X5=X6,X4=0,!.

select_move (7): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X8<>0,X8=X9,X7=0,!.

select_move (7): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X4,X7=0,!.

select_move (8): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0,X2=X5,X8=0,!.

select_move (9): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0,X3=X6,X9=0,!.

select_move (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0,X4=X7,X1=0,!.

select_move (2): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X5<>0,X5=X8,X2=0,!.

select_move (3): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X6<>0,X6=X9,X3=0,!.

select_move (9): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X5,X9=0,!.

select_move (1): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X5<>0,X5=X9,X1=0,!.

select_move (7): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X5<>0,X5=X3,X7=0,!.

select_move (3): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X5<>0,X5=X7,X3=0,!.

select_move (2): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X3,X2=0,!.

select_move (5): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0,X4=X6,X5=0,!.

select_move (8): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X7<>0,X7=X9,X8=0,!.

select_move (4): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X7,X4=0,!.

select_move (5): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0,X2=X8,X5=0,!.

select_move (6): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0,X3=X9,X6=0,!.

select_move (5): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X9,X5=0,!.

select_move (5): — global_field (X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0,X3=X7,X5=0,!.

select_move (Xod): — random (8,TempXod), Xod=TempXod+1,!.

case (1): — clearwindow, write («New Game»), nl,

edit_global_game_end (0), edit_global_field (0,0,0,0,0,0,0,0,0),

nl, who_first (), nl, nl.

case (2): — clearwindow, write («Score»), nl, show_score (), nl, nl, fail.

case (0):-!.

case (_).

menu:-nl, repeat,

write («Crosses and zeroes»), nl, nl,

write («1. New Game»), nl,

write («2. Score»), nl,

write («0. Exit»), nl,

write («=>»), readint (Choice),

case (Choice), Choice=0.

repeat.

repeat:-repeat.

%=============================================================================%

GOAL

trace (off),

clearwindow,

assertz (global_game_end (0), mydb),

assertz (global_field (0,0,0,0,0,0,0,0,0), mydb),

assertz (global_score (0,0), mydb),

menu

Показать весь текст
Заполнить форму текущей работой