ТОП 10:

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



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;

 

Заключение

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

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

Достоинства:

· Существует возможность автоматической расстановки кораблей игрока;

· Программный продукт малотребователен к системным ресурсам компьютера.

Недостатки:

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

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

· Работоспособность приложения только в среде 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.

 

Приложение 2

Графический интерфейс программы

Рис. 1. Главное окно программы

Рис. 2. Окно начала игры

Рис. 3. Процесс игры

Рис. 4. Сообщение о победе

Рис. 4. Сообщение о поражении

Рис. 5. Окно «О программе»

 







Последнее изменение этой страницы: 2016-04-19; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.215.33.158 (0.096 с.)