Курсовая на тему Создание игровой программы Морской бой
Работа добавлена на сайт bukvasha.net: 2015-07-01Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
СОДЕРЖАНИЕ
Введение
1. Программирование игр с использованием визуальных компонентов
1.1 Аналитический обзор
1.2 Описание операторов, используемых при реализации практической части курсовой работы
2. Разработка программы
2.1 Постановка задачи
2.2 Алгоритм реализации работы
3. Блок-схема
Заключение
Список используемой литературы
ВВЕДЕНИЕ
"ИГРА - вид непродуктивной деятельности, мотив которой заключается не в ее результатах, а в самом процессе. В истории человеческого общества переплеталась с магией, культовым поведением и др. ... Свойственна также высшим животным".
Советский энциклопедический словарь
Все, кто имеет дело с компьютером, так или иначе сталкивались с компьютерными играми, и подавляющее большинство может сходу назвать несколько игр, которые им особенно понравились. Те, кто уже совсем наигрался, почти наигрался или еше не наигрался, но в процессе общения с компьютером уже начал совмещать игры с чем-нибудь более полезным, возможно, хотели бы придумать какие-нибудь свои, не похожие ни на какие другие игры.
Многое захватывает в таком творчестве. И не сам процесс игры, а разработка игровой вселенной, ее проектирование и реализация. Когда можно слить воедино сценарий, графику, музыку, искусно задуманный и умело запрограммированный алгоритм — создать единый фантастический мир, живущий по законам, которые ты же для него и придумал.
В данной курсовой работе речь пойдет о создании несложной игровой программы «Морской бой», которая и будет являться объектом исследования. В первой главе данной курсовой работы рассматриваются аспекты программирования игр с использованием визуальных компонентов. Во второй главе приведены этапы разработки программы, такие как постановка задачи и алгоритм реализации.
В заключении приведены выводы по курсовой работе, достоинства и недостатки визуальных методов программирования.
Список использованных источников содержит полный перечень технической литературы, использованной для написания данной курсовой работы.
1. ПРОГРАММИРОВАНИЕ ИГР С ИСПОЛЬЗОВАНИЕМ ВИЗУАЛЬНЫХ КОМПОНЕНТОВ
1.1 Аналитический обзор
В последнее время продажи программного обеспечения увеличиваются незначительно, в то время как продажи игровых программ возрастают экспоненциально. Игры для платформы Windows составляют подавляющее большинство. Игровое программное обеспечение – это третья по размерам доходов отрасль индустрии программного обеспечения после текстовых процессоров и электронных таблиц.
До недавнего времени среда Windows использовалась в основном как платформа для создания игр, первоначально разработанных для Macintosh. Это осуществлялось на базе пакета QuickTime фирмы Apple. Примерами таких игр могут быть Mysl (Broderbund/Cyan), Wrath of the Gods (Maxis/Luminaria) и некоторые другие. В ряде случаев использовался пакет Video for Windows, позволяющий отображать оцифрованное видео. Затем появились библиотеки WinG и WinToon, на базе которых фирма Sierra создала игру King's Quest VII. Это были первые попытки использовать Windows как платформу для создания игровых программ. Преимущества такого подхода достаточно очевидны — единый интерфейс, наличие стандартных драйверов для большинства мультимедийных устройств и возможность управления ими стандартными способами. Затем появилась новая версия — Windows 95, в состав которой была включена библиотека WinG (как подсистема GDI), и перед разработчиками открылись более широкие возможности.
Указать точное число компьютерных игр очень трудно. Можно только примерно оценить число различных наименований игр, находящихся на рынке в любое время .
Классификация компьютерных игр может быть следующая:
1. Приключенческие игры. Игры могут быть великолепным средством рассказа истории. Эти игры представляют собой мультиплицированный рассказ, в котором можно видеть и контролировать основной персонаж (а иногда и более одного) в очень детальном повествовании. Это - компьютерные версии обычных повествований, начиная от душещипательных рассказов до технотриллеров, научно-фантастических приключений, фантазий и рассказов, до предела набитых разными обманами и мошенничествами.
Приключенческие игры развиваются вокруг различных загадок и препятствий, которые нужно преодолеть по мере развития рассказа.
2. Фантастические игры, в которых требуется играть некоторую роль (ролевые игры). Их лучше всего определить как компьютеризованную версию рассказа Dungeons and Dragons («Подземелья и драконы»), но действие не всегда происходит в населенном варварами средневековом мире. Часто оно происходит в открытом космосе или в каких-либо областях будущего. В этих играх обычно нужно управлять группой персонажей, которые становятся по мере развития игры сильнее и умнее, и делать некоторые другие вещи. Так же изменяются и враги. Сами рассказы в играх этого типа обычно менее детальны, чем в приключенческих играх, с большим упором на задачу побить чудовгщ, чем решить загадки.
3. Имитаторы воздушных и космических сражений. Это не военные игры, в которых может оказаться неограниченное число вооружений и врагов, эти игры пытаются быть точными имитаторами полетов и сражений на реальных боевых самолетах. Эти игры предназначены для тех, кто хочет летать на больших и очень мощных машинах. Кабины пилотов выглядят как настоящие, инструменты работают как в настоящем бою, оружие является имитацией реально существующего, а полетные характеристики самолета (и самолета врага) соответствуют действительным. Имитаторы космических сражений выдуманы, однако они разработаны с целью точно повторить реальные маневры в космосе.
4. Имитаторы наземных и морских сражений. Игры разработаны для военного оборудования и военных машин. Эта категория игр включает в себя симуляторы настоящих подводных лодок, кораблей и танков, и позволяет игрокам испытать реальные сценарии сражений, и выжить для того, чтобы понять, как использовать правильную тактику в следующей игре.
5. Самолеты, поезда и автомобили. В отличие от этих имитаторов, все прочие являются имитаторами военного типа или имеют очень сильный упор на сражение. Эти же игры не относятся к таким имитаторам. Конечно, можно проехать на автомобиле по береговой дороге в Калифорнии со скоростью, вдвое превышающей разрешенную, и потанцевать на всех четырех колесах. Но также можно использовать эти игры, чтобы научиться безопасно летать среди облаков, и получать удовольствие от свободы полета. Даже можно делать такие вещи, как постройка и управление собственной железной дорогой.
6. Спортивные имитаторы. Здесь необходимо обучать профессионалов и управлять ими. Эти игры - нечто большее, чем простое изображение бейсбольных игр в картинках, в некоторых из них можно даже контролировать реальное действие. Спортивные имитаторы дают возможность вести рискованную игру в нужное время, доказать, что можно выиграть с помощью быстроты, иметь в команде Генри Аарона и Теда Вильямса, или переиграть Томми Лазорду.
7. Аркадные игры/игры действия. Это классические «игры действия» - все зависит от того, насколько быстро руки могут дергать джойстик. Обычно о них говорят как о бессмысленных, так часто и бывает. С другой стороны, бывают времена, когда появится потребность дать отдохнуть мозгам. Во многие из этих игр можно играть с помощью клавиатуры или мыши, и джойстики не всегда необходимы. В чем есть необходимость, так это в быстрых рефлексах.
8. Настольные игры, солитер и салонные игры. Многие старые любимые игры появились в компьютерном варианте. Больше не нужно заниматься поисками партнера, чтобы поиграть в шахматы, бэкграммон и риск. Некоторые из этих игр даже научат мошенничать наедине с монитором, и при этом не придется возвращаться домой с пустым карманом после неудачной ночи.
9. Имитаторы реальности («игры в бога»). Это игры, которые позволяют создавать реальный мир из ничего. Это игры, которые позволят создать компьютерный мир из набросков, управлять городом, страной или даже миром.
10. Игры, в которых делаются деньги. Они копируют игровую деятельность и учат высшим формам азартных предприятий: фондовая биржа, торговля недвижимостью. Они также позволят попробовать управлять корпорацией. В эти игры можно играть для удовольствия, или использовать их для того, чтобы научиться карабкаться вверх по лестнице карьеры.
11. Стратегические и военные имитаторы. Здесь можно принимать участие в великих исторических событиях, взять на себя командование немецкой армией у Ленинграда или армией Наполеона у Ватерлоо. Это военные стратегии прошлого, настоящего или будущего.
12. Игры для детей. Если есть домашний компьютер, и чтобы дети научились его использовать, то эти игры достойны внимания. Реальность нашей культуры такова, что, как только малыши станут координированы настолько, чтобы правильно пользоваться клавиатурой или мышью, они хотят сразу приняться за такие игры, как Wing Commander, Populous или Eye of the Beholder. Однако же вокруг существует множество игр, в которые дети могут играть просто чтобы получить удовольствие, или же научиться чему-либо.
13. Игры «On-line». Было бы ошибкой считать, что все компьютерные игры для IBM PC приходят к нам на дискетах или CD-дисках, плотно упакованных в красивые пакеты. Фактически, весь обширный мир компьютерных игр доступен и по телефону. Эта категория игр известна как «он-лайн» и включает в себя разнообразные игры, которые имеются в больших коммерческих «он-лайн» сетях и во многих локальных сетях типа «доска объявлений» (bulletin board system — BBS). Для игр «он-лайн», кроме личного компьютера, необходимы модем и кредитная карточка..
14. Игры Shareware. Будет ошибкой предположить, что все компьютерные игры приходят в красивых упаковках. Многие хорошие игры приходят вовсе без упаковок, и стоят от 10 до 30 долларов. Обычно можно их опробовать за очень низкую плату или вовсе бесплатно в течение нескольких дней и, если захочется получить легальную копию, следует послать по почте чек компании или лицу, которые создали игру.
15. Классические игры. Мир PC-игр во многом похож на мир популярной музыки и фильмов: создается много игр различных наименований, некоторые становятся хитами и держат популярность в течение некоторого времени, другие пропадают. Постепенно эти хиты становится трудно отыскать, и мало-помалу они заменяются другими лучшими играми. Очень мало PC-игр живут более 2-3 лет. Из тех, что действительно остаются, многие настолько хороши, что становятся вечными, и они заслуживают того, чтобы в них играли. Некоторые, как Flight Simulator или King's Quest, обновляются время от времени, так что их можно рассматривать как практически новые игры. Остальные остаются неизменными, и уровень продаж у них таков, что они остаются в обращении, но уже не рекламируются активно их производителями. Это игры, которые не бросаются в глаза, «золотые» игры — классические PC-игры.
Компьютерные игры — отнюдь не новое изобретение. Их история началась не с конца 1970 годов. Начало лежит гораздо раньше, тогда, когда Джон Кеннеди уже пробыл президентом Соединенных Штатов всего несколько месяцев .
На самом деле все началось с модели железной дороги. Студенты Технологического института в Массачусетсе были немало удивлены количеством способов, с помощью которых можно было разместить органы управления миниатюрной железной дорогой. Позднее, когда они наконец получили возможность работать на больших компьютерах института, их работа в бинарных вычислениях — ведь именно такие вычисления имитируются выключателями железной дороги — позволили им пройти хорошую подготовку в компьютерном деле. Стив Рассел был одним из членов Клуба Моделей Железных дорог Высокой Технологии в Технологическом институте. Будучи хорошим программистом, он летом 1961 года работал
в Статистической лаборатории, когда у него и его друзей появилась идея перенести «мыльные» научно-фантастические рассказы Е.Е.Смита на компьютеры. В 1962 году Стив разработал программу для PDP-1. Эта самая машина теперь выставлена в компьютерном музее Бостона в Массачусетском Технологическом институте. В «Космической Войне», как называлась эта программа, два синтезированных компьютером ракетных космических корабля (один похожий на толстую сигару, а другой на длинную обтекаемую трубу) могли летать по экрану, на котором помещалось изображение космоса. Игроки могли нажимать на кнопки, чтобы заставить ракеты менять направление движения почти так же, как позднее в игре Asteroids владельцы игровых машин Atari управляли своими кораблями. Каждая ракета несла на себе 31 торпеду, и, в то время как они летели по экрану, игрок мог выстрелить точечку из носа своей ракеты в направлении другой. Если точка действительно пересекала очертания другого корабля, программа определяла, что торпеда успешно поразила другой корабль и другой корабль «взрывался». Взорванный корабль пропадал с экрана и заменялся нагромождением точек, которые изображали его остатки.
Конечно, общество программистов и взломщиков программ не может удовлетвориться качеством любой программы, независимо от того, насколько она легка или интересна. Изменения были неизбежны. Один из друзей программиста, будучи недовольным случайным образом построенной картой звездного неба, которую Рассел первоначально поместил в игру, взял звездный атлас и ухитрился запрограммировать нашу собственную галактику, вплоть до звезд пятой величины. Другой добавил гравитацию в игру, а третий ввел возможность побега в гиперпространство, при этом, чтобы показать место, где корабль покинул звездную систему, на экране оставался след ускорения.
Даже Рассел сделал некоторые изменения. Зная, что у настоящих торпед вероятность поражения цели не 100%, а меньше, он решил придать звездным торпедам возможность ошибки, и добавить случайный элемент в траектории ракет и время взрыва. Его друзья терпеть не могли новую версию, поскольку они хотели бы иметь в игре ту же степень уверенности, которая существовала в программировании. Рассел вернул программу к прежней версии и, не успели оглянуться, как «Космические войны» оккупировали компьютеры колледжей по всей стране. «Космические войны» стали настолько популярны к середине шестидесятых, что Нолан Бушнелл, создатель Atari, очень привязался к игре во время учебы в университете штата Юты. К 1970 году Бушнелл построил свою собственную машину, использовав 185 встроенных цепей для подсоединения к телевизору и для выполнения одной-единственной функции. Эта функция была игрой «Компьютерный Космос», вариант «Космических Войн», в котором ракета сражалась с летающими тарелками вместо другого корабля. «Космические Войны» были не единственным предшественником коммерческих компьютерных игр, появившихся на больших компьютерах в колледжах. Какой-то неизвестный автор начал играть в игру Star Trek («Звездный путь») в шестидесятых годах. Никто не знает, кто первым создал такую игру — он или она, вероятно, подали бы судебный иск, если бы автор игры был точно определен — но эта игра также появилась на колледжских компьютерах по всей стране к 1969 году. Игра «Звездный путь» сама по себе была не очень изощренной. В игре были линии наподобие решеток, которые позволяли звездным кораблям путешествовать от одной точки к другой, игра использовала символы для идентификации кораблей, предоставляла численную информацию в процентах, и позволяла летать быстрее, чем скорость света. К середине 70-х годов почти на каждой домашней компьютерной системе была доступна та или иная форма этой игры. Существовала версия этой же игры для IBM под названием Star Fleet («Звездный Флот»). Наконец, стоит упомянуть пожалуй наиболее важную игру, Adventure («Приключения»). В игре использовались двухсловные команды, имя ее разработчика Вилл Краудер. Это была первая приключенческая компьютерная игра. Кроме того, в конце 70-х была создана игра по имени Zork, которая стала доступна для пользователей домашних компьютеров в 1981 году. Эту игру до сих пор можно купить. Игра Zork основывается на игре Adventure.
1.2 Описание операторов, используемых при реализации практической части курсовой работы
В практической части данной курсовой работы используются следующие операторы среды программирования Turbo Pascal.
Структурные операторы
Оператор if…then…
Оператор if…then… называется условным оператором и имеет вид:
If expression1 then statement1;
где выражение expression1 является логическим. Логическое выражение принимает одно из двух возможных значений – True (истина) или False (ложь). Часто в роли логического выражения выступает какое-то условие, которое может выполнять либо нет. В первом случае его значение – «истина»,а во втором – «ложь». Если логическое выражение expression1 принимает значение «истина», то выполняется оператор statement1. В противном случае выполняется будет оператор, следующий за данным логическим оператором.
Оператор if…then…else…
Этот оператор является полной версией условного оператора и имеет вид:
If expression then statement1 else statement2;
Выполняется данный оператор следующим образом: если выражение expression принимает значение «истина», то управление передается на оператор statement1, если же нет, то на оператор statement2.
Оператор case…of…end
Для ситуации, где имеется несколько (три или более) альтернатив, больше подходит оператор case. Этот оператор называется оператором выбора и имеет следующий вид:
case expression of
values_1: statement_1;
values_2: statement_2;
…
values_n: statement_n;
else statement;
end;
Рассмотрим элементы этой конструкции. Во-первых, это три зарезервированных слова: case, of и end. Между case и of находится выражение expression, принимающее значение, которое, возможно, имеется в одном из списков значений, находящихся слева от двоеточий. Данное выражение называется селектором оператора case. Каждый оператор, идущий за двоеточием, отделяется от следующего списка значений точкой запятой. Ветвь else, отвечающая всем не перечисленным значениям выражения expression, необязательна. При выполнении данного оператора вначале вычисляется значение селектора. Затем выбирается тот список значений, которому принадлежит полученное значение, и выполняется соответствующий оператор.
Оператор цикла while…do…
Оператор цикла является важнейшим оператором и имеется в большинстве современных языков программирования. Цикл позволяет много кратно выполнить некоторое множество действий, задаваемых операторами, составляющими его тело. В Паскале имеется несколько разновидностей оператора цикла. Начнем с оператора цикла с предусловием. Данный оператор имеет вид:
While expression do statement ;
При выполнении этого оператора вначале вычисляется значение логического выражения expression. Если это значение истинно, выполняется оператор statement, затем значение выражения проверяется вновь и т. д., до тех пор, пока выражение не примет значений «ложь». Если выражение принимает значение «ложь» при первой же проверке, то оператор statement не выполняется вообще.
Операторы цикла repeat…until…
Оператор цикла с постусловием имеет вид:
Repeat statement until expression:
Здесь вначале выполняется оператор statement, а затем вычисляется значение логического выражения expression принимает значение «ложь». Как только это значение станет истинным, выполнение цикла прекращается.
Операторы цикла for…to…do… и for…downto…do…
Третий вариант оператора цикла – цикл со счетчиком. Можно считать, что есть две очень похожих друг на друга разновидности цикла со счетчиком. Первый из этих операторов имеет вид:
For j := expression1 to expression2 do statement;
Здесь переменная j, называемая управляющей переменной цикла for, является произвольным идентификатором, который объявляется как переменная любого скалярного типа (к скалярным относится целый, символьный, булев и перечислимые типы).
При выполнении оператора for сначала вычисляется значение выражения expression1, затем вычисляется значение выражения expression2, далее управляющая переменная цикла последовательно пробегает все значения от expression1 до expression2. В том случае, когда значение expression1 оказывается больше значения expression2, тело цикла не будет выполнятся вовсе.
2. РАЗРАБОТКА ПРОГРАММЫ
2.1 Постановка задачи
Составить программу для игры в «Морской бой» игрока с компьютером. Программа должна позволять расставлять корабли на поле 10 х 10, контролировать правильность их расстановки, давать противникам возможность поочередно делать ходы и выдавать соответствующие информационные сообщения. Когда в качестве игрока выступает компьютер, программа должна анализировать предыдущие ходы и следующий ход делать на основе проведенного анализа.
2.2 Алгоритм реализации работы
Алгоритм размещения кораблей на игровом поле
Игровое поле нужно как-то хранить в памяти компьютера. Наиболее простая реализация - в виде матрицы 10x10 клеток (ячеек). Определим соответствующий тип и переменные, которые нам понадобятся:
type TPole = array[1..10,1..10] of Integer; var Pole: TPole; |
Обусловимся, что пустая ячейка будет иметь значение -1, а ячейка, в которой находится корабль: 0. Перед началом процесса размещения кораблей необходимо очистить поле. Помимо этого надо еще и обновить счетчик случайных чисел, что бы добиться реальной случайности позиций флота компьютера. Все эти действия лучше оформить в виде отдельной процедуры:
procedure Init (var Pole: TPole); var X, Y: Integer; begin Randomize; for X := 1 to 10 do for Y := 1 to 10 do Pole[X,Y] := -1; end; {proc Init} |
По правилам игры два корабля не могут соприкасаться друг с другом, т.е. между ними должно быть пустое пространство минимум в одну клетку. Нам понадобится вспомогательная функция, которая позволит определить, можно ли поставить однопалубный корабль в указанную ячейку или нет. Для этого необходимо проверить саму эту ячейку и все соседние (их 8 штук). И только если все они не заняты можно дать положительный ответ (True), в противном случае - отрицательный (False):
function Freedom (x, y: Integer; Pole: TPole): Boolean; const d: array[1..8,1..2] of Integer = ((0,1),(1,0),(0,-1),(-1,0),(1,1),(-1,1),(1,-1),(-1,-1)); var i: Integer; dx, dy: Integer; begin if (x > 0) and (x < 11) and (y > 0) and (y < 11) and (Pole[x,y] = -1) then begin for i := 1 to 8 do begin dx := x + d[i,1]; dy := y + d[i,2]; if (dx > 0) and (dx < 11) and (dy > 0) and (dy < 11) and (Pole[dx,dy] > -1) then begin Result := False; Exit; end; {if} end; {for} Result := True; end else Result := False; end; {func Freedom} |
Как известно из правил игры, на поле должны находиться следующие корабли: один четырех палубный, два трехпалубных, три двухпалубных и четыре однопалубных. Процедура, расставляющая эти корабли должна выполнять следующие действия: взять случайную свободную ячейку и проверить, можно ли поставить текущий корабль горизонтально или вертикально. Если да, то корабль размещается на игровом поле и обработка переходит к следующему. Понятно, что если нет, то возвращаемся к выбору координат. Порядок действий должен быть от большего корабля к меньшему, что бы не возникла ситуация невозможности размещения ни в одну позицию поля. Вот код этой процедуры:
procedure Ships (var Pole: TPole); var N, M, i: Integer; x, y, kx, ky: Integer; B: Boolean; begin Init (Pole); for N := 3 downto 0 do for M := 0 to 3 - N do repeat x := Random (10) + 1; y := Random (10) + 1; kx := Random (2); if kx = 0 then ky := 1 else ky := 0; B := True; for i := 0 to N do if not Freedom (x + kx * i, y + ky * i, Pole) then B := False; if B then for i := 0 to N do Pole[x+kx*i,y+ky*i] := 0; until B; end; {proc Ships} |
Это, собственно, и все, что касается размещения кораблей компьютера. Теперь достаточно сделать вызов: Ship (Pole); и корабли будут случайным образом расставлены по своим местам. Подобным образом можно помочь пользователю, что бы он каждый раз не тратил время на эту операцию, вызвав Ship (Play); где Play - поле игрока (тип TPole).
Стратегия игры компьютера
Задача заключается в разработке алгоритма, по которому компьютер сможет играть в "Морской бой" с максимальным качеством и при этом не подглядывая расположение флота игрока. Дополнительное и очевидное условие: при каждой новой игре вне зависимости от размещения сил противника компьютер должен играть по-разному, т.е. его ходы должны быть не предсказуемы. Необходимо вспомнить правила игры: участники поединка делают ходы поочередно, причем, если один из игроков попадает по кораблю соперника, то он получает право следующего хода. Если реализовать поиск цели компьютером в виде отдельной процедуры, то надо как-то научить его запоминать исходы прошлых выстрелов, чтобы адекватно произвести следующий. Из этого факта вытекает, что самое простое и рациональное решение данной проблемы можно оформить в виде конечного автомата, наиболее точно описывающего последовательность действий. Можно выделить три состояния:
прострел игрового поля по случайным координатам до попадания по кораблю, после чего переход во второе состояние;
обстрел вокруг подбитой ячейки поля для определения направления корабля (вертикальное или горизонтальное), после очередного попадания - переход в третье состояние;
расстрел корабля в полученном направлении до полного его уничтожения, после чего переход в первое состояние.
Итак, вся игра зациклена на трех основных действиях: прострел, обстрел и расстрел. Все эти действия должны продолжаться до тех пор, пока у одной из сторон не будут уничтожены все корабли. Компьютеру потребуется еще одно поле, на котором он будет вести игру. Назовем его Play. Помимо этого нужно помнить, какие корабли остались у игрока, а какие уже разбиты. Объявим все необходимые переменные:
var Play: TPole; Kor: array[1..4] of Integer; State: Integer;// состояние автомата Len: Integer;// кол-во подбитых палуб текущего корабля Pkx, Pky: Integer;// направление удара Px, Py: Integer;// позиция попадания |
Перед началом игры надо настроить все значения. Это удобно сделать в отдельной процедуре:
procedure Start; var I: Integer; begin Init (Play); Ships (Pole); State := 1; for I := 1 to 4 do Kor[I] := 5 - I; end; {proc Start} |
Предположим, что у нас есть функция, которая выдает истину, если в ячейки (x,y) игрока стоит корабль и ложь в противном случае: function Killed (x, y: Integer): Boolean;. Еще потребуется функция, определяющая длину самого большого корабля игрока:
function MaxShip: Integer; var i: Integer; begin for i := 1 to 4 do if Kor[i] > 0 then Result := i; end; {func MaxShip} |
И функция, определяющая проигрыш юзера:
function GameOver: Boolean; var I: Integer; begin for I := 1 to 4 do if Kor[I] > 0 then begin Result := False; Exit; end; {if} Result := True; end; {func GameOver} |
Все вспомогательные подпрограммы готовы и можно приступить к реализации самого автомата. Для большей наглядности каждое состояние оформим в виде отдельной процедуры. Итак, все по порядку.
Прострел
На этом этапе компьютер должен поймать какой-либо из кораблей противника. Для этого он будет стрелять по произвольным незанятым клеткам поля игрока. Гораздо эффективнее сначала разделаться с большими кораблями, поэтому выбирая координаты для выстрела надо проверять, что бы в этой позиции мог разместиться самый большой из оставшихся кораблей. Процесс прекращается, как только произойдет попадание. Обозначим подбитую часть корабля значением 1, а промах -2 соответствующей ячейки поля. Если у игрока остались только однопалубные корабли, то этим попаданием корабль уничтожен полностью и обстреливать его нет смысла. В противном случае надо перейти ко второму состоянию. Приведем код описанной функции:
function State1 (var x, y: Integer): Boolean; var k, i, n, m: Integer; B: Boolean; tmp: Integer; begin repeat repeat x := Random (10) + 1; y := Random (10) + 1; until Freedom (x, y, Play); Pkx := Random (2); Pky := Pkx - 1; for m := 1 to 2 do begin i := 0; k := 0; for n := 1 to 2 do begin while Freedom (x + Pkx * i, y + Pky * i, Play) do begin Inc (k); Inc (i); end; {while} Pkx := -Pkx; Pky := -Pky; i := 1; end; {for} B := k >= MaxShip; if B then Break; tmp := Pkx; Pkx := Pky; Pky := tmp; end; {for} until B; Result := Killed (x, y); if Result then begin Px := x; Py := y; Len := 1; if MaxShip > 1 then State := 2 else Dec (Kor[Len]); end; {if} end; {func State1} |
Ее результатом служат координаты выстрела и показатель попадания.
Обстрел
На этом шаге задача заключается в определении направления пойманного корабля. Для этого надо обстрелять четыре ячейки (если они свободны), которые могут служить продолжением. В случае, когда все четыре клетки обстреляны, а попадания не произошло (однопалубный корабль), надо перейти к первому состоянию. Если в какой-то момент удалось подбить еще одну палубу противника, то можно переходит к расстрелу данного корабля, т.к. его направление стало известно. Аналогично первому состоянию, если у игрока остались корабли не более двух палуб, то этим попаданием корабль уничтожен полностью и надо вернуться к прострелу. Посмотрим, как все это выглядит:
function State2 (var x, y: Integer): Boolean; var Old: ShortInt; tmp: Integer; k: Integer; begin Old := Play[Px,Py]; Play[Px,Py] := -1; repeat if not Freedom (Px + Pkx, Py + Pky, Play) and not Freedom (Px - Pkx, Py - Pky, Play) then begin tmp := Pkx; Pkx := Pky; Pky := tmp; end; {if} if Random (2) = 0 then begin x := Px + Pkx; y := Py + Pky; end else begin x := Px - Pkx; y := Py - Pky; end; {if} until Freedom (x, y, Play); Result := Killed (x, y); if Result then begin Len := 2; State := 1; if MaxShip > 2 then State := 3 else Dec (Kor[Len]); end else begin k := 4; if not Freedom (Px + 1, Py, Play) then Dec (k); if not Freedom (Px - 1, Py, Play) then Dec (k); if not Freedom (Px, Py + 1, Play) then Dec (k); if not Freedom (Px, Py - 1, Play) then Dec (k); if k < 2 then State := 1; end; {if} Play[Px,Py] := Old; end; {func State2} |
Расстрел
На предыдущем шаге удалось установить в каком направлении размещен пойманный корабль. Теперь задача заключается в его полном уничтожении. Для этого надо стрелять справа или слева (сверху или снизу) подбитых палуб, пока не добьем его целиком, после чего вернемся в состояние прострела. При этом следует учитывать максимально возможный корабль и стараться попасть по четвертой палубе, когда четырех палубный корабль уничтожен, нет никакого смысла. Все достаточно просто:
function State3 (var x, y: Integer): Boolean; var Old: ShortInt; i: Integer; B: Boolean; begin for i := 1 to 2 do begin x := Px; y := Py; while Play[x,y] = 1 do begin Inc (x, Pkx); Inc (y, Pky); end; {while} Old := Play[x-Pkx,y-Pky]; Play[x-Pkx,y-Pky] := -1; B := Freedom (x, y, Play); Play[x-Pkx,y-Pky] := Old; if B then Break; Pkx := -Pkx; Pky := -Pky; end; {for} if B then begin Result := Killed (x, y); if Result then begin Inc (Len); if Len = MaxShip then begin Dec (Kor[Len]); State := 1; end; {if} end; end else begin Dec (Kor[Len]); State := 1; Result := State1 (x, y); end; {if} end; {func State3} |
Осталось собрать все это в одной процедуре, которая будет контролировать результат выстрела и обеспечивать повторный ход при попадании:
procedure Comput; var x, y: Integer; Kill: Boolean; begin repeat case State of 1: Kill := State1 (x, y); 2: Kill := State2 (x, y); 3: Kill := State3 (x, y); end; {case} if Kill then Play[x,y] := 1 else Play[x,y] := -2; until not Kill or GameOver; end; {proc Comput} |
Можно заметить, что функция Killed вызывается ровно один раз при каждом ходе компьютера. От сюда следует, что компьютер не подглядывает расположение кораблей игрока, т.к. другой возможности узнать о состоянии какой-либо ячейки поля юзера у него нет. В этом можно убедиться на практике, собрав все эти части кода вместе и сделав консольное приложение, в котором функция Killed спрашивала бы у игрока, попал компьютер или промазал. Все это легко с минимальными изменениями реализовать на Turbo Pascal 7.0
3. БЛОК - СХЕМА
ЗАКЛЮЧЕНИЕ
В результате выполнения данной курсовой работы был получен игровой программный продукт, названный «Морской бой». Было проведено исследование компонентов программной среды Turbo Pascal 7.0, которые использовались при создании игры.
В результате исследования были выявлены следующие недостатки полученного программного продукта:
Низкий исскуственный интеллект, т.е. ход компьютера осуществляется случайным образом, что делает маловероятным победу компьютера;
При полном потоплении корабля это никак не отражается;
Невозможность возврата на несколько ходов назад;
Работоспособность приложения только в среде Windows;
Однако, помимо недостатков, есть и достоинства у этого программного продукта:
Автоматическая расстановка кораблей ;
Программный продукт малотребователен к системным ресурсам компьютера. Минимальная конфигурация: процессор – не ниже Pentium, оперативная память – не ниже 16 Mb, операционная система – Windows 95 / 98/ Me / NT / 2000 / XP.
В результате учета всех сделанных выше замечаний возможно улучшение созданного программного продукта, на которое потребуется минимум изменений исходного кода программы.
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ
Немнюгин С. Turbo Pascal / Учебный курс.– СПб: Питер, 2001.
Сухарев М. Turbo Pascal 7.0. Теория и практика программирования.- СПб.: Наука и техника. 2004.
Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие – М.: Издательство ООО ОМД «Групп», 2002.
Федоренко Ю. Алгоритмы и программы на Turbo Pascal / Учебный курс.– СПб: Питер, 2001.