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

Автор работы: Пользователь скрыл имя, 09 Мая 2014 в 20:07, курсовая работа

Описание работы

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

Содержание работы

1 ОПИСАНИЕ НАЗНАЧЕНИЯ ПРОГРАММНОГО ПРОДУКТА 4
2 ОПИСАНИЕ ДАННЫХ 4
3 ОПИСАНИЕ МЕТОДОВ РЕШЕНИЯ 5
4 ОПИСАНИЕ ПРОГРАММЫ 10
5 ОПИСАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА 12
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 14
ПРИЛОЖЕНИЯ 14

Файлы: 1 файл

Курсовая работа.docx

— 46.62 Кб (Скачать файл)

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ


 

Кафедра

вычислительной техники


 

 

 

 

 

 

 

 

 

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

К КУРСОВОМУ ПРОЕКТУ ПО ДИСЦИПЛИНЕ

«ФУНКЦИОНАЛЬНОЕ И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ»

 

 

 

 

Тема:

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


 

Студент:

 

 

Группа:

 

 

 

 

 

 

 

Преподаватель:

 

 

Представлено к защите:

 

 

 

 

 

 

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

 

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ


 

Кафедра

вычислительной техники


 

 

 

 

ЗАДАНИЕ НА КУРСОВОЙ ПРОЕКТ ПО ДИСЦИПЛИНЕ

«ФУНКЦИОНАЛЬНОЕ И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ»

 

 

 

Тема:

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


 

Срок представления к защите:

16 учебная неделя


 

Исходные данные и цель работы:

 

Разработать программу для игры в крестики - нолики.

Игровое поле – 3х3 позиций. Программа должна работать в режиме

«человек-машина».

 

 
 
 
 
 

 

Содержание пояснительной записки:

 
  • титульный лист;
  • задание на курсовой проект;
  • содержание;
  • описание назначения программного продукта;
  • описание данных;
  • описание методов решения;
  • описание программы;
  • описание пользовательского интерфейса;
  • список использованных источников;
  • приложение (исходные коды с комментариями).

СОДЕРЖАНИЕ

 

 

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

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

 

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

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

  1. первый факт содержит 9 полей, обозначающих текущую ситуацию на поле (рис. 1).
  2. второй факт содержит 2 поля, обозначающих текущий счет игры.
  3. третий факт содержит 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) Предикат выполняющий ход игрока.

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