Разработка программы с использованием языка логического программирования Prolog
Программный продукт для игры "Крестики-нолики". Описание пользовательского интерфейса. Факт базы данных, определяющий состояние счёта. Предикат изменяющий состояние игрового процесса и подсчитывающий количество занятых ячеек поля. Исходный код программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 19.05.2014 |
Размер файла | 34,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
[Введите текст]
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра вычислительной техники
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту по дисциплине: «Функциональное и логическое программирование»
Тема: Разработка программы с использованием языка логического программирования Prolog
Новосибирск 2010 г.
1. ОПИСАНИЕ НАЗНАЧЕНИЯ ПРОГРАММНОГО ПРОДУКТА
Настоящий программный продукт предназначен для игры «Крестики - нолики». «Крестики - нолики» - игра для двух участников, в которой игроки по очереди вписывают “x” или “o” в таблицу 3 x 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
Размещено на Allbest.ru
Подобные документы
Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.
курсовая работа [821,5 K], добавлен 13.02.2012Разработка программы для поиска пути в лабиринте с возможностью задания входа и выхода, наглядное представление решений. Использование языка логического программирования Prolog. Данные и методы решения. Пользовательский интерфейс, листинг программы.
реферат [14,3 K], добавлен 15.10.2012Разработка программы игры в крестики-нолики. Примеры игровой ситуации на игровом поле. Описание входных и выходных данных, переменных и функций программы. Реализация алгоритма работы программы на языке C++. Текст программы и примеры ее выполнения.
курсовая работа [352,8 K], добавлен 14.04.2011История возникновения и развития языка Prolog. Рассмотрение императивных и декларативных языков программирования. Элементы экспертной системы: база знаний, механизм вывода и система пользовательского интерфейса. Описание предикатов и предложений.
дипломная работа [44,0 K], добавлен 11.05.2014Проект программы "Крестики-нолики". Блок-схема алгоритма. Описание работы программного продукта. Инструкция по инсталляции. Инструкция программисту, возможность доработки с целью упрощения исполняемых кодов. Инструкция по проверке и тестированию.
курсовая работа [235,8 K], добавлен 05.12.2009Разработка аналога игры "Крестики-нолики", где игроки выбирают размер поля. Правила игры. Интерфейс программы. Главная функция main. Класс XO. Метод вывода поля и хода игроков. Методы поиска крестиков, ноликов. Методы проверки выигрышных ситуаций игроков.
курсовая работа [281,5 K], добавлен 30.01.2018Общая характеристика языков программирования. Краткий обзор C, C++, Java, PHP, Python, Delphi и Visual Basic. Процесс разработки программы игра "Крестики и нолики" с помощью AppWizard. Компиляция и компоновка модулей, определение интерфейса приложения.
курсовая работа [2,5 M], добавлен 27.05.2014Разработка популярной развлекательной игры крестики-нолики. Возможность играть с компьютером, который играет согласно созданному алгоритму. Новые возможности Visual Studio. Легкое усвоение программы. Удобный интерфейс - "визитная карточка" приложения.
курсовая работа [74,6 K], добавлен 20.12.2009Знакомство с интерфейсом пользователя и сценарием использования программы игры в крестики и нолики. Функциональные и нефункциональные требования для персонального компьютера. Исключительные ситуации и реакция программы. Пример кода игры и комментарии.
курсовая работа [236,5 K], добавлен 27.01.2014Разработка алгоритма, выполняющего поиск наилучшего решения на каждый ход в игре "крестики-нолики" (используя минимальный алгоритм). Обоснование выбора программных средств для решения задачи. Блок-схема интеллектуального алгоритма реализации программы.
контрольная работа [380,0 K], добавлен 28.04.2014