Описание пользовательского интерфейса
Стр 1 из 2Следующая ⇒ ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К курсовому проекту по дисциплине: «Функциональное и логическое программирование» Тема: Разработка программы с использованием языка логического программирования Prolog
Новосибирск 2010 г. ОПИСАНИЕ НАЗНАЧЕНИЯ ПРОГРАММНОГО ПРОДУКТА
Настоящий программный продукт предназначен для игры «Крестики - нолики». «Крестики - нолики» - игра для двух участников, в которой игроки по очереди вписывают “x” или “o” в таблицу 3 x 3. Цель игрока - первым заполнить строку, столбец или диагональ таблицы.
ОПИСАНИЕ ДАННЫХ
Данными в программе являются 3 динамических факта для базы данных. Факты состоят из ряда полей: первый факт содержит 9 полей, обозначающих текущую ситуацию на поле (рис. 1), второй факт содержит 2 поля, обозначающих текущий счет игры, третий факт содержит 1 поле и обозначает конец игры. Путём редактирования данных осуществляется игровой процесс. Используется целочисленный тип данных.
Рисунок 1 - Пример игрового поля
ОПИСАНИЕ МЕТОДОВ РЕШЕНИЯ
В программе реализовано 2 режима: Ход пользователя - в этом режиме обрабатывается ход пользователя; Ход компьютера - в этом режиме обрабатывается ход компьютера. Оба хода реализованы с помощью предиката game. Ход пользователя. Ход пользователя начинается с предиката game с параметром 1. Предикат global_game_end(Endgame) выполняет проверку на случай окончания игры. Далее выводится подсказка для пользователя, что его очередь ходить, и он должен ввести значение ячейки с номером ячейки для хода (нумерация по порядку слева на право). Предикат make_move(1, Xod, XodEst) отвечает за выполнение хода. Вспомогательный предикат scan_move проверяет возможность выполнения заданного хода.
scan_move(1,1):- global_field(X1,_,_,_,_,_,_,_,_), X1>0,!._move(2,1):- global_field(_,X2,_,_,_,_,_,_,_), X2>0,!._move(3,1):- global_field(_,_,X3,_,_,_,_,_,_), X3>0,!._move(4,1):- global_field(_,_,_,X4,_,_,_,_,_), X4>0,!._move(5,1):- global_field(_,_,_,_,X5,_,_,_,_), X5>0,!._move(6,1):- global_field(_,_,_,_,_,X6,_,_,_), X6>0,!._move(7,1):- global_field(_,_,_,_,_,_,X7,_,_), X7>0,!._move(8,1):- global_field(_,_,_,_,_,_,_,X8,_), X8>0,!._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),!._win(1):- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0, X4=X5,X4=X6, who_won(X4),!._win(1):- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X7<>0, X7=X8,X7=X9, who_won(X7),!._win(1):- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X4,X1=X7, who_won(X1),!._win(1):- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0, X2=X5,X2=X8, who_won(X2),!._win(1):- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0, X3=X6,X3=X9, who_won(X3),!._win(1):- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X5,X1=X9, who_won(X1),!._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),_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>0,!._move(2,1):- global_field(_,X2,_,_,_,_,_,_,_), X2>0,!._move(3,1):- global_field(_,_,X3,_,_,_,_,_,_), X3>0,!._move(4,1):- global_field(_,_,_,X4,_,_,_,_,_), X4>0,!._move(5,1):- global_field(_,_,_,_,X5,_,_,_,_), X5>0,!._move(6,1):- global_field(_,_,_,_,_,X6,_,_,_), X6>0,!._move(7,1):- global_field(_,_,_,_,_,_,X7,_,_), X7>0,!._move(8,1):- global_field(_,_,_,_,_,_,_,X8,_), X8>0,!._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),!._win(1):- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0, X4=X5,X4=X6, who_won(X4),!. 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 и следует ход пользователя.
ОПИСАНИЕ ПРОГРАММЫ
global_field (integer, integer, integer, integer, integer, integer, integer, integer, integer) Факт базы данных, определяющий состояние игрового поля._score (integer, integer) Факт базы данных, определяющий состояние счёта._game_end (integer) Факт базы данных определяющий конец игры.Предикат реализующий цикличный вывод главного меню.С данного предиката начинается программа. Предикат выводит на экран пункты меню и предлагает пользователю выбрать один из них.(integer) Предикат реализует выбор одного из пунктов меню._score () Предикат выводит на экран текущее состояние счёта._first () Предикат опрашивает пользователя о праве первого хода.(integer) Предикат выводит сообщение о том, кому принадлежит первый ход и запускает игру.(integer) Предикат, осуществляющий непосредственный игровой процесс в двух вариациях, в зависимости от ходящего. make_move (integer, integer, integer) Предикат выполняющий ход игрока._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) Предикат изменяющий состояние счёта в базе данных._global_game_end (integer) Предикат, изменяющий текущее состояние игрового процесса (конец игры)._field (integer) Предикат подсчитывающий количество занятых ячеек поля._empty (integer, integer) Вспомогательный предикат проверяющий ячейку поля на пустоту._win (integer) Предикат проверяющий наличие выигрышной комбинации на поле._won (integer) Предикат определяющий победителя раунда._move (integer, integer) Вспомогательный предикат, проверяющий возможность заданного хода._move (integer) Предикат определяющий ход компьютера._end_game (integer) Предикат проверяющий ситуацию окончания игры.
ОПИСАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА
Программа имеет простой пользовательский интерфейс: При запуске программы на экран выводиться главное меню (рис. 2):
Рисунок 2 - Главное меню
В соответствии с каждым пунктом меню пользователь получает возможность: начать новую игру, просмотреть текущий счёт, закончить игру. При выборе первого пункта пользователь видит опрос о праве первого хода (рис. 3):
Рисунок 3 - Право первого хода
Выбрав, кому будет принадлежать первый ход, пользователь начинает игровой процесс. На экран выводится игровое поле и сообщение о первом ходе (рис. 4).
Рисунок 4 - Игровое поле
Пользователю предлагается сделать ход (ввести порядковый номер ячейки, нумерация слева на право, куда пользователь хочет походить, если номер введён неправильно, выводится предложение о повторном вводе). По окончанию игры на экран выводится игровое поле и главное меню (рис. 5).
Рисунок 5 - Окончание игры
Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|