Курсовая

Курсовая Создание игры Морской бой

Работа добавлена на сайт bukvasha.net: 2015-10-25

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 26.12.2024





Министерство образования и науки Российской Федерации,

Федеральное агентство по образованию.

Государственное образовательное учреждение

высшего профессионального образования.

Пермский Государственный Технический Университет

Чайковский филиал

Кафедра Информационных Технологий
Курсовая  работа
по дисциплине: Программирование и основы алгоритмизации

Тема: «создание игры «Морской бой»»
Выполнил студент гр. БА-03 дн.

Широков В. Е.

Принял преподаватель

Пушкарёв А.В.
г. Чайковский

2004 г.


Содержание


Введение. 4

Delphi 5

Компоненты Delphi используемые в программе. 6

Компонент TMainMenu. 6

Компонент TLabel 7

Компонент TPanel 9

Компонент TImage. 10

РАЗРАБОТКА ПРОГРАММЫ... 11

Постановка задачи. 11

Алгоритм реализации работы.. 12

Алгоритм реализации игровой программы.. 12

Реализация справочной информации. 16

Описание пользовательского интерфейса. 17

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

Литература. 19

Приложение 1 (исходный код) 20

Приложение 2 (руководство пользователя) 51

Приложение 3 (бдлк схема) 55



Введение


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

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

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

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

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

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

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

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


Delphi


Целью моей курсовой работы является программирование с помощью Delphi 5. Прежде чем начать выполнять свое задание рассмотрим эту систему программирования, в общем.

Delphi - это греческий город, где жил дельфийский оракул. И этим именем был назван новый программный продукт с феноменальными характеристиками.

Hадо отметить, что к моменту выхода продукта обстановка вокруг компании Borland складывалась не лучшим для нее образом. Поговаривали о возможной перепродаже компании, курс акций компании неудержимо катился вниз. Сейчас уже можно без всяких сомнений утверждать, что период трудностей позади. Hеверно, конечно, было бы говорить, что только Delphi явился причиной восстановления компании; кроме Delphi, у Borland появились и другие замечательные продукты, так же, как и Delphi, основывающиеся на новых, появившихся недавно у компании Borland,  технологиях. Я имею в виду новые BDE 2.0, BC++ 4.5, Paradox for Windows 5.0, dBase for Windows 5.0, BC++ 2.0 for OS/2.

Тем не менее, именно Delphi стал тем продуктом, на примере которого стало ясно, что у Borland есть еще порох в пороховницах, и что один единственный продукт может настолько удачно сочетать несколько передовых технологий.

Delphi - это комбинация нескольких важнейших технологий:

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

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

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

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

Компилятор, встроенный в Delphi, обеспечивает высокую производительность, необходимую для построения приложений в архитектуре “клиент-сервер”.  Этот компилятор в настоящее время является самым быстрым в мире, его скорость компиляции составляет свыше 120 тысяч строк в минуту на компьютере 486DX33. Он предлагает легкость разработки и быстрое время проверки готового программного блока, характерного для языков четвертого поколения (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, изображение центрируется в пределах рабочей области. В противном случае — располагается в ее верхнем левом углу.

РАЗРАБОТКА ПРОГРАММЫ

Постановка задачи




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

Справочная информация содержит правила игры и автора работы.


Алгоритм реализации работы

Алгоритм реализации игровой программы


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

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

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



Модуль Unit1 является основным модулем проекта, содержащим все необходимые для работы программы процедуры.

После запуска программы на экран выводится основная форма Form1 (рис.2), на которой расположены следующие объекты:

1.     Главное меню

2.     Игровое поле человека



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

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

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

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

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

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

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

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

Процедура 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» то выходит сообщение –
«Вы проиграли.

Попробуйте ещёраз!»
Более подробно смотрите исходный текст программы Приложение 1.


Реализация справочной информации


Справочная информация (правила игры) реализована с помощью программы Microsoft Help WorkShop. Эта программа позволяет создать файл справочной информации для Windows, используя текст формата Rich Edit Text. В процессе работы этой программы создается файл проекта справки *.hpj, который впоследствии может быть откомпилирован в файл справки (*.hlp).

В данной курсовой работе был создан файл проекта справки morb.hpj, который был откомпилирован с помощью программы Microsoft Help WorkShop в файл morb.hlp (рис.3).



Более подробно см. Приложение 2.

Описание пользовательского интерфейса


Игра – Новая игра (горячая клавиша F2) – начать новую игру после окончания.

Игра – Выход – выход из программы.

Помощь – Справка (горячая клавиша F1) – Вызов справки.

Помощь – О программе – Короткая информация о программе.

ЗАКЛЮЧЕНИЕ




В результате выполнения данной курсовой работы был получен игровой программный продукт, названный «Морской бой». Было проведено исследование компонентов программной среды Borland Delphi 6.0, которые использовались при создании игры.

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

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

2.     Невозможность возврата на несколько ходов назад;

3.     Работоспособность приложения только в среде Windows;

4.     Невозможность автоматической расстановки кораблей игрока.

Однако, помимо недостатков, есть и достоинства у этого программного продукта:

1.     Создана интерактивная справка с правилами игры;

2.     Программный продукт малотребователен к системным ресурсам компьютера. Минимальная конфигурация: процессор – не ниже Pentium, оперативная память – не ниже 16 Mb, операционная система – Windows 95 / 98/ Me / NT / 2000 / XP.

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

Литература


1.     Фаронов В.В. Delphi 4. Учебный курс. –М.: Нолидж, 1999. -447с.

2.     Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. –М.:Нолидж, 1997. -616с.

Приложение 1


Исходный текст

unit Unit1;
interface
uses

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

  Dialogs, ExtCtrls, StdCtrls, Menus, XPMan;
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

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     //ротация кораблей по горизонтали
case k11 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;

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
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

x1:=(X div 20)+1;

y1:=(Y div 20)+1;

if k11>=0 then begin    //смотрит поставлены все корабли или нет

if button=mbright then  begin   //производит ротацию корабля по нажатии правой кн мыши

     if rot=true then

       rot:=false

     else

       rot:=true;

       begin

image1.Canvas.Brush.Color:=clwhite;

For i:=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     //ротация кораблей по горизонтали
case k11 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;

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
else            //ротация кораблей по вертикали

begin
case k11 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;
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;

end
else
if rot=false then begin   //ставит корабль по горизонтали
case k11 of     //смотрит какой корабль ставить

 0: case  x1 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: case  x1 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: case x1 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: if x1+3<11 then      //ставит четырехпалубный корабль

      begin

    for i:=0 to k11 do

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

     riad:=true

       end

     else

    riad:=false;
 end;
if  riad=true then begin  //смотрит если корабль поставлен то уменьшает счетчик

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

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

 0: case  x1 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: case x1 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: case x1 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;
if  riad=true then begin                 //смотрит если корабль поставлен то уменьшает счетчик
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;

For i:=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;
if k11<0 then begin           //проверяет поставлены ли все корабли, если "да" то начинает игру с компьютером

   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;

   for i:=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

x1:=(X div 20)+1;

y1:=(Y div 20)+1;
if kon=false then begin       //проверка закончилась игра или нет

  case b2[x1,y1] of

    0: b2[x1,y1]:=3;          //если попал в пустую клетка становится - просреленной пустой

    2: b2[x1,y1]:=4;          //если попал в клетку с кораблем то она становится- подбитой

    3,4: exit;                //если попал в клетку в которую уже стрелял то ничего не происходит

  end;

  for i:=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;

For i:=1 to 10 do       //если находится хотябы один неподбитый корабль то победы нет

  for j:=1 to 10 do

    if b2[i,j]=2 then

      win:=false;

if win=true then        //вывод сообщения при победе

 begin

  showmessage ('Поздравляю!'+#13+'Вы победили.');

  kon:=true;

  exit

 end;
if b2[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;
For i:=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)))

             then begin                                       //не доконца подбитый корабль

               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;

For i:=1 to 10 do              //если находится хотябы один неподбитый корабль то проигрыша нет

  for j:=1 to 10 do

    if b1[i,j]=2 then

      lose:=false;

if lose=true then

 begin

  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.

Приложение 2


Руководство пользователя

Правила
Морской бой –игра известная всем с детства.

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

Условия поражения – потеря всех своих кораблей.
В начале игры перед вами пустое поле(рис. 1)



Рис. 1
для начала игры вы должны расставить свои корабли (расстановка начинается с 4палубного корабля и далее по уменьшению палуб) для этого переведите курсор мыши на поле с пустыми белыми клетками, при этом под курсором появиться желтое изображения корабля (рис. 2)



 Рис. 2
 при нажатии на правую кнопку мыши происходит ротация корабля (рис. 3)



Рис. 3
при нажатии на левую кнопку мыши – происходит расстановка корабля на игровом поле (рис. 4)



Рис. 4
далее расстанавливаются остальные корабли.(корабли не могут пересекаться и соприкасаться)

Когда все корабли расстановлены появляется поле компьютера (рис. 5)



Рис. 5
Теперь вам необходимо стрелять по кораблям противника. Для этого необходимо перейти на поле противника, и в предполагаемом для вас месте нахождения вражеского корабля нажать правую кнопку мыши. При этом если в месте выстрела появляется:

Серый квадрат перечеркнутый красным крестом – значит что Вы попали в корабль но он еще не убит.

Маленький белый квадрат – Вы не попали.

Красный квадрат – Вы убили корабль.
Для того чтобы начать новую игру нажмите клавишу F2 ли на вкладку Игра-Новая игра.

Приложение 3


Блок схема



1. Контрольная работа Биохимические основы органолептики вкус и запах
2. Курсовая Управление государственным долгом 2 Социально-экономическая сущность
3. Реферат Государственное управление основные понятия, система управления, ее признаки, принципы организа
4. Реферат Режим труда и отдыха. Умственная и физическая работоспособность
5. Реферат Бережновско-маёвская срубная культура
6. Статья на тему Какой быть системе образования в Республике Казахстан
7. Реферат на тему Избирательное право и избирательные системы в РФ
8. Шпаргалка Некоторые вопросы основ менеджмента
9. Статья на тему Слово о Законе и Благодати митрополита Киевского Илариона
10. Шпаргалка Шпаргалка по Международному приватному праву