
- •Содержание
- •Введение
- •Техническое задание
- •Аналитический раздел
- •Обзор и анализ существующих программных решений
- •Определение функциональных требований к разрабатываемой программной системе
- •Конструкторский раздел
- •Выбор языка и среды программирования
- •Функциональная схема работы программы
- •Организация данных и проектирование интерфейсов обмена данными в программной системе
- •Анализ существующих методов и алгоритмов Обстрел одного одноклеточного корабля
- •Обстрел одного двухклеточного корабля
- •Выбор графического и пользовательского интерфейса
- •Технологический раздел
- •Определение структуры и состава программной системы
- •Используемые компоненты
- •Разработка алгоритмов отдельных подзадач
- •Руководство пользователя
- •Подготовка программы к работе и условия ее использования
- •Экспериментальный раздел
- •Виды контроля качества разрабатываемого по
- •Методика проведения и результаты тестирования
- •Методы и способы устранения ошибок
- •Отладка выявленных ошибок, обнаруженных при тестировании
- •Заключение
- •Список использованной литературы
- •Приложения Приложение 1 Листинг программы
- •Приложение 2 Графический интерфейс программы
Заключение
В результате выполнения данного курсового проекта был разработан игровой программный продукт «Морской бой». При помощи этой программы можно приятно проводить время и развивать логическое мышление. Программа не занимает много места, не требовательна к установленному программному обеспечению.
Также было проведено исследование полученного программного продукта. В результате были выявлены следующие достоинства и недостатки полученного программного продукта:
Достоинства:
Существует возможность автоматической расстановки кораблей игрока;
Программный продукт малотребователен к системным ресурсам компьютера.
Недостатки:
Низкий искусственный интеллект, т.е. ход компьютера осуществляется случайным образом, что делает маловероятным победу компьютера;
Невозможность возврата на несколько ходов назад;
Работоспособность приложения только в среде Windows.
В целом цель, поставленная в начале курсового проекта, была достигнута. В программе выполняются все необходимые функциональные требования.
Список использованной литературы
1. Фаронов, В.В. Программирование в Delphi 7: учеб. пособие / В.В. Фаронов. -7-е изд., перераб.- М.:Нолидж, 2006.- 412с.
2. Ставровский, А.Б. Delphi в задачах и примерах: учеб. для вузов / А.Б. Ставровский. - Киев: BНV, 2004.-399с.
3. Кнут, Д.Э. Искусство программирования: учеб. пособие: в 3 т.:пер. с англ. Т.1: Основные алгоритмы.- 3-е изд.-М. и др.: Вильямс, 2000.-720 с.
4. Гловацкая, А.П. Методы и алгоритмы вычислительной математики: учеб. пособие для вузов / А.П. Головыцкая.- М.: Радио и связь, 1999.-408с.
5. Бежанова, М.М. Практическое программирование: структуры данных и алгоритмы: учеб. для вузов / М.М. Бежанова, Л.А. Москвина, И.В. Поттосин.- М.: Логос, 2001.-223с.
Приложения Приложение 1 Листинг программы
unit mainprogram;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Menus, XPMan, jpeg;
type
TForm1 = class(TForm)
Panel1: TPanel;
Image1: TImage;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Panel2: TPanel;
Image2: TImage;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label20: TLabel;
Label21: TLabel;
Label22: TLabel;
Label23: TLabel;
button1: TButton;
button2: TButton;
Label1: TLabel;
label13: TLabel;
labelplayer: TLabel;
label25: TLabel;
image3: TImage;
Button3: TButton;
CheckBox1: TCheckBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Button4: TButton;
Button5: TButton;
Label12: TLabel;
Image4: TImage;
Image5: TImage;
procedure FormCreate(Sender: TObject);
procedure button1Click(Sender: TObject);
procedure button2Click(Sender: TObject);
procedure nash(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure shoot(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i,j,x1,y1,palub3,palub2,palubField1, //где palubField1,palub2,palub3 кол-во одно,двух,трех-палубников
m,n,z,k11,k33,k31,k32,ozid:integer; //нужны для рандомной расстановки
bField1,bField2:Array[1..11,1..11] of integer;//квадратные матрицы, поля игроков
rotation,near,endofgame,win,babax,popal,looser:boolean;
implementation
uses Unit2;
{$R *.dfm}
///////////////////////////////////////////////////////////////////////////////
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel2.Visible:=False;
button1.Visible:=False;
CheckBox1.Visible:=False;
RadioButton1.Visible:=False;
RadioButton2.Visible:=false;
Image4.Visible:=False;
Image5.Visible:=false;
ozid:=0;
k11:=3;
k33:=2;
k32:=5;
k31:=9;
palub3:=0;
palub2:=0;
palubField1:=0;
//расстановка кораблей компьютера
//четырехпалубник(один)
randomize;
m:=random(10)+1;//рандомные переменные для определения клетки
n:=random(10)+1;
z:=random(1);//это то как располагается корабль 0-горизонтально остальные-вертикально
case n of
1..7:
case m of
1..7: for i:=0 to 3 do
if z=0 then
bField2[m+i,n]:=2
else
bField2[m,n+i]:=2;
8..10: for i:=0 to 3 do
if z=0 then
bField2[m-i,n]:=2
else
bField2[m,n+i]:=2;
end;
8..10:
case m of
1..7: for i:=0 to 3 do
if z=0 then
bField2[m+i,n]:=2
else
bField2[m,n-i]:=2;
8..10: for i:=0 to 3 do
if z=0 then
bField2[m-i,n]:=2
else
bField2[m,n-i]:=2;
end;
end;
//трехпалубник(2штуки)
while palub3<2 do
begin
m:=random(10)+1;//по х
n:=random(6)+1; //по у
z:=random(1);
case n of
1..7:
case m of
1..7: case z of
0: if (bField2[m,n]<>2) and //Проверяем возможность установки корабля. Т.е незанятую клетку
(bField2[m-1,n-1]<>2) and
(bField2[m-1,n]<>2) and
(bField2[m-1,n+1]<>2) and
(bField2[m,n-1]<>2)and
(bField2[m+1,n+1]<>2)and
(bField2[m+1,n]<>2) and
(bField2[m+1,n-1]<>2) and
(bField2[m,n+1]<>2) and
(bField2[m+1,n+2]<>2) and //По правилу игры расстояние между кораблями должно быть как минимум 1 клетка. Проверяем и это
(bField2[m-1,n+2]<>2) and
(bField2[m,n+2]<>2) and
(bField2[m+1,n+3]<>2) and
(bField2[m-1,n+3]<>2) and
(bField2[m,n+3]<>2) then
begin //Если все вышенаписанные условия верны, то устанавливаем корабль
for i:=0 to 2 do
bField2[m,n+i]:=2;
palub3:=palub3+1
end;
1: if (bField2[m,n]<>2) and
(bField2[m+1,n+1]<>2) and
(bField2[m,n+1]<>2) and
(bField2[m-1,n+1]<>2) and
(bField2[m-1,n]<>2)and
(bField2[m-1,n-1]<>2)and
(bField2[m,n-1]<>2) and
(bField2[m+1,n-1]<>2) and
(bField2[m+1,n]<>2) and
(bField2[m+2,n-1]<>2) and
(bField2[m+2,n+1]<>2) and
(bField2[m+2,n]<>2) and
(bField2[m+3,n-1]<>2) and
(bField2[m+3,n+1]<>2) and
(bField2[m+3,n]<>2) and
(bField2[m+3,n]<>2) then
begin
for i:=0 to 2 do
bField2[m+i,n]:=2;
palub3:=palub3+1
end
end;
8..10: case z of
0: if (bField2[m,n]<>2) and
(bField2[m+1,n+1]<>2) and
(bField2[m,n+1]<>2) and
(bField2[m-1,n+1]<>2) and
(bField2[m-1,n]<>2)and
(bField2[m-1,n-1]<>2)and
(bField2[m,n-1]<>2) and
(bField2[m+1,n-1]<>2) and
(bField2[m-2,n-1]<>2) and
(bField2[m-2,n+1]<>2) and
(bField2[m-2,n]<>2) and
(bField2[m-3,n-1]<>2) and
(bField2[m-3,n+1]<>2) and
(bField2[m-3,n]<>2) then
begin
for i:=0 to 2 do
bField2[m-i,n]:=2;
palub3:=palub3+1
end;
1: if (bField2[m,n]<>2) and
(bField2[m-1,n-1]<>2) and
(bField2[m-1,n]<>2) and
(bField2[m-1,n+1]<>2) and
(bField2[m,n-1]<>2)and
(bField2[m+1,n+1]<>2)and
(bField2[m+1,n]<>2) and
(bField2[m+1,n-1]<>2) and
(bField2[m,n+1]<>2) and
(bField2[m+1,n+2]<>2) and
(bField2[m-1,n+2]<>2) and
(bField2[m,n+2]<>2) and
(bField2[m+1,n+3]<>2) and
(bField2[m-1,n+3]<>2) and
(bField2[m,n+3]<>2) and
(bField2[m,n+3]<>2) then
begin
for i:=0 to 2 do
bField2[m,n+i]:=2;
palub3:=palub3+1
end;
end
end;
end
end;
//двухпалубники(3штуки)
while palub2<3 do begin
m:=random(7)+1;
n:=random(10)+1;
z:=random(1);
//Алгоритм тот же что и с трехпалубниками
case n of
1..8:
case m of
1..8: case z of
0: if (bField2[m,n]<>2) and
(bField2[m-1,n-1]<>2) and
(bField2[m-1,n]<>2) and
(bField2[m-1,n+1]<>2) and
(bField2[m,n-1]<>2)and
(bField2[m+1,n+1]<>2)and
(bField2[m+1,n]<>2) and
(bField2[m+1,n-1]<>2) and
(bField2[m,n+1]<>2) and
(bField2[m+1,n+2]<>2) and
(bField2[m-1,n+2]<>2) and
(bField2[m,n+2]<>2) then
begin
for i:=0 to 1 do
bField2[m,n+i]:=2;
palub2:=palub2+1
end;
1: if (bField2[m,n]<>2) and
(bField2[m+1,n+1]<>2) and
(bField2[m,n+1]<>2) and
(bField2[m-1,n+1]<>2) and
(bField2[m-1,n]<>2)and
(bField2[m-1,n-1]<>2)and
(bField2[m,n-1]<>2) and
(bField2[m+1,n-1]<>2) and
(bField2[m+1,n]<>2) and
(bField2[m+2,n-1]<>2) and
(bField2[m+2,n+1]<>2) and
(bField2[m+2,n]<>2) then
begin
for i:=0 to 1 do
bField2[m+i,n]:=2;
palub2:=palub2+1
end
end;
9..10: case z of
0: if (bField2[m,n]<>2) and
(bField2[m+1,n+1]<>2) and
(bField2[m,n+1]<>2) and
(bField2[m-1,n+1]<>2) and
(bField2[m-1,n]<>2)and
(bField2[m-1,n-1]<>2)and
(bField2[m,n-1]<>2) and
(bField2[m+1,n-1]<>2) and
(bField2[m-2,n-1]<>2) and
(bField2[m-2,n+1]<>2) and
(bField2[m-2,n]<>2) then
begin
for i:=0 to 1 do
bField2[m-i,n]:=2;
palub2:=palub2+1
end;
1: if (bField2[m,n]<>2) and
(bField2[m-1,n-1]<>2) and
(bField2[m-1,n]<>2) and
(bField2[m-1,n+1]<>2) and
(bField2[m,n-1]<>2)and
(bField2[m+1,n+1]<>2)and
(bField2[m+1,n]<>2) and
(bField2[m+1,n-1]<>2) and
(bField2[m,n+1]<>2) and
(bField2[m+1,n+2]<>2) and
(bField2[m-1,n+2]<>2) and
(bField2[m,n+2]<>2) then
begin
for i:=0 to 1 do
bField2[m,n+i]:=2;
palub2:=palub2+1
end;
end
end;
end
end;
//Однопалубники(4шт)
while palubField1<4 do begin
m:=random(10)+1;
n:=random(10)+1;
if (bField2[m,n]<>2) and
(bField2[m+1,n+1]<>2) and
(bField2[m,n+1]<>2) and
(bField2[m-1,n+1]<>2) and
(bField2[m-1,n]<>2)and
(bField2[m-1,n-1]<>2)and
(bField2[m,n-1]<>2) and
(bField2[m+1,n-1]<>2) and
(bField2[m+1,n]<>2) then
begin
bField2[m,n]:=2;
palubField1:=palubField1+1;
end
end;
///////////////////////
Image1.Canvas.Pen.Width:=2;
For i:=1 to 10 do //рисуем квадрутную сетку поля игрока
for j:=1 to 10 do
begin
bField1[i,j]:=0;
image1.Canvas.Rectangle(30*i-30,30*j-30,30*i,30*j);
end;
end;
/////////////////
procedure TForm1.nash(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); //процедура постановки корабля
begin
if ozid=1 then begin
x1:=(X div 30)+1;
y1:=(Y div 30)+1;
if k11>=0 then
begin //смотрит поставлены все корабли или нет
if RadioButton1.Checked=True then
begin //производит ротацию корабля по нажатии правой кн мыши
rotation:=False;
end;
if RadioButton2.Checked=True then
begin
rotation:=true;
end;
if rotation=false then begin //ставит корабль по горизонтали
case k11 of //смотрит какой корабль ставить
0: case x1 of //смотрит есть ли рядом с однопалубным кораблём другие корабли
1: if (bField1[x1,y1]<>2) and
(bField1[x1+1,y1+1]<>2) and
(bField1[x1,y1+1]<>2) and
(bField1[x1,y1-1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+1,y1]<>2) then
begin
bField1[x1,y1]:=2;
near:=true
end
else
near:=false;
2..10: if (bField1[x1,y1]<>2) and
(bField1[x1+1,y1+1]<>2) and
(bField1[x1,y1+1]<>2) and
(bField1[x1-1,y1+1]<>2) and
(bField1[x1-1,y1]<>2)and
(bField1[x1-1,y1-1]<>2)and
(bField1[x1,y1-1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+1,y1]<>2) then
begin
bField1[x1,y1]:=2;
near:=true
end
else
near:=false;
end;
1: case x1 of //смотрит есть ли рядом с двупалубным кораблём другие корабли
1:if(bField1[x1,y1]<>2) and
(bField1[x1+1,y1+1]<>2) and
(bField1[x1,y1+1]<>2) and
(bField1[x1,y1-1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+2,y1-1]<>2) and
(bField1[x1+2,y1+1]<>2) and
(bField1[x1+2,y1]<>2) and (x1+1<11)
then
for i:=0 to k11 do
begin
bField1[x1+i,y1]:=2;
near:=true
end
else
near:=false;
2..10: if (bField1[x1,y1]<>2) and
(bField1[x1+1,y1+1]<>2) and
(bField1[x1,y1+1]<>2) and
(bField1[x1-1,y1+1]<>2) and
(bField1[x1-1,y1]<>2)and
(bField1[x1-1,y1-1]<>2)and
(bField1[x1,y1-1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+2,y1-1]<>2) and
(bField1[x1+2,y1+1]<>2) and
(bField1[x1+2,y1]<>2) and (x1+1<11) then
for i:=0 to k11 do
begin
bField1[x1+i,y1]:=2;
near:=true
end
else
near:=false;
end;
2: case x1 of //смотрит есть ли рядом с трехпалубным кораблём другие корабли
1: if (bField1[x1,y1]<>2) and
(bField1[x1+1,y1+1]<>2) and
(bField1[x1,y1+1]<>2) and
(bField1[x1,y1-1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+2,y1-1]<>2) and
(bField1[x1+2,y1+1]<>2) and
(bField1[x1+3,y1-1]<>2) and
(bField1[x1+3,y1+1]<>2) and
(bField1[x1+3,y1]<>2) and (x1+2<11) then
for i:=0 to k11 do
begin
bField1[x1+i,y1]:=2;
near:=true
end
else
near:=false;
2..10:
if (bField1[x1,y1]<>2) and
(bField1[x1+1,y1+1]<>2) and
(bField1[x1,y1+1]<>2) and
(bField1[x1-1,y1+1]<>2) and
(bField1[x1-1,y1]<>2)and
(bField1[x1-1,y1-1]<>2)and
(bField1[x1,y1-1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+2,y1-1]<>2) and
(bField1[x1+2,y1+1]<>2) and
(bField1[x1+3,y1-1]<>2) and
(bField1[x1+3,y1+1]<>2) and
(bField1[x1+3,y1]<>2) and (x1+2<11) then
for i:=0 to k11 do
begin
bField1[x1+i,y1]:=2;
near:=true
end
else
near:=false
end;
3: if x1+3<11 then //ставит четырехпалубный корабль
begin
for i:=0 to k11 do
bField1[x1+i,y1]:=2;
near:=true
end
else
near:=false;
end;
if near=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 (bField1[x1,y1]<>2) and
(bField1[x1+1,y1+1]<>2) and
(bField1[x1,y1+1]<>2) and
(bField1[x1,y1-1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+1,y1]<>2) then
begin
bField1[x1,y1]:=2;
near:=true
end
else
near:=false;
2..10: if
(bField1[x1,y1]<>2) and
(bField1[x1+1,y1+1]<>2) and
(bField1[x1,y1+1]<>2) and
(bField1[x1-1,y1+1]<>2) and
(bField1[x1-1,y1]<>2)and
(bField1[x1-1,y1-1]<>2)and
(bField1[x1,y1-1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+1,y1]<>2) then
begin
bField1[x1,y1]:=2;
near:=true
end
else
near:=false;
end;
1: case x1 of //смотрит есть ли рядом с двупалубным кораблём другие корабли
1: if (bField1[x1,y1]<>2) and
(bField1[x1,y1-1]<>2)and
(bField1[x1+1,y1+1]<>2)and
(bField1[x1+1,y1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+1,y1+2]<>2) and
(bField1[x1,y1+2]<>2) and (y1+1<11) then
for i:=0 to k11 do
begin
bField1[x1,y1+i]:=2;
near:=true
end
else
near:=false;
2..10:
if (bField1[x1,y1]<>2) and
(bField1[x1-1,y1-1]<>2) and
(bField1[x1-1,y1]<>2) and
(bField1[x1-1,y1+1]<>2) and
(bField1[x1,y1-1]<>2)and
(bField1[x1+1,y1+1]<>2)and
(bField1[x1+1,y1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+1,y1+2]<>2) and
(bField1[x1-1,y1+2]<>2) and
(bField1[x1,y1+2]<>2) and (y1+1<11) then
for i:=0 to k11 do
begin
bField1[x1,y1+i]:=2;
near:=true
end
else
near:=false
end;
2: case x1 of //смотрит есть ли рядом с двупалубным кораблём другие корабли
1: if (bField1[x1,y1]<>2) and
(bField1[x1,y1-1]<>2)and
(bField1[x1+1,y1+1]<>2)and
(bField1[x1+1,y1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+1,y1+2]<>2) and
(bField1[x1+1,y1+3]<>2) and
(bField1[x1,y1+3]<>2) and (y1+2<11) then
for i:=0 to k11 do
begin
bField1[x1,y1+i]:=2;
near:=true
end
else
near:=false;
2..10:
if (bField1[x1,y1]<>2) and
(bField1[x1-1,y1-1]<>2) and
(bField1[x1-1,y1]<>2) and
(bField1[x1-1,y1+1]<>2) and
(bField1[x1,y1-1]<>2)and
(bField1[x1+1,y1+1]<>2)and
(bField1[x1+1,y1]<>2) and
(bField1[x1+1,y1-1]<>2) and
(bField1[x1+1,y1+2]<>2) and
(bField1[x1-1,y1+2]<>2) and
(bField1[x1+1,y1+3]<>2) and
(bField1[x1-1,y1+3]<>2) and
(bField1[x1,y1+3]<>2) and (y1+2<11) then
for i:=0 to k11 do
begin
bField1[x1,y1+i]:=2;
near:=true
end
else
near:=false
end; //ставит 4палубный корабль
3: if y1+3<11 then
begin
for i:=0 to k11 do
bField1[x1,y1+i]:=2;
near:=true
end
else
near:=false
end;
if near=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 bField1[i,j]=2 then
begin
image1.Canvas.Brush.Color:=claqua;
image1.Canvas.Rectangle(30*i-30,30*j-30,30*i,30*j);
end;
end;
if k11<0 then
begin
Button5.Visible:=False;
Button4.Visible:=false;
button1.Visible:=True;
CheckBox1.Visible:=True;
panel2.Visible:=True;
RadioButton1.Visible:=false;
RadioButton2.Visible:=false;
for i:=1 to 10 do //рисует белую сетку поля компьютера
for j:=1 to 10 do
begin
image2.Canvas.Brush.Color:=clwhite;
Image2.Canvas.Pen.Width:=2;
image2.Canvas.Rectangle(30*i-30,30*j-30,30*i,30*j); end
end
end;
end
else
Exit;
end;
//процедура выстрела
procedure TForm1.shoot(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
x1:=(X div 30)+1;
y1:=(Y div 30)+1;
if endofgame=false then //проверка закончилась игра или нет
begin
case bField2[x1,y1] of
0: bField2[x1,y1]:=3; //если попал в пустую клетку то она становится - простреленной
2: bField2[x1,y1]:=4; //если попал в клетку с кораблем то она становится- подбитой
3,4,10: exit; //если попал в клетку в которую уже стрелял то ничего не происходит
end;
for i:=1 to 10 do //обновляем графическое поле компьютера, в соответсвии с игрой.
for j:=1 to 10 do
begin
case bField2[i,j] of
4: begin //клетка в котрой стоит убитый или подбитый корабль
if ((bField2[i+1,j]=2) //подбитый корабль
or(bField2[i,j+1]=2) //проверяем для всех видов кораблей кроме однопалубного, есть ли рядом
or(bField2[i-1,j]=2) //целые клетки корабля, нужно для корректной отрисовки поля боя
or(bField2[i,j-1]=2))
or (((bField2[i+1,j]=4)and(bField2[i+2,j]=2))
or((bField2[i,j+1]=4)and(bField2[i,j+2]=2))
or((bField2[i-1,j]=4)and(bField2[i-2,j]=2))
or((bField2[i,j-1]=4)and(bField2[i,j-2]=2)))
or(((bField2[i+1,j]=4)and(bField2[i+2,j]=4) and (bField2[i+3,j]=2))
or((bField2[i,j+1]=4)and(bField2[i,j+2]=4)and(bField2[i,j+3]=2))
or((bField2[i-1,j]=4)and(bField2[i-2,j]=4)and(bField2[i-3,j]=2))
or((bField2[i,j-1]=4)and(bField2[i,j-2]=4)and(bField2[i,j-3]=2)))
then //если корабль подбит, то рисуем на клетке в которую попали крест
begin
image2.Canvas.Brush.Color:=clAqua;
image2.Canvas.Rectangle(30*i-30,30*j-30,30*i,30*j);
image2.Canvas.pen.Color:=clred;
image2.Canvas.MoveTo(30*i-29,30*j-29);
image2.Canvas.LineTo(30*i-1,30*j-1);
image2.Canvas.MoveTo(30*i-1,30*j-29);
image2.Canvas.LineTo(30*i-29,30*j-1);
image2.Canvas.pen.Color:=clblack;
end
else //иначе закрашивам корабль красным(убит)
begin
image2.Canvas.Brush.Color:=clred;
image2.Canvas.Rectangle(30*i-30,30*j-30,30*i,30*j);
bField2[i,j]:=10;
end;
end;
3: begin //простреленная пустая клетка
image2.Canvas.Brush.Color:=clwhite;
image2.Canvas.Ellipse(30*i-20,30*j-20,30*i-10,30*j-10)
end;
end;
end;
if CheckBox1.Checked=True then
begin
For i:=1 to 10 do
for j:=1 to 10 do
begin
if bField2[i,j]=10 then
begin
if bField2[i+1,j]<>10 then bField2[i+1,j]:=3;
if bField2[i-1,j]<>10 then bField2[i-1,j]:=3;
if bField2[i,j+1]<>10 then bField2[i,j+1]:=3;
if bField2[i,j-1]<>10 then bField2[i,j-1]:=3;
if bField2[i+1,j+1]<>10 then bField2[i+1,j+1]:=3;
if bField2[i+1,j-1]<>10 then bField2[i+1,j-1]:=3;
if bField2[i-1,j+1]<>10 then bField2[i-1,j+1]:=3;
if bField2[i-1,j-1]<>10 then bField2[i-1,j-1]:=3;
end;
end;
for i:=1 to 10 do
for j:=1 to 10 do
begin
if bField2[i,j]=3 then begin
image2.Canvas.Brush.Color:=clwhite;
image2.Canvas.Ellipse(30*i-20,30*j-20,30*i-10,30*j-10)
end;
end;
end;
win:=true;
For i:=1 to 10 do //если находится хотябы один неподбитый корабль то победы нет
for j:=1 to 10 do
if bField2[i,j]=2 then
win:=false;
if win=true then //вывод сообщения при победе
begin
showmessage ('Победа!');
endofgame:=true;
exit
end;
if bField2[x1,y1]=4 then //если игрок попал то компьютер не ходит
exit;
//выстрел компьютера
babax:=false;
popal:=true;
while (babax=false) or (popal=true) do //стрел-ть до тех пор пока не попал в клетку в которую не стрылял и если она пустая
begin
m:=random(10)+1;
n:=random(10)+1;
case bField1[m,n] of
0: begin
bField1[m,n]:=3;//попал в пустую клетку
babax:=true;
popal:=false
end;
2: begin
bField1[m,n]:=4; //в клетку с кораблем
babax:=true;
popal:=true
end
end;
For i:=1 to 10 do //рисуется графическое поле игрока
for j:=1 to 10 do
begin
case bField1[i,j] of
3: begin //простреленая пустая клетка
image1.Canvas.Brush.Color:=clwhite;
image1.Canvas.Ellipse(30*i-20,30*j-20,30*i-10,30*j-10)
end;
4:begin //клетка в котрой стоит подбитый или не доконца подбитый корабль
if ((bField1[i+1,j]=2) //подбитый корабль
or(bField1[i,j+1]=2) //проверяем для всех видов кораблей кроме однопалубного, есть ли рядом
or(bField1[i-1,j]=2) //целые клетки корабля, нужно для корректной отрисовки поля боя
or(bField1[i,j-1]=2))
or (((bField1[i+1,j]=4)and(bField1[i+2,j]=2))
or((bField1[i,j+1]=4)and(bField1[i,j+2]=2))
or((bField1[i-1,j]=4)and(bField1[i-2,j]=2))
or((bField1[i,j-1]=4)and(bField1[i,j-2]=2)))
or(((bField1[i+1,j]=4)and(bField1[i+2,j]=4) and (bField1[i+3,j]=2))
or((bField1[i,j+1]=4)and(bField1[i,j+2]=4)and(bField1[i,j+3]=2))
or((bField1[i-1,j]=4)and(bField1[i-2,j]=4)and(bField1[i-3,j]=2))
or((bField1[i,j-1]=4)and(bField1[i,j-2]=4)and(bField1[i,j-3]=2)))
then //если корабль подбит, то рисуем на клетке в которую попали крест
begin
image1.Canvas.Brush.Color:=clAqua;
image1.Canvas.Rectangle(30*i-30,30*j-30,30*i,30*j);
image1.Canvas.pen.Color:=clred;
image1.Canvas.MoveTo(30*i-29,30*j-29);
image1.Canvas.LineTo(30*i-1,30*j-1);
image1.Canvas.MoveTo(30*i-1,30*j-29);
image1.Canvas.LineTo(30*i-29,30*j-1);
image1.Canvas.pen.Color:=clblack;
end
else //иначе закрашивам корабль красным(убит)
begin
image1.Canvas.Brush.Color:=clred;
image1.Canvas.Rectangle(30*i-30,30*j-30,30*i,30*j);
bField1[i,j]:=10;
end;
end;
end;
end;
For i:=1 to 10 do
for j:=1 to 10 do
begin
if bField1[i,j]=10 then
begin
if bField1[i+1,j]<>10 then bField1[i+1,j]:=3;
if bField1[i-1,j]<>10 then bField1[i-1,j]:=3;
if bField1[i,j+1]<>10 then bField1[i,j+1]:=3;
if bField1[i,j-1]<>10 then bField1[i,j-1]:=3;
if bField1[i+1,j+1]<>10 then bField1[i+1,j+1]:=3;
if bField1[i+1,j-1]<>10 then bField1[i+1,j-1]:=3;
if bField1[i-1,j+1]<>10 then bField1[i-1,j+1]:=3;
if bField1[i-1,j-1]<>10 then bField1[i-1,j-1]:=3;
end;
end;
looser:=true;
For i:=1 to 10 do //если находится хотябы один неподбитый корабль то проигрыша нет
for j:=1 to 10 do
if bField1[i,j]=2 then
looser:=false;
if looser=true then
begin
endofgame:=true;
showmessage ('Поражение');
exit
end;
end;
end;
end;
procedure TForm1.button1Click(Sender: TObject); //новая игра
begin
image1.Canvas.Brush.Color:=clwhite;
rotation:=false;
k11:=3;
k33:=2;
k32:=5;
k31:=9;
endofgame:=False;
For i:=1 to 10 do //обнуляет массивы
for j:=1 to 10 do
begin
bField1[i,j]:=0;
bField2[i,j]:=0;
end;
Button5.Visible:=true;
Button4.Visible:=true;
label12.visible:=True;
FormCreate(self); //использует процедуру создания формы
end;
procedure TForm1.button2Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
form2.show;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
ozid:=1;
RadioButton1.Visible:=True;
RadioButton2.Visible:=True;
Button4.Visible:=False;
Button5.Visible:=false;
Label12.Visible:=False;
Image4.Visible:=true;
Image5.Visible:=True;
end;
end.