Министерство образования Московской области
Государственное образовательное учреждение высшего образования Московской области
«Государственный гуманитарно-технологический университет»
(ГГТУ)
Факультет информатики
Кафедра информатики
Направление подготовки: (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 стимулирует развитие у детей дошкольного и младшего школьного возраста логику мышления, воображение, способность планирования собственных действий.
Дополнительно можно отметить, что разработанное приложение:
Ø может быть использовано в качестве базы программного кода при разработке более сложных программных приложений, использующих различные мультимедийные данные.
Ø представляет собой готовый шаблон для разработки приложений, управляемых событиями с элементами автоматического принятия решений на основе встроенной логики.
Кроме того, разработанное приложение является полноценной компьютерной игрой и может быть использовано по своему прямому назначению.
В ходе работы все задачи решены, поставленная цель достигнута.
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
Международные стандарты
- MIL-STD-498. Разработка и документирование программного обеспечения.
- ISO 9126:1991. Информационная технология. Оценка программного продукта. Характеристики качества и руководство по их применению.
- ANSI/IEEE 829-1983. Документация при тестировании программ.
- ANSI/IEEE 1008-1986. Тестирование программных модулей и компонентов ПС.
Стандарты РФ в соответствии со стандартами ISO
- ГОСТ Р ИСО/МЭК 9294-93. Информационная технология. Руководство по управлению документированием программного обеспечения.
- ГОСТ Р ИСО/МЭК 9127-94. Системы обработки информации. Документация пользователя и информация на упаковке для потребительских программных пакетов.
- ГОСТ Р ИСО/МЭК 12119:1994. Информационная технология. Пакеты программных средств. Требования к качеству и испытаниям.
Стандарты «Единой Системы Программной Документации»:
- ГОСТ 19.001-77 ЕСПД. Общие положения.
- ГОСТ 19.103-77 ЕСПД. Обозначение программ и программных документов.
- ГОСТ 19.105-78 ЕСПД. Общие требования к программным документам.
- ГОСТ 19.201-78 ЕСПД. Техническое задание. Требования к содержанию и оформлению.
- ГОСТ 19.504-79 ЕСПД. Руководство программиста. Требования к содержанию и оформлению.
- ГОСТ 19.505-79 ЕСПД. Руководство оператора. Требования к содержанию и оформлению.
По разработке информационных систем и программированию
- Благодатских В.А., Волнин В.А., Поскакалов К.Ф. Стандартизация разработки программных средств. – М.: Финансы и статистика, 2003 г.
- Бобровский С. Программирование в Delphi 7. – СПб.: Информ-Пресс, 2011 г. – 806 c.
- Вигерс К. Разработка требований к программному обеспечению. Пер. с англ. - М.: Издательско-торговый дом "Русская Редакция", 2011 г. –576 с.
- Котляров В. П., Коликова Т. В. Основы тестирования программного обеспечения. – М.: Бином. Лаборатория знаний, 2011 г. –288 с.
- Липаев В.В. Надежность программных средств. – М.: СИНТЕГ, 1998 г.
- Липаев В.В. Документирование и управление конфигурацией программных средств – М.: СИНТЕГ, 1998 г.
- Липаев В.В. Системное проектирование сложных программных систем. – М.: СИНТЕГ, 1998 г.
- Орлов С.А. Технологии разработки программного обеспечения: Разработка сложных программных систем: Учебное пособие для студентов вузов, обуч. по напр. подготовки бакалавров и магистров «Информатика и выч. техника». – СПб.: Питер, 2002 г.
- Пальчун Б.П., Юсупов Р.М. Оценка надежности программного обеспечения. – СПб.:Наука, 1994 г.
- Шикин А. В., Боресков А. В. Компьютерная графика. Динамика, реалистические изображения. – 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.