Разработка игрового оконного приложения Морской бой

Описание:
Теоретические основы разработки игровых приложений. Проектирование и разработка игрового оконного приложения. Тестирование разработанного программного продукта.
Доступные действия
Введите защитный код для скачивания файла и нажмите "Скачать файл"
Защитный код
Введите защитный код

Нажмите на изображение для генерации защитного кода

Текст:

Министерство образования Московской области

Государственное образовательное учреждение высшего образования Московской области

«Государственный гуманитарно-технологический университет»

(ГГТУ)

Факультет информатики

Кафедра информатики

Направление подготовки: (09.03.03) «Прикладная информатика»

Профиль подготовки: «Прикладная информатика в экономике»

Курсовой  проект

На тему: «Разработка игрового оконного приложения «Морской бой»

Выполнил: студент 4 курса

факультета информатики

очной формы обучения

Круглов В.Н.

Научный руководитель:

                                           к.т.н., доцент кафедры информатики Аносов Ю.В.

_________________

Орехово-Зуево

2015


Оглавление

ВВЕДЕНИЕ.. 3

ЗАДАНИЕ НА ПРОЕКТИРОВАНИЕ И РАЗРАБОТКУ.. 6

ГЛАВА 1. Теоретические основы разработки игровых приложений. 7

1.1 Классификация игрового программного обеспечения. 7

1.2 Развивающие игры.. 12

1.3 Использование инструментальной среды «Delphi» при проектировании и разработке игровых программных приложений. 14

ГЛАВА 2. Проектирование и разработка игрового оконного приложения «Морской бой». 20

2.1 Определение необходимой функциональности разрабатываемого приложения и проектирование его структуры.. 20

2.2 Проектирование и разработка пользовательского интерфейса и оболочки приложения. 20

2.3 Разработка алгоритмов, реализующих логику поведения компьютерного интеллекта, отвечающего за действия виртуального игрока. 23

2.4. Тестирование разработанного программного продукта. 26

ЗАКЛЮЧЕНИЕ.. 27

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ... 29

ПРИЛОЖЕНИЯ.. 31

Приложение 1.  Руководство пользователя. 31

Приложение 2. Исходный код главного модуля программы «Project1.dpr»  32

Приложение 3. Исходный код модуля первой формы «Unit1.pas». 32

Приложение 4. Исходный код модуля второй формы «Unit2.pas». 49


ВВЕДЕНИЕ

Игровое программное обеспечение или «компьютерные игры» – это средства для обеспечения одного из видов игровой деятельности человека, основанные на использовании мультимедийных возможностей современной компьютерной техники и технологиях создания виртуальной (альтернативной) реальности.

В целом – компьютерные игры сходны с так называемыми традиционными играми, однако им присущи собственные, принципиально отличающие их от традиционных игр, особенности.

Отдельно следует отметить развивающие компьютерные игры.  Развивающие компьютерные игры – это компьютерные программы, служащие для организации игрового процесса, главной целью которого является развитие личности ребенка. Т.е. понятие развивающих игр напрямую связано, с детским, обычно дошкольным и младшим школьным периодами жизни человека.

Развитие представляет собой процесс формирования в личности, новых психических качеств (способностей, интересов, потребностей, воли, эмоций) или их нового уровня. При этом дети, играющие в развивающие компьютерные игры, развивают все эти качества незаметно для самих себя и, кроме того, тренируют мышление, изобретательность, воображение.

В связи с этим, разработка новых развивающих компьютерных игр современного уровня той или иной направленности, ориентированных на детей дошкольного и младшего школьного возраста, – представляется весьма актуальной.

 В качестве объекта исследования в данном курсовом проекте выступают технологии проектирования и разработки интерактивных мультимедийных игровых программных интерфейсов и игровых логик с элементами искусственного интеллекта.

 Предметом исследования является изучение возможностей инструментальной среды «Delphi» при проектировании и разработке игровых программных приложений.

Целью данной работы является проектирование, и разработка игрового программного приложения (Развивающая игра «Морской бой»), предназначенного для стимуляции и развития у детей дошкольного и младшего школьного возраста таких навыков, как: логика мышления, воображение; планирование собственных действий.

Для достижения поставленной в работе цели необходимо решить следующие задачи:

1.    рассмотреть виды и классификацию компьютерных игр и особенности их интерфейсов;

2.    изучить возможности инструментальной среды «Delphi» при проектировании и разработке игровых программных приложений;

3.    спроектировать и реализовать развивающее игровое программное приложение (Развивающая игра «Морской бой»), обладающее развитым мультимедийным интерфейсом и встроенной логикой;

4.    провести тестирование разработанного приложения на его соответствие поставленной задаче, работоспособности, устойчивости и совместимости с различными операционными системами.

Для осуществления разработки была выбрана инструментальная среда разработки Delphi 2006 Explorer. Указанная среда была выбрана, по тому, что обладает широким спектром возможностей, позволяет разрабатывать программные приложения современного уровня и является бесплатной для использования в учебных целях и при разработке некоммерческих приложений.

Практическая значимость данного курсового проекта состоит в том, что разработанное приложение:

Ø  полностью соответствует поставленной цели;

Ø  отвечает всем необходимым требованиям;

Ø  реализует все заявленные функции;

Ø  стимулирует развитие у детей дошкольного и младшего школьного возраста логику мышления, воображение, способность планирования собственных действий;

Ø  может быть использовано в качестве базы программного кода при разработке более сложных программных приложений, использующих различные мультимедийные данные;

Ø  представляет собой готовый шаблон для разработки приложений, управляемых событиями с элементами автоматического принятия решений на основе встроенной логики.

Кроме того, разработанное приложение является полноценной компьютерной игрой и может быть использовано по своему прямому назначению.

Структура работы.

Работа состоит из введения, задания на разработку, двух глав, заключения, списка использованной в процессе работы литературы и приложений.

Во введении обосновывается актуальность выбранной темы, формулируется цель работы, определяются задачи и практическая значимость работы.

В задании на разработку подробно излагаются общие положения задания и требования к функциональности, пользовательскому интерфейсу и совместимости.

Первая глава посвящена изучению классификации игровых программных приложений (компьютерных игр), особенностям развивающих игр, обзору игровых приложений, ориентированных на развитие логики мышления у детей дошкольного и младшего школьного возраста, а также изучению возможностей инструментальной среды «Delphi» при проектировании и разработке подобных программных приложений.

Вторая глава целиком посвящена проектированию и разработке развивающего игрового программного приложения (Развивающая игра «Морской бой»). В этой главе осуществляется:

Ø  определение структуры разрабатываемого приложения;

Ø  определение необходимой функциональности, проектирование и разработка пользовательского интерфейса и оболочки приложения;

Ø  разработка алгоритмов, реализующих логику поведения компьютерного интеллекта, отвечающего за действия виртуального игрока;

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

В заключении проводится анализ разработанного приложения на предмет соответствия его поставленной задаче.

Список использованной литературы содержит 23 печатных источника.

Объем основной части работы (введение, задание на проектирование и разработку, две главы и заключение) составляет 26 страниц.

Результатом работы является действующее развивающее игровое программное приложение (Развивающая игра «Морской бой»), совместимое с операционными системами линейки «Windows».

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


ЗАДАНИЕ НА ПРОЕКТИРОВАНИЕ И РАЗРАБОТКУ

Общие положения задания и требования к функциональности

В ходе работы на данным курсовым проектом необходимо спроектировать и разработать развивающее игровое программное приложение (Развивающую игру «Морской бой»).

Приложение должно содержать следующий набор функций:

Ø  автоматическую организацию игрового пространства и его визуализацию с использованием мультимедиа данных;

Ø  динамическое обновление игрового пространства в процессе игры;

Ø  автоматическую расстановку кораблей виртуального противника;

Ø  удобный редактор для расстановки кораблей игрока;

Ø  встроенную логику поведения виртуального противника;

Ø  сведения о программе;

Ø  систему помощи.

Требования к интерфейсу приложения

Исходя из специфики задачи пользовательский интерфейс разрабатываемого приложения должен быть предельно простым, прозрачным, интуитивно понятным, но, в то же время, ярким, красочным, использующим мультимедийные возможности компьютера (загрузку и отображение изображений, звуковое сопровождение, и т.д.

Выполнение всех действий пользователя должно бить организовано максимально удобным для него способом.

Требования к совместимости с операционными системами

Разрабатываемое приложение должно быть ориентировано на операционные системы линейки «Windows».

Требования к совместимости с аппаратным обеспечением

Приложение должно обеспечивать стабильную, устойчивую работу на любой аппаратной базе, рекомендованной для перечисленных версий операционных систем.


ГЛАВА 1. Теоретические основы разработки игровых приложений 1.1 Классификация игрового программного обеспечения

Принципиальные отличия компьютерных игр от игр традиционных

Игровое программное обеспечение или «компьютерные игры» – это средства для обеспечения одного из видов игровой деятельности человека, основанные на использование мультимедийных возможностей современной компьютерной техники и технологиях создания виртуальной (альтернативной) реальности.

В общем – компьютерные игры сходны с так называемыми традиционными играми, однако им присущи собственные, принципиально отличающие их от традиционных игр, особенности. В частности:

·    компьютерные игры основываются на принципах постепенного усложнения игровой ситуации и поставленных перед игроком задач даже в рамках одного уровня игры, постоянно удерживая игрока в «зоне ближайшего развития» и не позволяя игроку выполнить более сложные задания не отработав навык выполнения (не получив опыт) текущих заданий данного уровня игры;

·    крупноблочная уровневость не позволяет перейти игроку на следующий (принципиально новый) уровень, без выполнения всех заданий текущего уровня, имеющих различную степень сложности, но объединённых единым смысловым содержанием;

·    использование элементов случайности (в количестве, распределении по игровому пространству и характере) игровых заданий, придающее игре свойства неожиданности.

Перечисленные выше принципиальные отличия компьютерных игр от игр традиционных, выводят компьютерные игры на новый уровень и позволяют эффективно использовать их в развивающем, тренировочном и учебном процессах.

При этом, наибольшая эффективность достигается в случае динамического изменения условий применения специфических возможностей таких игр, что в большей степени, чем при использовании традиционных игр, способствует умственному развитию детей.

Классификация компьютерных игр

В настоящее время существует несколько способов классификации компьютерных игр:

·    классификация по цели применения;

·    классификация по жанру;

·    классификация по сеттингу;

·    классификация по количеству игроков;

·    классификация по платформе;

·    классификация по технологии графического отображения;

·    классификация по издательским критериям и формату;

·    классификация по типу распространения.

Рассмотрим все перечисленные виды классификаций компьютерных игр более подробно.

Классификация по цели применения

·    развивающие игры;

·    обучающие игры;

·    игры-тренажеры, предназначенные для отработки тех или иных специальных или профессиональных навыков;

·    игры, носящие чисто развлекательный характер.

Классификация по жанру

Независимо от цели разработки игры и её содержания все компьютерные игры подразделяются на несколько групп, в зависимости от их жанра. Жанром игры выступает как способ организации игрового пространства, так и способы и цели прохождения игры. В настоящее время основными игровыми жанрами являются:

·    3D-шутеры (англ. 3D Shooter) — в играх данного типа игрок, как правило, действуя в одиночку, должен уничтожать врагов при помощи того или иного вида оружия. В свою очередь шутеры подразделяются на несколько подвидов: шутеры от первого или третьего лица; «Кровавые» шутеры; тактические шутеры;

·    Файтинги, реализующие исключительно поединки двух и более противников с применением рукопашного боя.

·    Слешеры, реализующие фехтовальные поединки с видом от третьего лица.

·    Стелс-экшен (англ. Stealth-action) — игры, в которых предполагается не сражаться с большинством встреченных противников, а напротив, всячески избегать возможного контакта с ними, попутно выполняя поставленные задачи.

·    Платформеры – игры, в которых игроку требуется пройти тот или иной путь, используя различные платформы, лестницы, горки и т.д.

·    Аркада (англ. Arcade) — игра, в которой игроку приходится действовать быстро, полагаясь в первую очередь на свои рефлексы и реакцию. Игровой процесс прост и не меняется в течение игры. Впервые появились на игровых автоматах.

·    Симуляторы – игры в которых имитируется физическое поведение и управление каким-либо сложным объектом технической системы, либо симуляция и управление тем или иным процессом из реальной жизни.

·    Спортивные – игры, фактически являющиеся симуляторами, но вынесенные в отдельную группу по их принадлежности к имитации реальных спортивных игр.

·    Экономические – также являющиеся симуляторами, но отображающими те или иные рыночные процессы. Иногда данный вид игр относят также к жанру стратегий (см. далее).

·    Стратегии (англ. Strategy) – игры, требующие планирования и выработки определенной стратегии для достижения некой конкретной цели. Выделяют несколько подвидов стратегий: пошаговые, клеточные, карточные, глобальные и реального времени.

·    Симуляторы бога (англ. Godgame) — стратегические игры, в которых игроку предстоит выступать в роли «бога» — некоей сверхъестественной сущности, заботящейся о целом небольшом народе. Подобные игры характеризует, как правило, непрямой контроль над отдельными игровыми персонажами — ими управляет компьютер, а роль игрока определяется «сверхъестественным» вмешательством в их жизнь, постройке зданий, поддержанию оптимального состояния подопечного общества и тому подобному. Многие симуляторы бога не ставят перед игроком никаких конкретных задач, предоставляя ему возможность свободно и неограниченно развивать подопечное общество.

·    Приключение (англ. Adventure) или «квесты» – игры-повествования, в которых управляемый игроком герой продвигается по сюжету и взаимодействует с игровым миром посредством применения предметов, общения с другими персонажами и решения логических задач. Подразделяются на текстовые и графические приключенческие боевики.

·    Ролевые игры (англ. Role playing game, RPG) В таких играх обычно присутствует проработанный и обширный мир, сложная сюжетная линия, разветвлённые диалоги с разными вариантами ответов, множество различных персонажей со своими целями и характерами. У главного героя (героев) и других персонажей и врагов присутствует некоторое количество параметров (умений, характеристик, навыков), которые определяют их силу и способности и могут быть развиты при выполнении тех или иных заданий.

·    Пазлы (англ. Puzzle), головоломки, пасьянсы и т.п. игры.

В реальном случае любая существующая игра не может быть чётко отнесена к какой-либо из перечисленных категорий. Обычно игры одновременно сочетают в себе черты сразу нескольких жанров.

Классификация по сеттингу

Данный вид классификации основан на принадлежности игры тому или иному моделируемому историческому периоду либо территориальной принадлежности.

По историческому периоду разделяют следующие виды игр:

·    Зарождение жизни (простейшие организмы, игры на клеточном уровне).

·    Доисторические времена (эра динозавров, пещерные люди).

·    Зарождение цивилизаций (Древний Рим, Древний Египет).

·    Средневековье (рыцарские походы, междоусобицы, инквизиция).

·    Эпоха колонизации (морские путешествия, новые земли).

·    Эпоха индустриализации (XVIII – XIX века).

·    Прошедшие войны (Вторая Мировая война, локальные конфликты).

·    Наше время (привычный мир).

·    Информационная эпоха (киберпанк, антиутопия будущего).

·    Освоение космоса (научная фантастика, SciFi, космические путешествия).

·    Эволюция (наличие нескольких эпох в одной игре).

По территориальной принадлежности или типу игрового мира:

·    Реальный мир (игровой мир мало чем отличается от нашего мира).

·    Параллельные миры (реальный мир и переходы в искаженные миры).

·    Альтернативная история (другие варианты исторических событий).

·    Фэнтези (сказочный мир с наличием магии).

·    Геройская мифология (сверх существа: супер герои, мутанты, полубоги).

·    Христианская мифология (ангелы, демоны, рай, ад).

·    Современная мифология (нашествие зомби, нашествие инопланетян, пост Апокалипсис).

Классификация по количеству игроков

По данному типу классификации разделяют 4 основных вида игр:

·    Одиночная игра (Синглплейер, англ. Singleplayer).

·    Совместная игра на одном устройстве (Hotseat, Splitscreen).

·    Многопользовательская игра (Мультиплейер, Multiplayer).

·    Массовая онлайн игра (англ. Massively multiplayer online game, MMO).

Классификация по платформе

Данная классификация основана на принадлежности игр тем или иным видам устройств.

·    Персональный компьютер (ПК, PC, ноутбук, нетбук).

·    Игровая консоль или приставка (PS, Xbox, Nintendo).

·    Мобильное устройство: телефон, планшет, карманный.

·    Игровой автомат.

·    Браузерная или флеш-игра (виртуальная интернет платформа).

Классификация по технологии графического отображения

Этот тип классификации учитывает, как технологии графического построения игрового мира, так и используемые в игре способы визуализации.

·    Двухмерная графика (векторная, растровая).

·    Трехмерная графика.

·    Объемное изображение (стерео очки).

·    Дополненная реальность (мобильные устройства с видеокамерой).

·    Виртуальная реальность (шлем виртуальной реальности).

·    Вид от 1-го лица (вид из глаз).

·    Вид от 3-го лица (вид сзади).

·    Двухмерный вид сбоку (2D вид сбоку).

·    Трехмерный вид сбоку (3D вид сбоку, псевдо трехмерность).

·    Двухмерный вид сверху (2D TopDawn).

·    Трехмерный вид сверху (3D TopDawn, изометрия).

Классификация по издательским критериям и формату

Данный вид классификации учитывает, как бюджетную составляющую разработки:

·    Профессиональная игра высшего качества (ААА-класс, блокбастеры).

·    Профессиональная игра (игры со средним бюджетом).

·    Инди-игра (независимая игра, малобюджетный класс).

·    Любительская игра (бесплатная игра с минимальным качеством).

Так и тип, и объёмы игр:

·    Оригинальная игра.

·    Очередная игра в игровой серии (сиквел, приквел).

·    Дополнение к игре.

·    Скачиваемый контент к игре (DLC).

Классификация по типу распространения

Включает различные виды платных и бесплатных игр.

Платные игры:

·    Игра на физическом носителе (диски, картриджи).

·    Цифровая копия игры (продажа игр через Интернет).

·    Оплата за игровое время (игровые автоматы, некоторые MMO-игры).

Бесплатные игры:

·    Условно бесплатная игра (shareware).

·    Бесплатная игра с микро транзакциями (freetoplay, free2play) (большая часть MMO-игр).

·    Бесплатная игра (флеш-игра, браузерная игра, скачиваемая игра).

1.2 Развивающие игры

Развивающие компьютерные игры – это компьютерные программы, служащие для организации игрового процесса, главной целью которого является развитие личности ребенка. Т.е. понятие развивающих игр напрямую связано, с детским, обычно дошкольным или младшим школьным периодами жизни человека. При этом дети, играющие в развивающие компьютерные игры, развивают все эти качества незаметно для самих себя и, кроме того, тренируют мышление, изобретательность, воображение.

 В основе развивающих игр чаще всего находится некоторая задача, которая содержит определенную познавательную трудность, т.е. ориентирована на перспективный уровень умений.

Подбирая дошкольнику такие игры, стоит учитывать, что условие поставленной в игре задачи должно соответствовать уровню развития ребенка, содержание игры должно быть ему понятно и доступно, а решение задачи ориентировано на «ближайший уровень развития».  Только при таких условиях компьютерная игра будет стимулировать общее развитие дошкольника.

Типы, характер, содержание и оформление развивающих игр определяются конкретными воспитательными задачами применительно к возрасту детей с учётом их развития и интересов.

В настоящее время уже существует огромное количество разнообразных развивающих компьютерных игр нескольких категорий:

·    конструкторские программы, в процессе которых детям надо либо сложить из разных частей фигуру определенной формы, либо, наоборот, разбить имеющуюся фигуру на заданные части. Эти программы развивают не только восприятие и координацию, но и образное мышление детей, а также усидчивость, усердие, терпение. Например, паззлы, тетрис, сложи узор.

·    «конструкторы сказок», совмещающие возможности текстового и графического редакторов для формирования и воспроизведения иллюстраций. В таких программах можно «сыграть» сказку на компьютере, а можно распечатать иллюстрации, вырезать и создать настольный театр. Такой вариант игр подходит для групповой работы и способствует развитию воображения, восприятия, речевых навыков, коммуникабельности, положительного эмоционального настроя и т.д.

·    программы, направленные на развитие зрительно-моторной координации ориентации ребенка в пространстве. Это различные лабиринты, по которым необходимо протащить предмет или игры, задачей которых является быстро поймать фигуру.

·    головоломки или игры, на развитие логического мышления.

·    игры на развитие внимания и памяти. Это, например, игры на сравнение картинок (найди отличия, найди пару, найди тень), игры на поиск спрятанных предметов. При использовании подобных игр происходит развитие не только внимания и памяти, но и усидчивость и терпение.

Развивающие компьютерные игры могут иметь и просто творческий характер и не иметь конкретной задачи. Целью таких игр может быть развитие цветового восприятия, слухового опыта, побуждение познавательной активности, становление образно-символического мышления и т.п. К таким играм можно отнести различные графические редакторы, «раскраски», музыкальные игры, и т.п.

Следует отметить, что, не смотря на то, что основной целю развивающих компьютерных игр ориентирована на общее развитие дошкольников, в них могут содержаться и обучающие элементы. Т.е. такие игры могут иметь ряд дополнительных целей, направленных на усвоение детьми определенных знаний и умений. В частности, играя в развивающие компьютерные игры, дети параллельно осваивают компьютер, учат цвета, формы, порядковый счет и т.д.

1.3 Использование инструментальной среды «Delphi» при проектировании и разработке игровых программных приложений

Общая характеристика инструментальной среды разработки «Delphi»

Инструментальная среда «Delphi» представляет собой комбинацию нескольких важнейших технологий:

·    высокопроизводительный компилятор;

·    объектно-ориентированная модель компонент;

·    визуальное (а, следовательно, и скоростное) построение приложений из программных прототипов;

·    масштабируемые средства для построения баз данных.

Компилятор, встроенный в среду «Delphi», обеспечивает высокую производительность, необходимую для построения приложений любого объёма и назначения.

Среда «Delphi» предлагает легкость разработки и быстрое время отладки программного кода, характерные для языков четвертого поколения (4GL) и в то же время обеспечивает качество кода, характерного для компилятора 3GL.

Кроме того, Delphi обеспечивает быструю разработку без необходимости   ручного написания значительной части кода (хотя ручная разработка также возможна).

Основные компоненты «Delphi», применяемые при проектировании и разработке пользовательских интерфейсов прикладных (в том числе и игровых) программных приложений

Компонент TMainMenu

 TMainMenu позволяет поместить влюбое из окон (экранных форм) программы главное меню. При помещении TMainMenu на форму данный компонент выглядит, просто как иконка. Иконки данного типа называют невидимым (невизуальным) компонентом, поскольку они невидимы во время выполнения программы. Создание меню включает три шага:

1.    помещение TMainMenu на форму,

2.    вызов Дизайнера Меню через свойство Items в Инспекторе Объектов,

3.    определение пунктов меню в Дизайнере Меню.

Этот компонент доступен из модуля MENUS, и находится на странице Палитры компонентов Standard

Этот компонент представляет главное меню формы и наследует все методы и свойства TMenu. Особенность его в том, что в нем реализован сложный механизм объединения меню. Это необходимо по следующим причинам:

1.    Если в приложении имеется несколько форм со своими меню, то для упрощения работы целесообразно соединить их в одно и управлять меню из главной формы.

2.    Объединение меню нужно при работе с интерфейсом MDI (Мульти Документный Интерфейс) и его подокнами.

3.    Механизм объединения меню используется серверами OLE, запускаемыми по месту нахождения объекта OLE. Загружаясь, сервер дописывает осу­ществляемые им операции к меню другого приложения.

Для того чтобы реализовать объединение меню, у тех форм, меню которых будут присоединены к главному, необходимо установить в True свойство:

b) property AutoMerge: Boolean.

При этом у главного меню оно должно оставаться равным False, иначе главное меню будет невидимым. Объединение будет происходить автоматически при активизации новых форм или серверов OLE. Кроме автоматического режима, объединение меню можно выполнить при вызове метода:

procedure Merge(Menu: TMainMenu).

Компонент TLabel

TLabel служит для отображения текста на экране. Можно изменить шрифт и цвет метки, если дважды щелкнуть на свойство Font в Инспекторе Объектов. Видно, что это легко сделать и во время выполнения программы, написав всего одну строчку кода.

Этот компонент доступен из модуля STDCTRLS, и находится на странице Палитры компонентов Standard.

Компонент представляет собой статический текст. С помощью этого компо­нента на рабочей поверхности формы можно отобразить информацию, сделать пояснения и показать названия других компонентов.

Но он имеет и другую важную функцию — если в составе текста TLabel есть символы-акселераторы, информация об их нажатии может передаваться от TLabel другому элементу управления.

Свойства компонента приведены в табл.1:

Таблица 1

Свойства компонента TLabel

Свойство

Описание

(Pb) property Caption: TCaption; TCaption = string[255];

Содержит строку с выводимым текстом.

(Pb) property Alignment: TAlignment;

Устанавливает правило выравнивания текста — по правому, левому краю или по центру клиентской области.

(Pb) property AutoSize: Boolean;

В случае True происходит автоматическое приведение размеров компонента к размерам текста и высоте шрифта.

(Pb) property FocusControl: TWinControl;

Определяет оконный компонент, которому посылаются сообщения о вводе акселе­ратора.

(Pb) property Transparent: Boolean;

Прозрачность фона компонента. Если свойство установлено в True, то при перерисовке элемента управления не про­исходит закрашивание клиентской облас­ти. В противном случае — происходит закрашивание кистью bsSolid и цветом Color.

(Pb) property WordWrap: Boolean;

Определяет возможность разрыва слов в случае, если длина выводимого текста превышает ширину компонента.

Компонент TPanel

TPanel – управляющий компонент, похожий на TGroupBox, используется в декоративных целях. Чтобы использовать TPanel, просто поместите его на форму и затем положите другие компоненты на него. Теперь при перемещении TPanel будут передвигаться и эти компоненты. TPanel используется также для создания панели инструментов и окна статуса.

Этот компонент доступен из модуля EXTCTRLS, и находится на странице Палитры компонентов Standard.

Этот компонент — является несущей конструкцией для размещения других элементов управления. В отличие от простой рамки (TBevel) панель сама является оконным элементом управления и родителем для всех размещенных на ней компонентов. Часто ее используют для создания панелей инстру­ментов, строк состояния и т. п.

За внешнее оформление панели отвечают свойства:

(Pb) property Bevel Inner: TPanelBevel;

(Рb) property BevelOuter: TPanelBevel;

TPanelBevel = (bvNone, bvLowered, bvRaised) ;

(Pb) property BevelWidth: TBevelWidth;

TBevelWidth = 1..Maxint;

(Pb) property BorderWidth: TBorderWidth;

TBorderWidth = 0..Maxint ;

На границах панели размещаются две специальные окаймляющие рамки (bevels): Bevellnner и BevelOuter. При помощи комбинации белого и серого цветов они имитируют трехмерность — приподнятость (bvRaised) или утоп-ленность (bvLowered). Обе рамки имеют ширину BevelWidth. Наружная — BevelOuter — расположена прямо по периметру панели, вторая — Bevellnner — внутри на расстоянии BorderWidth от нее. Обе могут быть невидимыми (bvNone), приподнятыми или утопленными.

Комбинируя сочетания bvLowered/bvRaised, можно создать вокруг панели "ров" или "вал".

Иллюзию трехмерности может подчеркнуть также стиль обрамления компо­нента:

(Pb) property BorderStyle: TBorderStyle;

TBorderStyle = bsNone .. bsSingle;

Значение bsSingle означает, что панель будет окаймлена черной линией единичной толщины (по периметру, снаружи от обеих рамок).

Выравнивание текста заголовка панели определяется при помощи свойства:

(Pb) property Alignment: TAlignment;

Компонент TImage

TImage - отображает графическое изображение на форме. Воспринимает форматы BMP, ICO, WMF. Если картинку подключить во время дизайна программы, то она прикомпилируется к EXE файлу.

Этот компонент доступен из модуля EXTCTRLS, и находится на странице Палитры компонентов Additional.

Этот компонент служит надстройкой над классом TPicture и замыкает всю иерархию графических объектов VCL. Он предназначен для показа на форме изображения: битовой карты (TBitmap), метафайла (TMetafile), значка (TIcon).

Свойство (Pb) property Picture: TPicture; служит контейнером для графического объекта одного из перечисленных клас­сов.

В качестве канвы используется канва объекта Picture. Graphic — только если поле Graphic ссылается на объект класса TBitmap:

(Pb) property Canvas: TCanvas;

Если это не так, то попытка обращения к свойству вызовет исключительную ситуацию EInvalidOperation, так как рисовать на метафайле или значке нельзя.

Следующие три свойства определяют, как именно Tpicture располагается в рабочей области компонента:

(Pb) property AutoSize: Boolean;

— означает, что размеры компонента настраиваются по размерам содержащегося в нем графического объекта. Устанавливать его в True нужно перед загрузкой изображения из файла или буфера обмена;

(Pb) property Stretch: Boolean;

— если это свойство установлено в True, то изображение "натягивается" на рабочую область, при необходимости уменьшая или увеличивая свои размеры. Если оно установлено в False, то играет роль следующее свойство;

(Pb) property Center: Boolean;

— если это свойство установлено в True, изображение центрируется в пределах рабочей области. В противном случае — располагается в ее верхнем левом углу.


ГЛАВА 2. Проектирование и разработка игрового оконного приложения «Морской бой» 2.1 Определение необходимой функциональности разрабатываемого приложения и проектирование его структуры

Согласно поставленной задаче: «Разработка игрового программного приложения (Развивающая игра «Морской бой»)», приложение должно содержать следующий набор функций:

Ø  автоматическую организацию игрового пространства и его визуализацию с использованием мультимедиа данных;

Ø  динамическое обновление игрового пространства в процессе игры;

Ø  автоматическую расстановку кораблей виртуального противника;

Ø  удобный редактор для расстановки кораблей игрока;

Ø  встроенную логику поведения виртуального противника;

Ø  сведения о программе;

Ø  систему помощи.

В связи с тем, что в задании на разработку в программе предусмотрена специальная функция выдачи сведений о программе логичнее всего выбрать структуру проекта, основанную на двух экранных формах.

Первая форма будет отвечать за функционирование игрового поля. Вторая же будет предназначена исключительно для вывода на экран сведений о программе.

Таким образом структура проекта будет иметь следующий вид:

Ø  Файл «Project1.dpr» - файл проекта, содержащий исходный код главного модуля программы.

Ø  Модуль Unit1 – модуль экранной формы основного игрового поля.

Ø  Модуль Unit2 - модуль экранной формы, предназначенной для вывода информации о программе.

2.2 Проектирование и разработка пользовательского интерфейса и оболочки приложения

Согласно поставленной задаче, игра, т. е. работа программы должна начинаться сразу после запуска.

Так же при запуске должна автоматически выполняться случайная расстановка кораблей виртуального противника. Следовательно, данные действия должны выполняться в процедуре FormCreate.

Каждое из полей (как игрока, так и виртуального противника) будет представлять собой матрицу 10х10.

Дополнительно, оба данных поля должны представлять собой картинку которая будет динамически обновляться при том или ином действии.

Первоначально на форму будет выводится сообщение «Расставьте корабли», это означает что игроку следует расставить свои корабли перед нанесением первого удара по противнику.

Все действия, как расстановка кораблей, так и нанесение ударов удобнее всего реализовать по нажатию левой кнопки мыши.

Желательно внедрить в программу несколько звуковых фрагментов:

Ø  Запуск программы;

Ø  Расстановка кораблей;

Ø  Звук взрыва;

Ø  Победа;

Ø  Поражение.

В результате разрабатываемое приложение приняло вид, показанный на рисунках 1 и 2.

Рисунок 1. «Экранная форма для основного игрового поля и конечный вид соответствующего ей окна»

Рисунок 2. «Экранная форма для «О программе» и вид соответствующего ей окна»

2.3 Разработка алгоритмов, реализующих логику поведения компьютерного интеллекта, отвечающего за действия виртуального игрока

К функциям логики поведения компьютерного интеллекта, отвечающего за действия виртуального игрока относятся:

Ø  функции, расстановки кораблей виртуального противника;

Ø  функции интерактивной расстановки кораблей игрока;

Ø  функции планирования и нанесения ударов виртуальным игроком.

Автоматическая расстановка кораблей виртуального противника.

Данная функция программы оказалась наиболее сложной в реализации.

Расстановка кораблей противника происходит от 4х палубного к одно палубному.

Координаты четырехпалубного корабль выбираются случайно (переменная m и переменная n) случайно лишь с условием того чтобы он не выходил за границы поля при этом выбирается случайное горизонтальное или вертикальное положение (переменная z).  При этом координаты корабля помечаются цифрами «2» в матрице.

Трехпалубные и двухпалубные корабли расстанавливаются точно также только дополнительно идет сравнение на пересечение и соприкосновение кораблей друг с другом.

Однопалубным кораблям незачем проверка выхода за границы поля, поэтому проверка происходит только на пересечение и соприкосновение.

Расстановка трехпалубных кораблей происходит в цикле до тех пор, пока не будет расстановлено два корабля, двухпалубные – пока не буду расстановлены три корабля, и однопалубные – пока не будут расстановлены четыре корабля.

Так как сразу при запуске программы или при выборе пункта меню «Новая игра» все корабли виртуального противника уже должны быть расставлены на карте – выполнение действий по расстановке осуществляется непосредственно в процедуре FormCreate.

Код данной процедуры можно посмотреть в приложении 3 (Исходный код модуля первой формы «Unit1.pas»)

Интерактивная расстановка кораблей игрока

Данная функция программы реализована при помощи двух процедур:

Ø  процедуры rastkor;

Ø  процедуры nash.

Процедура rastkor

При передвижении мыши по полю игрока ячейкам матрицы (в зависимости от расстанавливаемого корабля) присваивается значение 1. При этом при каждом изменении происходит прорисовка матрицы, для того чтобы пользователь мог видеть происходящие изменения.

При изменении ячейка матрицы со значением «0» рисуется белым квадратом, со значением «1» желтым.

При нажатии правой клавиши мыши происходит ротация корабля, проверка на ротацию происходит перед движением мыши.

Расстановка корабля происходит по нажатии левой клавиши мыши на поле игрока.

Процедура nash

Расстановка происходит лишь в том случае если расстанавливаемый корабль не выходит за рамки поля, не пересекается и не соприкасается не с одним из расстанавливаемых кораблей.

Также каждый из кораблей расстанавливается в зависимости от количества его палуб, т.е. четырехпалубный – один, трехпалубных – два, двухпалубных – три, однопалубных – четыре. При этом ячейке матрицы поля игрока присваивается значение «2». После каждого нажатия происходит прорисовка поля игрока, для этого каждая ячейка с цифрой «2» закрашивается серым.

После того как все корабли расставлены (k11<0) начинается обмен выстрелами с компьютером.

Планирование и нанесение ударов виртуальным игроком

Данная функция программы реализована при помощи процедуры vistrel.

Выстрел производится при нажатии на одну из клеток поля компьютера. Если ячейка имеет значение «0» (пустая клетка) то ячейке присваивается значение «3», ячейка имеет значение «2» то ячейке присваивается значение «4».

Затем происходит прорисовка поля компьютера. Клетка, которой соответствует ячейка со значением «3» рисуется маленький квадрат, клетка которой соответствует ячейка со значением «4» проверяется ранен или убит корабль если убит, то рисуется красный квадрат, если ранен, то рисуется серый квадрат перечеркнутый красным крестом.

После происходит проверка выиграл ли игрок или нет, для этого матрица компьютера сканируется и если не находится ни одной ячейки со значением «2», то выходит сообщение: – «Поздравляю! Вы победили.»

Если же находится то проверяется если игрок опал в ячейку со значением «2» то ему предоставляется ещё один выстрел, и т. д. пока игрок не попадет в ячейку со значением «0».

Тогда наступает очередь хода компьютера.

Компьютер выбирает произвольную клетку из поля игрока и если её значение равно «0», то значение становится равным «3», если значение равно «2» от значение клетки становится равным «4».

Затем происходит прорисовка поля компьютера. Клетка, которой соответствует ячейка со значением «3» рисуется маленький квадрат, клетка которой соответствует ячейка со значением «4» проверяется ранен или убит корабль если убит, то рисуется красный квадрат, если ранен, то рисуется серый квадрат перечеркнутый красным крестом.

Компьютер стреляет до тех пор, пока не попадет в клетку со значением «0».

После происходит проверка проиграл ли игрок или нет, для этого матрица игрока сканируется и если не находится ни одной ячейки со значением «2» то выходит сообщение: – «Вы проиграли. Попробуйте ещё раз!»

2.4. Тестирование разработанного программного продукта

Соответствие поставленной задаче.

Разработанное игровое программное приложение (Развивающая игра «Морской бой») отвечает всем необходимым требованиям, реализует все необходимые функции и полностью соответствует поставленной задаче.

 Аппаратные требования.

Тестирование разработанного приложения проводилось на компьютерах различной производительности и под различными операционными системами.

Разработанное программное приложение показало высокую надёжность и стабильность работы даже на достаточно слабых компьютерах.

В частности, полноценная и вполне комфортная работа возможна даже на компьютерах Intel Pentium-3 с частотой 400 МГц и объёмом установленной оперативной памяти 512 МБ.

Рекомендуемое разрешение экрана при работе с данным приложением составляет 800х600 пикселей и более, при глубине цвета от 16 бит и выше.

Работа возможна и при более низких разрешениях (640х480) и глубине цвета (8 бит), однако комфортность работы при этом резко падает.

Совместимость.

В тестах на совместимость с различными операционными системами разработанное программное приложение показало стабильную, устойчивую работу во всех операционных системах, начиная с версии Windows XP и заканчивая Windows-8.

На более ранних версиях операционных систем – тестирование не проводилось.

Простота использования, Эргономичность.

Как показало проведённое тестирование разработанное приложение удобно в использовании, интерфейс прозрачен и интуитивно понятен.

Выявленные недостатки

Единственным недостатком, выявленным в процессе тестирования является несовместимость системы помощи «Help» с операционными системами «Windows 7» и «Windows 8». Это обусловлено тем, что подпроект системы помощи был собран в старой версии инструментальной среды «Delphi».


ЗАКЛЮЧЕНИЕ

Целью данного курсового проекта являлось проектирование и разработка игрового программного приложения (Развивающая игра «Морской бой»), предназначенного для стимуляции и развития у детей дошкольного и младшего школьного возраста таких навыков, как: логика мышления, воображение; планирование собственных действий.

В ходе проделанной работы:

Ø  рассмотрены виды и классификация компьютерных игр и особенности их интерфейсов;

Ø  изучены возможности инструментальной среды «Delphi» при проектировании и разработке игровых программных приложений;

Ø  разработаны алгоритмы, реализующие логику поведения компьютерного интеллекта, отвечающего за действия виртуального игрока;

Ø  спроектировано и реализовано развивающее игровое программное приложение (Развивающая игра «Морской бой»), обладающее развитым мультимедийным интерфейсом и встроенной логикой;

Ø  проведено тестирование разработанного приложения на его соответствие поставленной задаче, работоспособность, устойчивость и совместимость с различными операционными системами.

Проектирование и разработка были выполнены в инструментальной среде «Delphi 2006 Explorer».Данный выбор был детально обоснован.

Проведённое финальное тестирование показало, что разработанное приложение:

v  полностью соответствует поставленной цели;

v  отвечает всем необходимым требованиям;

v  реализует все заявленные функции;

v  совместимо с большинством операционных систем линейки «Windows»;

v  нетребовательно к аппаратным ресурсам компьютера (работа возможна даже на компьютерах модели Pentium-3  с частотой  400 МГц.);

v  обладает простым, наглядным, интуитивно-понятным интерфейсом;

v  стимулирует развитие у детей дошкольного и младшего школьного возраста логику мышления, воображение, способность планирования собственных действий.

Дополнительно можно отметить, что разработанное приложение:

Ø  может быть использовано в качестве базы программного кода при разработке более сложных программных приложений, использующих различные мультимедийные данные.

Ø  представляет собой готовый шаблон для разработки приложений, управляемых событиями с элементами автоматического принятия решений на основе встроенной логики.

Кроме того, разработанное приложение является полноценной компьютерной игрой и может быть использовано по своему прямому назначению.

В ходе работы все задачи решены, поставленная цель достигнута.


СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

Международные стандарты

  1. MIL-STD-498. Разработка и документирование программного обеспечения.
  2. ISO 9126:1991. Информационная технология. Оценка программного продукта. Характеристики качества и руководство по их применению.
  3. ANSI/IEEE 829-1983. Документация при тестировании программ.
  4. ANSI/IEEE 1008-1986. Тестирование программных модулей и компонентов ПС.

Стандарты РФ в соответствии со стандартами ISO

  1. ГОСТ Р ИСО/МЭК 9294-93. Информационная технология. Руководство по управлению документированием программного обеспечения.
  2. ГОСТ Р ИСО/МЭК 9127-94. Системы обработки информации. Документация пользователя и информация на упаковке для потребительских программных пакетов.
  3. ГОСТ Р ИСО/МЭК 12119:1994. Информационная технология. Пакеты программных средств. Требования к качеству и испытаниям.

Стандарты «Единой Системы Программной Документации»:

  1. ГОСТ 19.001-77 ЕСПД. Общие положения.
  2. ГОСТ 19.103-77 ЕСПД. Обозначение программ и программных документов.
  3. ГОСТ 19.105-78 ЕСПД. Общие требования к программным документам.
  4. ГОСТ 19.201-78 ЕСПД. Техническое задание. Требования к содержанию и оформлению.
  5. ГОСТ 19.504-79 ЕСПД. Руководство программиста. Требования к содержанию и оформлению.
  6. ГОСТ 19.505-79 ЕСПД. Руководство оператора. Требования к содержанию и оформлению.

По разработке информационных систем и программированию

  1. Благодатских В.А., Волнин В.А., Поскакалов К.Ф. Стандартизация разработки программных средств. – М.: Финансы и статистика, 2003 г.
  2. Бобровский С.  Программирование в Delphi 7. – СПб.: Информ-Пресс, 2011 г. – 806 c.
  3. Вигерс К. Разработка требований к программному обеспечению. Пер. с англ. - М.: Издательско-торговый дом "Русская Редакция", 2011 г. –576 с.
  4. Котляров В. П., Коликова Т. В. Основы тестирования программного обеспечения. – М.: Бином. Лаборатория знаний, 2011 г. –288 с.
  5. Липаев В.В. Надежность программных средств. – М.: СИНТЕГ, 1998 г.
  6. Липаев В.В. Документирование и управление конфигурацией программных средств – М.: СИНТЕГ, 1998 г.
  7. Липаев В.В. Системное проектирование сложных программных систем. – М.: СИНТЕГ, 1998 г.
  8. Орлов С.А. Технологии разработки программного обеспечения: Разработка сложных программных систем: Учебное пособие для студентов вузов, обуч. по напр. подготовки бакалавров и магистров «Информатика и выч. техника». – СПб.: Питер, 2002 г.
  9. Пальчун Б.П., Юсупов Р.М. Оценка надежности программного обеспечения. – СПб.:Наука, 1994 г.
  10. Шикин А. В., Боресков А. В. Компьютерная графика. Динамика, реалистические изображения. – M.: ДИАЛОГ-МИФИ, 1998 г. – 288 с.

ПРИЛОЖЕНИЯ Приложение 1.  Руководство пользователя

Запуск приложения.

Приложение полностью готово к использованию и не требует никаких предварительных настроек. Для запуска программы достаточно запустить исполняемый файл: «Project1.exe»

Расстановка кораблей.

В начале игры пользователю необходимо расположить на своём игровом поле (левое поле) собственные корабли. При этом в правом игровом поле (поле виртуального противника) выдаётся соответствующая подсказка.

Расстановка кораблей осуществляется нажатием левой кнопки «Мыши» и сопровождается характерным звуковым сигналом.

Контроль положения кораблей пользователя выполняется автоматически, что не позволит пользователю расположить их в положениях, запрещённых правилами игры.

После того, как все корабли игрока расставлены приложение автоматически переходит в состояние «Игра»

Игра.

При входе в режим «Игра», подсказка в правом поле (поле виртуального противника) исчезает, а само поле превращается в координатную сетку поля боя.

Нанесение ударов осуществляется пользователем нажатиями левой кнопки «мыши» в пределах квадратов координатной сетки поля виртуального противника.

Каждый выстрел сопровождается соответствующим звуковым фрагментом.

В случае промаха соответствующая клетка поля боя помечается точкой.

В случае попадания – в клетке отображается часть пораженного корабля виртуального противника.

Завершение игры.

Игра завершается в четырёх случаях:

1.    Пользователь выиграл. В этом случае выдаётся соответствующее сообщение и проигрывается победная музыка.

2.    Пользователь проиграл. В этом случае также выдаётся соответствующее сообщение и проигрывается музыка поражения.

3.    Пользователь может прервать игру и переиграть её заново нажав пункт меню «Новая игра».

4.    Пользователь может просто закрыть приложение нажав стандартную кнопку закрытия окна.

Приложение 2. Исходный код главного модуля программы «Project1.dpr»

program Project1;

uses

  Forms,

  Unit1 in "Unit1.pas" {Form1},

  Unit2 in "Unit2.pas" {Form2};

{$R *.res}              // Основные Ресурсы

{$R Dop_resources.RES}  // Дополнительные Ресурсы (Звуки)

begin

  Application.Initialize;

  //Application.HelpFile := "F:ИнформатикаКурсоваяDelphiработаисодник программыmorb.HLP";

  Application.HelpFile := "morb.HLP";

  Application.Title := "Морской бой";

  Application.CreateForm(TForm1, Form1);

  Application.CreateForm(TForm2, Form2);

  Application.Run;

end.

Приложение 3. Исходный код модуля первой формы «Unit1.pas»

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ExtCtrls, StdCtrls, Menus, XPMan, Mmsystem;

type

  TForm1 = class(TForm)

    Panel1: TPanel;

    Image1: TImage;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    Label5: TLabel;

    Label6: TLabel;

    Label7: TLabel;

    Label8: TLabel;

    Label9: TLabel;

    Label10: TLabel;

    Label11: TLabel;

    Label25: TLabel;

    Panel2: TPanel;

    Image2: TImage;

    Label13: TLabel;

    Label14: TLabel;

    Label15: TLabel;

    Label16: TLabel;

    Label17: TLabel;

    Label18: TLabel;

    Label19: TLabel;

    Label20: TLabel;

    Label21: TLabel;

    Label22: TLabel;

    Label23: TLabel;

    Label26: TLabel;

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    N6: TMenuItem;

    N5: TMenuItem;

    Label12: TLabel;

    Label24: TLabel;

    Label27: TLabel;

    Label28: TLabel;

    Label29: TLabel;

    procedure FormCreate(Sender: TObject);

    procedure rastkor(Sender: TObject; Shift: TShiftState; X, Y: Integer);

    procedure nash(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

    procedure N2Click(Sender: TObject);

    procedure vistrel(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

    procedure N3Click(Sender: TObject);

    procedure N5Click(Sender: TObject);

    procedure N6Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

  i,j,g,x1,y1,k11,k21,

k33,k32,k31,m3,m2,m1,           //кол-во 3х 2х 1х кораблей

m,n,z:integer;

rot,                   //ротация кораблей

riad,rnd,              //для того что бы рядом не ставились,нужна для рандомирования

win,lose,              //проверка на победу или поражение

bum,                   //проверка выстрела компьютера

kon,                   //проверка конца игры

cokil: boolean;          //попал ли комрьютер

  b1,b2:Array[1..14,1..14] of integer;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

PlaySound("START_WAV", HInstance, SND_RESOURCE or SND_ASYNC or SND_NOWAIT);

rot:=false;   //заполнение переменных

kon:=false;

k11:=3;

k33:=2;

k32:=5;

k31:=9;

m3:=0;

m2:=0;

m1:=0;

label13.Height:=0;

label14.Height:=0;

label15.Height:=0;

label16.Height:=0;

label17.Height:=0;

label18.Height:=0;

label19.Height:=0;

label20.Height:=0;

label21.Height:=0;

label22.Height:=0;

label23.Height:=0;

label26.Height:=0;

label12.Caption:="Расставьте корабли";

For i:=1 to 10 do  //рисует сетку поля игрока

  for j:=1 to 10 do

    begin

      b1[i,j]:=0;

      image1.Canvas.Rectangle(20*i-20,20*j-20,20*i,20*j);

    end;

randomize;

 m:=random(10)+1;

 n:=random(10)+1;

 z:=(random(100) mod 2);

//расстановка клораблей компьютера

//четырехпалубный

case n of

  1..7:

    case m of

      1..7: for i:=0 to 3 do

              if z=0 then

                b2[m+i,n]:=2

              else

                b2[m,n+i]:=2;

      8..10: for i:=0 to 3 do

              if z=0 then

                b2[m-i,n]:=2

              else

                b2[m,n+i]:=2;

     end;

   8..10:

     case m of

      1..7: for i:=0 to 3 do

              if z=0 then

                b2[m+i,n]:=2

              else

                b2[m,n-i]:=2;

      8..10: for i:=0 to 3 do

              if z=0 then

                b2[m-i,n]:=2

              else

                b2[m,n-i]:=2;

      end;

end;

                //трехпалубные

while m3<2 do begin

  m:=random(10)+1;

  n:=random(10)+1;

  z:=(random(100) mod 2);

case n of

  1..7:

    case m of

      1..7: case z of

                 0:    if  (b2[m,n]<>2) and

                           (b2[m-1,n-1]<>2) and

                           (b2[m-1,n]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m,n-1]<>2)and

                           (b2[m+1,n+1]<>2)and

                           (b2[m+1,n]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m+1,n+2]<>2) and

                           (b2[m-1,n+2]<>2) and

                           (b2[m,n+2]<>2) and

                           (b2[m+1,n+3]<>2) and

                           (b2[m-1,n+3]<>2) and

                           (b2[m,n+3]<>2) and

                           (b2[m,n+3]<>2)  then

                              begin

                          for i:=0 to 2 do

                          b2[m,n+i]:=2;

                            m3:=m3+1

                              end;

                   1:  if  (b2[m,n]<>2) and

                           (b2[m+1,n+1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m-1,n]<>2)and

                           (b2[m-1,n-1]<>2)and

                           (b2[m,n-1]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m+1,n]<>2) and

                           (b2[m+2,n-1]<>2) and

                           (b2[m+2,n+1]<>2) and

                           (b2[m+2,n]<>2) and

                           (b2[m+3,n-1]<>2) and

                           (b2[m+3,n+1]<>2) and

                           (b2[m+3,n]<>2) and

                           (b2[m+3,n]<>2)  then  begin

                          for i:=0 to 2 do

                             b2[m+i,n]:=2;

                             m3:=m3+1

                                                  end

            end;

      8..10: case z of

                 0: if     (b2[m,n]<>2) and

                           (b2[m+1,n+1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m-1,n]<>2)and

                           (b2[m-1,n-1]<>2)and

                           (b2[m,n-1]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m-2,n-1]<>2) and

                           (b2[m-2,n+1]<>2) and

                           (b2[m-2,n]<>2) and

                           (b2[m-3,n-1]<>2) and

                           (b2[m-3,n+1]<>2) and

                           (b2[m-3,n]<>2)  then

                       begin

                          for i:=0 to 2 do

                             b2[m-i,n]:=2;

                               m3:=m3+1

                      end;

                   1:    if  (b2[m,n]<>2) and

                           (b2[m-1,n-1]<>2) and

                           (b2[m-1,n]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m,n-1]<>2)and

                           (b2[m+1,n+1]<>2)and

                           (b2[m+1,n]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m+1,n+2]<>2) and

                           (b2[m-1,n+2]<>2) and

                           (b2[m,n+2]<>2) and

                           (b2[m+1,n+3]<>2) and

                           (b2[m-1,n+3]<>2) and

                           (b2[m,n+3]<>2) and

                           (b2[m,n+3]<>2)  then

                              begin

                          for i:=0 to 2 do

                          b2[m,n+i]:=2;

                            m3:=m3+1

                              end;

                  end

     end;

   8..10:

     case m of

      1..7: case z of

                 0:  if   (b2[m,n]<>2) and

                           (b2[m+1,n+1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m-1,n]<>2)and

                           (b2[m-1,n-1]<>2)and

                           (b2[m,n-1]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m+2,n-1]<>2) and

                           (b2[m+2,n+1]<>2) and

                           (b2[m+2,n]<>2) and

                           (b2[m+3,n-1]<>2) and

                           (b2[m+3,n+1]<>2) and

                           (b2[m+3,n]<>2)  then begin

                          for i:=0 to 2 do

                             b2[m+i,n]:=2;

                             m3:=m3+1

                                            end;

                 1:     if  (b2[m,n]<>2) and

                           (b2[m-1,n-1]<>2) and

                           (b2[m-1,n]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m,n-1]<>2)and

                           (b2[m+1,n+1]<>2)and

                           (b2[m+1,n]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m+1,n-2]<>2) and

                           (b2[m-1,n-2]<>2) and

                           (b2[m,n-2]<>2) and

                           (b2[m+1,n-3]<>2) and

                           (b2[m-1,n-3]<>2) and

                           (b2[m,n-3]<>2)  then

                              begin

                          for i:=0 to 2 do

                             b2[m,n-i]:=2;

                                m3:=m3+1

                              end

                  end;

      8..10: case z of

                 0:    if  (b2[m,n]<>2) and

                           (b2[m-1,n-1]<>2) and

                           (b2[m-1,n]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m,n-1]<>2)and

                           (b2[m+1,n+1]<>2)and

                           (b2[m+1,n]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m+1,n-2]<>2) and

                           (b2[m-1,n-2]<>2) and

                           (b2[m,n-2]<>2) and

                           (b2[m+1,n-3]<>2) and

                           (b2[m-1,n-3]<>2) and

                           (b2[m,n-3]<>2)  then

                              begin

                          for i:=0 to 2 do

                             b2[m,n-i]:=2;

                                m3:=m3+1

                              end;

                 1: if     (b2[m,n]<>2) and

                           (b2[m+1,n+1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m-1,n]<>2)and

                           (b2[m-1,n-1]<>2)and

                           (b2[m,n-1]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m-2,n-1]<>2) and

                           (b2[m-2,n+1]<>2) and

                           (b2[m-2,n]<>2) and

                           (b2[m-3,n-1]<>2) and

                           (b2[m-3,n+1]<>2) and

                           (b2[m-3,n]<>2)  then

                       begin

                          for i:=0 to 2 do

                             b2[m-i,n]:=2;

                               m3:=m3+1

                      end

                  end

      end

end

end;

//двухпалубные

while m2<3 do begin

  m:=random(10)+1;

  n:=random(10)+1;

  z:=(random(100) mod 2);

case n of

  1..8:

    case m of

      1..8: case z of

                 0:    if  (b2[m,n]<>2) and

                           (b2[m-1,n-1]<>2) and

                           (b2[m-1,n]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m,n-1]<>2)and

                           (b2[m+1,n+1]<>2)and

                           (b2[m+1,n]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m+1,n+2]<>2) and

                           (b2[m-1,n+2]<>2) and

                           (b2[m,n+2]<>2)  then

                              begin

                          for i:=0 to 1 do

                          b2[m,n+i]:=2;

                            m2:=m2+1

                              end;

                   1:  if  (b2[m,n]<>2) and

                           (b2[m+1,n+1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m-1,n]<>2)and

                           (b2[m-1,n-1]<>2)and

                           (b2[m,n-1]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m+1,n]<>2) and

                           (b2[m+2,n-1]<>2) and

                           (b2[m+2,n+1]<>2) and

                           (b2[m+2,n]<>2)  then  begin

                          for i:=0 to 1 do

                             b2[m+i,n]:=2;

                             m2:=m2+1

                                                  end

            end;

      9..10: case z of

                 0: if     (b2[m,n]<>2) and

                           (b2[m+1,n+1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m-1,n]<>2)and

                           (b2[m-1,n-1]<>2)and

                           (b2[m,n-1]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m-2,n-1]<>2) and

                           (b2[m-2,n+1]<>2) and

                           (b2[m-2,n]<>2)  then

                       begin

                          for i:=0 to 1 do

                             b2[m-i,n]:=2;

                               m2:=m2+1

                      end;

                   1:    if  (b2[m,n]<>2) and

                           (b2[m-1,n-1]<>2) and

                           (b2[m-1,n]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m,n-1]<>2)and

                           (b2[m+1,n+1]<>2)and

                           (b2[m+1,n]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m+1,n+2]<>2) and

                           (b2[m-1,n+2]<>2) and

                           (b2[m,n+2]<>2)  then

                              begin

                          for i:=0 to 1 do

                          b2[m,n+i]:=2;

                            m2:=m2+1

                              end;

                  end

     end;

   9..10:

     case m of

      1..8: case z of

                 0:  if   (b2[m,n]<>2) and

                           (b2[m+1,n+1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m-1,n]<>2)and

                           (b2[m-1,n-1]<>2)and

                           (b2[m,n-1]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m+2,n-1]<>2) and

                           (b2[m+2,n+1]<>2) and

                           (b2[m+2,n]<>2)  then begin

                          for i:=0 to 1 do

                             b2[m+i,n]:=2;

                             m2:=m2+1

                                            end;

                 1:     if  (b2[m,n]<>2) and

                           (b2[m-1,n-1]<>2) and

                           (b2[m-1,n]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m,n-1]<>2)and

                           (b2[m+1,n+1]<>2)and

                           (b2[m+1,n]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m+1,n-2]<>2) and

                           (b2[m-1,n-2]<>2) and

                           (b2[m,n-2]<>2)  then

                              begin

                          for i:=0 to 1 do

                             b2[m,n-i]:=2;

                                m2:=m2+1

                              end

                  end;

      9..10: case z of

                 0:    if  (b2[m,n]<>2) and

                           (b2[m-1,n-1]<>2) and

                           (b2[m-1,n]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m,n-1]<>2)and

                           (b2[m+1,n+1]<>2)and

                           (b2[m+1,n]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m+1,n-2]<>2) and

                           (b2[m-1,n-2]<>2) and

                           (b2[m,n-2]<>2)  then

                              begin

                          for i:=0 to 1 do

                             b2[m,n-i]:=2;

                                m2:=m2+1

                              end;

                 1: if     (b2[m,n]<>2) and

                           (b2[m+1,n+1]<>2) and

                           (b2[m,n+1]<>2) and

                           (b2[m-1,n+1]<>2) and

                           (b2[m-1,n]<>2)and

                           (b2[m-1,n-1]<>2)and

                           (b2[m,n-1]<>2) and

                           (b2[m+1,n-1]<>2) and

                           (b2[m-2,n-1]<>2) and

                           (b2[m-2,n+1]<>2) and

                           (b2[m-2,n]<>2)  then

                       begin

                          for i:=0 to 1 do

                             b2[m-i,n]:=2;

                               m2:=m2+1

                      end

                  end

      end

end

end;

//подлодки

while m1<4 do begin

  m:=random(10)+1;

  n:=random(10)+1;

while m1<4 do begin

  m:=random(10)+1;

  n:=random(10)+1;

if  (b2[m,n]<>2) and

     (b2[m+1,n+1]<>2) and

     (b2[m,n+1]<>2) and

     (b2[m-1,n+1]<>2) and

     (b2[m-1,n]<>2)and

     (b2[m-1,n-1]<>2)and

     (b2[m,n-1]<>2) and

     (b2[m+1,n-1]<>2) and

     (b2[m+1,n]<>2)  then  begin

      b2[m,n]:=2;

      m1:=m1+1;

end

end;

end;

end;

procedure TForm1.rastkor(Sender: TObject; Shift: TShiftState; X,

  Y: Integer);                     //расстановка кораблей на поле игрока

begin

image1.Canvas.Brush.Color:=clwhite;

y1:=(Y div 20)+1;

x1:=(X div 20)+1;

For i:=1 to 10 do

  for j:=1 to 10 do

    begin

      if (b1[i,j]<>2) and (b1[i,j]<>3) and (b1[i,j]<>4) then

        begin

          b1[i,j]:=0;

          image1.Canvas.Rectangle(20*i-20,20*j-20,20*i,20*j);

        end;

    end;

if rot=false then begin     //ротация кораблей по горизонтали

casek11 of                 //смотрит какой корабль надо располагать

0: begin if  (b1[x1,y1]<>2)  then

    for i:=0 to 0 do

    b1[x1+i,y1]:=1; end;

 1: begin if  (b1[x1,y1]<>2) and (b1[x1+1,y1]<>2)then

    for i:=0 to 1 do  begin

    b1[x1+i,y1]:=1 end; end;

 2: begin if  (b1[x1,y1]<>2) and (b1[x1+1,y1]<>2) and (b1[x1+2,y1]<>2) then

    for i:=0 to 2 do

    b1[x1+i,y1]:=1; end;

 3: begin if  (b1[x1,y1]<>2) and (b1[x1+1,y1]<>2) and (b1[x1+2,y1]<>2) and (b1[x1+3,y1]<>2)  then

    for i:=0 to 3 do

    b1[x1+i,y1]:=1; end;

   end;

Fori:=1 to 10 do               //рисует желтым цветом текущее положение корабля

for j:=1 to 10 do

    begin

      if (b1[i,j]=1) then

        begin

          image1.Canvas.Brush.Color:=clyellow;

          image1.Canvas.Rectangle(20*i-20,20*j-20,20*(i),20*(j));

        end;

end;

end

else            //ротация кораблей по вертикали

begin

case k11 of

 0: begin if  (b1[x1,y1]<>2)  then

    for i:=0 to 0 do

    b1[x1,y1+i]:=1; end;

 1: begin if  (b1[x1,y1]<>2) and (b1[x1,y1+1]<>2)then

    for i:=0 to 1 do  begin

    b1[x1,y1+i]:=1 end; end;

 2: begin if  (b1[x1,y1]<>2) and (b1[x1,y1+1]<>2) and (b1[x1,y1+2]<>2) then

    for i:=0 to 2 do

    b1[x1,y1+i]:=1; end;

 3: begin if  (b1[x1,y1]<>2) and (b1[x1,y1+1]<>2) and (b1[x1,y1+2]<>2) and (b1[x1,y1+3]<>2)  then

    for i:=0 to 3 do

    b1[x1,y1+i]:=1; end;

   end;

For i:=1 to 10 do

  for j:=1 to 10 do

    begin

      if (b1[i,j]=1) then

        begin

          image1.Canvas.Brush.Color:=clyellow;

          image1.Canvas.Rectangle(20*i-20,20*j-20,20*(i),20*(j));

        end;

    end;

end;

end;

procedure TForm1.nash(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);     //процедура постановки корабля

begin

PlaySound("SET_WAV", HInstance, SND_RESOURCE or SND_ASYNC or SND_NOWAIT);

x1:=(X div 20)+1;

y1:=(Y div 20)+1;

ifk11>=0 thenbegin    //смотрит поставлены все корабли или нет

ifbutton=mbrightthenbegin   //производит ротацию корабля по нажатии правой кн мыши

if rot=true then

       rot:=false

     else

       rot:=true;

       begin

image1.Canvas.Brush.Color:=clwhite;

Fori:=1 to 10 do                 //рисует в пустых клетках белые квадрвты

for j:=1 to 10 do

    begin

      if b1[i,j]<>2 then

        begin

          b1[i,j]:=0;

          image1.Canvas.Rectangle(20*i-20,20*j-20,20*i,20*j);

        end;

    end;

if rot=false then begin     //ротация кораблей по горизонтали

casek11 of     //смотрит какой корабль сейчас надо расстанавливать

0: begin if  (b1[x1,y1]<>2)  then

    b1[x1,y1]:=1; end;

 1: begin if  (b1[x1,y1]<>2) and (b1[x1+1,y1]<>2)then

    for i:=0 to 1 do  begin

    b1[x1+i,y1]:=1 end; end;

 2: begin if  (b1[x1,y1]<>2) and (b1[x1+1,y1]<>2) and (b1[x1+2,y1]<>2) then

    for i:=0 to 2 do

    b1[x1+i,y1]:=1; end;

 3: begin if  (b1[x1,y1]<>2) and (b1[x1+1,y1]<>2) and (b1[x1+2,y1]<>2) and (b1[x1+3,y1]<>2)  then

    for i:=0 to 3 do

    b1[x1+i,y1]:=1; end;

   end;

Fori:=1 to 10 do   //рисует желтым цветом корабль(ещё не поставленный)

for j:=1 to 10 do

    begin

      if (b1[i,j]=1) then

        begin

          image1.Canvas.Brush.Color:=clyellow;

          image1.Canvas.Rectangle(20*i-20,20*j-20,20*(i),20*(j));

        end;

end;

end

else            //ротация кораблей по вертикали

begin

casek11 of   //смотрит какой корабль сейчас надо расстанавливать

0: begin if  (b1[x1,y1]<>2)  then

    b1[x1,y1]:=1; end;

 1: begin if  (b1[x1,y1]<>2) and (b1[x1,y1+1]<>2)then

    for i:=0 to 1 do  begin

    b1[x1,y1+i]:=1 end; end;

 2: begin if  (b1[x1,y1]<>2) and (b1[x1,y1+1]<>2) and (b1[x1,y1+2]<>2) then

    for i:=0 to 2 do

    b1[x1,y1+i]:=1; end;

 3: begin if  (b1[x1,y1]<>2) and (b1[x1,y1+1]<>2) and (b1[x1,y1+2]<>2) and (b1[x1,y1+3]<>2)  then

    for i:=0 to 3 do

    b1[x1,y1+i]:=1; end;

   end;

Fori:=1 to 10 do        //рисует желтым цветом корабль(ещё не поставленный)

for j:=1 to 10 do

    begin

      if (b1[i,j]=1) then

        begin

          image1.Canvas.Brush.Color:=clyellow;

          image1.Canvas.Rectangle(20*i-20,20*j-20,20*(i),20*(j));

        end;

    end;

end;

end;

end

else

ifrot=falsethenbegin   //ставит корабль по горизонтали

casek11 of     //смотрит какой корабль ставить

 0: casex1 of    //смотрит есть ли рядом с однопалубным кораблём другие корабли

1: if (b1[x1,y1]<>2) and

       (b1[x1+1,y1+1]<>2) and

       (b1[x1,y1+1]<>2) and

       (b1[x1,y1-1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+1,y1]<>2) then

         begin

          b1[x1,y1]:=2;

          riad:=true

         end

        else

          riad:=false;

     2..10:  if  (b1[x1,y1]<>2) and

       (b1[x1+1,y1+1]<>2) and

       (b1[x1,y1+1]<>2) and

       (b1[x1-1,y1+1]<>2) and

       (b1[x1-1,y1]<>2)and

       (b1[x1-1,y1-1]<>2)and

       (b1[x1,y1-1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+1,y1]<>2) then begin

     b1[x1,y1]:=2;

     riad:=true

     end

    else

riad:=false;

end;

 1: casex1 of     //смотрит есть ли рядом с двупалубным кораблём другие корабли

1:if(b1[x1,y1]<>2) and

       (b1[x1+1,y1+1]<>2) and

       (b1[x1,y1+1]<>2) and

       (b1[x1,y1-1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+2,y1-1]<>2) and

       (b1[x1+2,y1+1]<>2) and

       (b1[x1+2,y1]<>2) and (x1+1<11)

        then

           for i:=0 to k11 do

            begin

              b1[x1+i,y1]:=2;

              riad:=true

            end

        else

          riad:=false;

     2..10:   if (b1[x1,y1]<>2) and

       (b1[x1+1,y1+1]<>2) and

       (b1[x1,y1+1]<>2) and

       (b1[x1-1,y1+1]<>2) and

       (b1[x1-1,y1]<>2)and

       (b1[x1-1,y1-1]<>2)and

       (b1[x1,y1-1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+2,y1-1]<>2) and

       (b1[x1+2,y1+1]<>2) and

       (b1[x1+2,y1]<>2) and (x1+1<11) then

     for i:=0 to k11 do begin

     b1[x1+i,y1]:=2;

     riad:=true

     end

    else

      riad:=false;

     end;

2: casex1 of                      //смотрит есть ли рядом с трехпалубным кораблём другие корабли

1: if (b1[x1,y1]<>2) and

       (b1[x1+1,y1+1]<>2) and

       (b1[x1,y1+1]<>2) and

       (b1[x1,y1-1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+2,y1-1]<>2) and

       (b1[x1+2,y1+1]<>2) and

       (b1[x1+3,y1-1]<>2) and

       (b1[x1+3,y1+1]<>2) and

       (b1[x1+3,y1]<>2) and (x1+2<11) then

     for i:=0 to k11 do begin

     b1[x1+i,y1]:=2;

     riad:=true

     end

    else

      riad:=false;

    2..10:

    if (b1[x1,y1]<>2) and

       (b1[x1+1,y1+1]<>2) and

       (b1[x1,y1+1]<>2) and

       (b1[x1-1,y1+1]<>2) and

       (b1[x1-1,y1]<>2)and

       (b1[x1-1,y1-1]<>2)and

       (b1[x1,y1-1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+2,y1-1]<>2) and

       (b1[x1+2,y1+1]<>2) and

       (b1[x1+3,y1-1]<>2) and

       (b1[x1+3,y1+1]<>2) and

       (b1[x1+3,y1]<>2) and (x1+2<11) then

     for i:=0 to k11 do begin

     b1[x1+i,y1]:=2;

     riad:=true

     end

    else

      riad:=false

      end;

3: ifx1+3<11 then      //ставит четырехпалубный корабль

begin

    for i:=0 to k11 do

    b1[x1+i,y1]:=2;

     riad:=true

       end

     else

    riad:=false;

 end;

ifriad=truethenbegin  //смотрит если корабль поставлен то уменьшает счетчик

if (k11=3) then

  begin;

    k11:=k11-1;

  end;

if (k11=2) and (k33=0) then

   begin

    k11:=k11-1;

    k33:=k33-1

   end

else

    k33:=k33-1;

if (k11=1) and (k32=0) then

    begin

    k11:=k11-1;

    k32:=k32-1

    end

else

    k32:=k32-1;

if (k11=0) and (k31=0) then

    begin

    k11:=k11-1;

    k31:=k31-1

    end

else

k31:=k31-1;

end;

end

else                     //ставит корабль по горизонтали

begin

casek11 of              //смотрит какой корабль ставить

 0: casex1 of             //смотрит есть ли рядом с однопалубным кораблём другие корабли

1: if (b1[x1,y1]<>2) and

       (b1[x1+1,y1+1]<>2) and

       (b1[x1,y1+1]<>2) and

       (b1[x1,y1-1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+1,y1]<>2) then

         begin

          b1[x1,y1]:=2;

          riad:=true

         end

        else

          riad:=false;

     2..10:  if

       (b1[x1,y1]<>2)  and

       (b1[x1+1,y1+1]<>2) and

       (b1[x1,y1+1]<>2) and

       (b1[x1-1,y1+1]<>2) and

       (b1[x1-1,y1]<>2)and

       (b1[x1-1,y1-1]<>2)and

       (b1[x1,y1-1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+1,y1]<>2) then begin

     b1[x1,y1]:=2;

     riad:=true

     end

    else

riad:=false;

end;

 1: casex1 of                       //смотрит есть ли рядом с двупалубным кораблём другие корабли

1:  if  (b1[x1,y1]<>2) and

       (b1[x1,y1-1]<>2)and

       (b1[x1+1,y1+1]<>2)and

       (b1[x1+1,y1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+1,y1+2]<>2) and

       (b1[x1,y1+2]<>2) and (y1+1<11)  then

    for i:=0 to k11 do begin

     b1[x1,y1+i]:=2;

     riad:=true

     end

    else

      riad:=false;

    2..10:

    if (b1[x1,y1]<>2) and

       (b1[x1-1,y1-1]<>2) and

       (b1[x1-1,y1]<>2) and

       (b1[x1-1,y1+1]<>2) and

       (b1[x1,y1-1]<>2)and

       (b1[x1+1,y1+1]<>2)and

       (b1[x1+1,y1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+1,y1+2]<>2) and

       (b1[x1-1,y1+2]<>2) and

       (b1[x1,y1+2]<>2) and (y1+1<11)  then

    for i:=0 to k11 do begin

     b1[x1,y1+i]:=2;

     riad:=true

     end

    else

      riad:=false

      end;

2: casex1 of                     //смотрит есть ли рядом с двупалубным кораблём другие корабли

1:if (b1[x1,y1]<>2) and

       (b1[x1,y1-1]<>2)and

       (b1[x1+1,y1+1]<>2)and

       (b1[x1+1,y1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+1,y1+2]<>2) and

       (b1[x1+1,y1+3]<>2) and

       (b1[x1,y1+3]<>2) and (y1+2<11) then

     for i:=0 to k11 do begin

     b1[x1,y1+i]:=2;

     riad:=true

     end

    else

      riad:=false;

  2..10:

    if (b1[x1,y1]<>2) and

       (b1[x1-1,y1-1]<>2) and

       (b1[x1-1,y1]<>2) and

       (b1[x1-1,y1+1]<>2) and

       (b1[x1,y1-1]<>2)and

       (b1[x1+1,y1+1]<>2)and

       (b1[x1+1,y1]<>2) and

       (b1[x1+1,y1-1]<>2) and

       (b1[x1+1,y1+2]<>2) and

       (b1[x1-1,y1+2]<>2) and

       (b1[x1+1,y1+3]<>2) and

       (b1[x1-1,y1+3]<>2) and

       (b1[x1,y1+3]<>2) and (y1+2<11) then

     for i:=0 to k11 do begin

     b1[x1,y1+i]:=2;

     riad:=true

     end

    else

      riad:=false

      end;                                 //ставит 4палубный корабль

  3: if y1+3<11 then

      begin

    for i:=0 to k11 do

    b1[x1,y1+i]:=2;

     riad:=true

       end

      else

       riad:=false

end;

ifriad=truethenbegin                 //смотрит если корабль поставлен то уменьшает счетчик

if (k11=3) then

  begin;

    k11:=k11-1;

  end;

if (k11=2) and (k33=0) then

   begin

    k11:=k11-1;

    k33:=k33-1

   end

else

    k33:=k33-1;

if (k11=1) and (k32=0) then

    begin

    k11:=k11-1;

    k32:=k32-1

    end

else

    k32:=k32-1;

if (k11=0) and (k31=0) then

    begin

    k11:=k11-1;

    k31:=k31-1

    end

else

    k31:=k31-1;

end;

end;

Fori:=1 to 10 do            //закрашивает поставленные корабли Серым

for j:=1 to 10 do

    begin

      if b1[i,j]=2 then

        begin

          image1.Canvas.Brush.Color:=clgray;

          image1.Canvas.Rectangle(20*i-20,20*j-20,20*i,20*j);

        end;

    end;

ifk11<0 thenbegin           //проверяет поставлены ли все корабли, если "да" то начинает игру с компьютером

label12.Height:=0;

   label13.Height:=13;

   label14.Height:=13;

   label15.Height:=13;

   label16.Height:=13;

   label17.Height:=13;

   label18.Height:=13;

   label19.Height:=13;

   label20.Height:=13;

   label21.Height:=13;

   label22.Height:=13;

   label23.Height:=13;

   label26.Height:=13;

   image2.Height:=200;

   image2.Width:=200;

   fori:=1 to 10 do      //ресует белую сетку поля компьютера

for j:=1 to 10 do begin

   image2.Canvas.Brush.Color:=clwhite;

   image2.Canvas.Rectangle(20*i-20,20*j-20,20*i,20*j) end

    end;

end;

end;

procedure TForm1.N2Click(Sender: TObject);   //начинает новыю игру

begin

image1.Canvas.Brush.Color:=clwhite;

rot:=false;

k11:=3;

k33:=2;

k32:=5;

k31:=9;

label12.Height:=62;

image2.Height:=0;

For i:=1 to 10 do   //обнуляет массивы

  for j:=1 to 10 do

    begin

      b1[i,j]:=0;

      b2[i,j]:=0;

      image1.Canvas.Rectangle(20*i-20,20*j-20,20*i,20*j);

    end;

FormCreate(self); //использует процедуру создания формы

end;

procedure TForm1.vistrel(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);                  //процедура обмена выстрелов

begin

PlaySound("BUM_WAV", HInstance, SND_RESOURCE or SND_ASYNC or SND_NOWAIT);

x1:=(X div 20)+1;

y1:=(Y div 20)+1;

ifkon=falsethenbegin       //проверка закончилась игра или нет

caseb2[x1,y1] of

    0: b2[x1,y1]:=3;          //если попал в пустую клетка становится - просреленной пустой

    2: b2[x1,y1]:=4;          //если попал в клетку с кораблем то она становится- подбитой

    3,4: exit;                //если попал в клетку в которую уже стрелял то ничего не происходит

end;

fori:=1 to 10 do           //рисуется графическое поле компютера

for j:=1 to 10 do

    begin

    case b2[i,j] of

4: begin                     //клетка в котрой стоит подбитый или не доконца подбитый корабль

if ((b2[i+1,j]=2)        //не доконца подбитый корабль

or(b2[i,j+1]=2)

             or(b2[i-1,j]=2)

             or(b2[i,j-1]=2))

             or (((b2[i+1,j]=4)and(b2[i+2,j]=2))

             or((b2[i,j+1]=4)and(b2[i,j+2]=2))

             or((b2[i-1,j]=4)and(b2[i-2,j]=2))

             or((b2[i,j-1]=4)and(b2[i,j-2]=2)))

             or(((b2[i+1,j]=4)and(b2[i+2,j]=4) and (b2[i+3,j]=2))

             or((b2[i,j+1]=4)and(b2[i,j+2]=4)and(b2[i,j+3]=2))

             or((b2[i-1,j]=4)and(b2[i-2,j]=4)and(b2[i-3,j]=2))

             or((b2[i,j-1]=4)and(b2[i,j-2]=4)and(b2[i,j-3]=2)))

             then

              begin

               image2.Canvas.Brush.Color:=clgray;

               image2.Canvas.Rectangle(20*i-20,20*j-20,20*i,20*j);

               image2.Canvas.pen.Color:=clred;

               image2.Canvas.MoveTo(20*i-19,20*j-19);

               image2.Canvas.LineTo(20*i-1,20*j-1);

               image2.Canvas.MoveTo(20*i-1,20*j-19);

               image2.Canvas.LineTo(20*i-19,20*j-1);

               image2.Canvas.pen.Color:=clblack;

              end

             else                                   //подбитый корабль

              begin

               image2.Canvas.Brush.Color:=clred;

               image2.Canvas.Rectangle(20*i-20,20*j-20,20*i,20*j)

              end;

end;

     3: begin                                     //простреленная пустая клетка

image2.Canvas.Brush.Color:=clwhite;

         image2.Canvas.Rectangle(20*i-15,20*j-15,20*i-5,20*j-5)

        end;

end;

end;

win:=true;

Fori:=1 to 10 do       //если находится хотябы один неподбитый корабль то победы нет

for j:=1 to 10 do

    if b2[i,j]=2 then

      win:=false;

if win=true then        //вывод сообщения при победе

 begin

  PlaySound("POBEDA_WAV", HInstance, SND_RESOURCE or SND_ASYNC or SND_NOWAIT);

  showmessage ("Поздравляю!"+#13+"Вы победили.");

kon:=true;

  exit

end;

ifb2[x1,y1]=4 then      //если игрок попал то компьютер не ходит

exit;

bum:=false;

cokil:=true;

while (bum=false) or (cokil=true) do   //стрел-ть до тех пор пока не попал в клетку в которую не стрылял и если она пустая

begin

m:=random(10)+1;

n:=random(10)+1;

case b1[m,n] of

  0: begin

      b1[m,n]:=3;

      bum:=true;

      cokil:=false

     end;

  2: begin

      b1[m,n]:=4;

      bum:=true;

      cokil:=true

     end

end;

Fori:=1 to 10 do                   //рисуется графическое поле игрока

for j:=1 to 10 do

    begin

     case b1[i,j] of

     3: begin                       //простреленая пустая клетка

         image1.Canvas.Brush.Color:=clwhite;

         image1.Canvas.Rectangle(20*i-15,20*j-15,20*i-5,20*j-5)

        end;

     4:begin                       //клетка в котрой стоит подбитый или не доконца подбитый корабль

if ((b1[i+1,j]=2)

          or(b1[i,j+1]=2)

          or(b1[i-1,j]=2)

          or(b1[i,j-1]=2))

          or(((b1[i+1,j]=4)and(b1[i+2,j]=2))

          or((b1[i,j+1]=4)and(b1[i,j+2]=2))

          or((b1[i-1,j]=4)and(b1[i-2,j]=2))

          or((b1[i,j-1]=4)and(b1[i,j-2]=2)))

          or(((b1[i+1,j]=4)and(b1[i+2,j]=4)and(b1[i+3,j]=2))

          or((b1[i,j+1]=4)and(b1[i,j+2]=4)and(b1[i,j+3]=2))

          or((b1[i-1,j]=4)and(b1[i-2,j]=4)and(b1[i-3,j]=2))

          or((b1[i,j-1]=4)and(b1[i,j-2]=4)and(b1[i,j-3]=2)))

             thenbegin                                       //не доконца подбитый корабль

image1.Canvas.pen.Color:=clred;

               image1.Canvas.MoveTo(20*i-19,20*j-19);

               image1.Canvas.LineTo(20*i-1,20*j-1);

               image1.Canvas.MoveTo(20*i-1,20*j-19);

               image1.Canvas.LineTo(20*i-19,20*j-1);

               image1.Canvas.pen.Color:=clblack;

             end

             else                                           //подбитый корабль

             begin

              image1.Canvas.Brush.Color:=clred;

              image1.Canvas.Rectangle(20*i-20,20*j-20,20*i,20*j)

             end;

       end;

    end;

  end;

end;

lose:=true;

Fori:=1 to 10 do              //если находится хотябы один неподбитый корабль то проигрыша нет

for j:=1 to 10 do

    if b1[i,j]=2 then

      lose:=false;

if lose=true then

 begin

  PlaySound("PORAJENIE_WAV", HInstance, SND_RESOURCE or SND_ASYNC or SND_NOWAIT);

  kon:=true;

  showmessage ("Вы проиграли."+#13+"Попробуйте ещё раз!");

  exit

 end;

end;

end;

procedure TForm1.N3Click(Sender: TObject);    //процедура нажатия на кнопку "выход"

begin

close

end;

procedure TForm1.N5Click(Sender: TObject);   //процедура нажатия на кнопку "О программе..."

begin

form2.ShowModal

end;

procedure TForm1.N6Click(Sender: TObject);

begin

winhelp(Form1.Handle,"morb.hlp",HELP_CONTEXT,1);

end;

end.

Приложение 4. Исходный код модуля второй формы «Unit2.pas»

unit Unit2;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, jpeg, ExtCtrls;

type

  TForm2 = class(TForm)

    Image1: TImage;

    Label1: TLabel;

    Button1: TButton;

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);

begin

label1.Caption:="Курсовая работа студента 4-ого курса"+

                #13+#13+"факультета информатики"+

                #13+#13+"Круглова В.Н."

end;

procedure TForm2.Button1Click(Sender: TObject);

begin

close

end;

end.

Информация о файле
Название файла Разработка игрового оконного приложения Морской бой от пользователя Гость
Дата добавления 23.5.2020, 15:56
Дата обновления 23.5.2020, 15:56
Тип файла Тип файла (zip - application/zip)
Скриншот Не доступно
Статистика
Размер файла 226.74 килобайт (Примерное время скачивания)
Просмотров 735
Скачиваний 144
Оценить файл