Министерство
Образования Российской Федерации Кафедра Автоматики Курсовая работа по Функциональному и Логическому программированию Вариант: 2 Группа: АП-318 Студент: Иванчиков И.В. Преподаватель: Новицкая Ю.В. г. Новосибирск. 2005 г. |
Задание
Разработать программу для игры в морской бой. Игровое поле – 10х10 позиций. Корабли на игровом поле: четыре одноклеточных, три двухклеточных, два трехклеточных и один четырехклеточный. Корабли расставляются случайным образом. Программа должна работать в режиме «человек-машина».
Описание данных
Для реализации данной базы данных естественным является использование составных доменов. В данной программе их несколько. Это координаты клетки, состояние клетки, описание одной клетки поля, эти домены в программе выглядят следующим образом:
position=pole(integer, integer)
type=integer
kletka=kletka(position,type)
Также в программе использовался списочный домен, описывающий список целых переменных list=integer*. Координаты клетки обозначены в программе целыми числами X, Y. Для поля противника X и Y лежат в пределах от 0 до 9, для нашего поля X изменяется от 0 до 9, Y лежит в пределах от 15 до 25. Состояние клетки обозначается целым числом: отрицательным значением в диапазоне от -4 до -1 обозначается соответствующий корабль в «не стреляной» клетке, значением 0 обозначается «не стреляная» пустая клетка, значением в диапазоне от 1 до 4 – соответствующий раненый корабль, значением 5 – «стреляная» пустая клетка, значением в диапазоне от 6 до 9 - соответствующий убитый корабль. Домен kletka содержит координаты клетки и число, описывающее состояние этой клетки.
Для хранения информации о состоянии клеток нашего поля и поля противника в программе использовались две динамические базы данных: mypole и pole. Динамическая база данных, характеризующая наше поле называется mypole и содержит факты вида mykl(kletka), которые содержат информацию о состоянии каждой из ста клеток нашего поля. База данных противника называется pole и содержит факты двух видов:
kl(kletka)
pl(kletka)
Первые факты хранят информацию о состоянии всех клеток, а вторые – о возможных «раненых» кораблях. В процессе выполнения программы данные в динамических базах данных изменяются (удаляются и записываются вновь с измененными параметрами), в конце программы все базы данных очищаются.
Описание методов решения
На поле каждого игрока могут разместиться 10 кораблей: 1 четырехпалубный, 2 трехпалубных, 3 двухпалубных, и 4 однопалубных. Заполнение поля противника происходит случайным образом. Первоначально в базу данных добавляются факты, характеризующие все клетки поля состоянием 10. Далее случайным образом выбирается позиция для четырехпалубного корабля, в базу данных добавляются факты, описывающие этот корабль, и факты, описывающие состояние соседних «пустых» клеток. Затем случайным образом выбираются позиции для остальных кораблей в порядке убывания их размера. Для каждой выбранной позиции проверяется, есть ли факты с такими же координатами в базе данных или нет, если факты в базе данных присутствуют, то координаты генерируются случайным образом еще раз, если таких координат в базе данных нет, то туда добавляются новые факты, соответствующие добавленному кораблю. Затем добавляются факты, описывающие остающиеся «пустые» клетки поля. Пустыми оказываются все клети, для которых состояние осталось равным 10.
При выводе поля противника на экран «не стреляные клетки » обозначаются символом ‘*’, пустые - ‘-’, раненые и убитые корабли - символом ‘X’. Для извлечение информации из базы данных для всех клеток используется встроенный предикат fail (механизм поиска с возвратом).
Заполнение нашего поля возможно в двух вариантах: автоматическом и в диалоге с пользователем. Для заполнение задаются крайние левая и верхняя координаты помещаемого корабля, а также расположение корабля: вертикальное – 0, горизонтальное – 1. Первоначально поле заполняется пустыми клетками. Для добавления информации о корабле в базу данных, его координаты формируются в список. Проверки на дублирование клеток не происходит. В автоматическом режиме происходит заполнение поля по заданным в программе координатам. В диалоговом режиме необходимая информация постепенно считывается с клавиатуры.
При выводе на экран нашего поля «не стреляный» корабль обозначается символом ‘0’ , пустая «не стреляная » клетка – символом ‘*’, «стреляная» клетка - символом ‘-’, убитый и раненый корабль - символом ‘X’.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.