Автор работы: Пользователь скрыл имя, 09 Мая 2014 в 20:07, курсовая работа
Настоящий программный продукт предназначен для игры «Крестики - нолики». «Крестики - нолики» — игра для двух участников, в которой игроки по очереди вписывают “x” или “o” в таблицу 3 x 3. Цель игрока — первым заполнить строку, столбец или диагональ таблицы.
1 ОПИСАНИЕ НАЗНАЧЕНИЯ ПРОГРАММНОГО ПРОДУКТА 4
2 ОПИСАНИЕ ДАННЫХ 4
3 ОПИСАНИЕ МЕТОДОВ РЕШЕНИЯ 5
4 ОПИСАНИЕ ПРОГРАММЫ 10
5 ОПИСАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА 12
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 14
ПРИЛОЖЕНИЯ 14
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра |
вычислительной техники |
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
К КУРСОВОМУ ПРОЕКТУ ПО ДИСЦИПЛИНЕ
«ФУНКЦИОНАЛЬНОЕ И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ»
Тема: |
Разработка программы с использованием языка логического программирования Prolog. |
Студент: |
Группа: |
Преподаватель: |
Представлено к защите: |
Новосибирск 2010 г.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра |
вычислительной техники |
ЗАДАНИЕ НА КУРСОВОЙ ПРОЕКТ ПО ДИСЦИПЛИНЕ
«ФУНКЦИОНАЛЬНОЕ И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ»
Тема: |
Разработка программы с использованием языка логического программирования Prolog |
Срок представления к защите: |
16 учебная неделя |
Исходные данные и цель работы: |
|
Разработать программу для игры в крестики - нолики. | |
Игровое поле – 3х3 позиций. Программа должна работать в режиме | |
«человек-машина». | |
| |
Содержание пояснительной записки: |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
Настоящий программный продукт предназначен для игры «Крестики - нолики». «Крестики - нолики» — игра для двух участников, в которой игроки по очереди вписывают “x” или “o” в таблицу 3 x 3. Цель игрока — первым заполнить строку, столбец или диагональ таблицы.
Данными в программе являются 3 динамических факта для базы данных. Факты состоят из ряда полей:
Путём редактирования данных осуществляется игровой процесс. Используется целочисленный тип данных.
Рисунок 1. Пример игрового поля
В программе реализовано 2 режима:
Оба хода реализованы с помощью предиката game.
Ход пользователя.
Ход пользователя начинается с предиката game с параметром 1.
Предикат global_game_end(Endgame) выполняет проверку на случай окончания игры.
Далее выводится подсказка для пользователя, что его очередь ходить, и он должен ввести значение ячейки с номером ячейки для хода (нумерация по порядку слева на право).
Предикат make_move(1, Xod, XodEst) отвечает за выполнение хода.
Вспомогательный предикат scan_move проверяет возможность выполнения заданного хода.
scan_move(1,1) :- global_field(X1,_,_,_,_,_,_,_,
scan_move(2,1) :- global_field(_,X2,_,_,_,_,_,_,
scan_move(3,1) :- global_field(_,_,X3,_,_,_,_,_,
scan_move(4,1) :- global_field(_,_,_,X4,_,_,_,_,
scan_move(5,1) :- global_field(_,_,_,_,X5,_,_,_,
scan_move(6,1) :- global_field(_,_,_,_,_,X6,_,_,
scan_move(7,1) :- global_field(_,_,_,_,_,_,X7,_,
scan_move(8,1) :- global_field(_,_,_,_,_,_,_,X8,
scan_move(9,1) :- global_field(_,_,_,_,_,_,_,_,
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,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(0).
Если победитель найден вызывается предикат who_won.
Предикат who_won добавляет победителю очко, с
помощью предиката edit_global_score, «сбрасывает» состояние
игрового поля до исходного edit_global_field(0,0,0,0,0,0,
Если победитель не найден, то вызывается предикат count_field, который проверяет наличие свободных ячеек на поле.
count_field(End) :- global_field(X1,X2,X3,X4,X5,
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,_,_,_,_,_,_,_,
scan_move(2,1) :- global_field(_,X2,_,_,_,_,_,_,
scan_move(3,1) :- global_field(_,_,X3,_,_,_,_,_,
scan_move(4,1) :- global_field(_,_,_,X4,_,_,_,_,
scan_move(5,1) :- global_field(_,_,_,_,X5,_,_,_,
scan_move(6,1) :- global_field(_,_,_,_,_,X6,_,_,
scan_move(7,1) :- global_field(_,_,_,_,_,_,X7,_,
scan_move(8,1) :- global_field(_,_,_,_,_,_,_,X8,
scan_move(9,1) :- global_field(_,_,_,_,_,_,_,_,
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,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(0).
Если победитель найден вызывается предикат who_won.
Предикат who_won добавляет победителю очко, с
помощью предиката edit_global_score, «сбрасывает» состояние
игрового поля до исходного edit_global_field(0,0,0,0,0,0,
Если победитель не найден, то вызывается предикат count_field, который проверяет наличие свободных ячеек на поле.
count_field(End) :- global_field(X1,X2,X3,X4,X5,
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 и следует ход пользователя.
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) Предикат выполняющий ход игрока.
Информация о работе Разработка программы с использованием языка логического программирования Prolog