Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Если начать новую игру не завершив предыдущую, то массивы и переменные должны корректно инициализироваться.Содержание книги
Поиск на нашем сайте
… 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; просмотров: 484; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.38 (0.008 с.) |