Unit Unit1;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
Type
TPole = Array [1..10, 1..10] Of Byte;
TForm1 = Class(TForm)
Pole1: TImage;
Pole2: TImage;
procedure Pole2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
// процедура отрисовки поля.
Procedure PrintPole(Pole : TImage; P : TPole);
// Бот
Procedure Bot;
End;
Var
Form1: TForm1;
// игровое поле 1 - поле игрока. 2 - пполе врага.
// 1 - выстрел. 2 -корабль 20 - мертвый корабль. 3 - корабль врага.
P1, P2 : TPole;
P1Win, P2Win : Integer; // отслеживаем выигрыш.
Implementation
{$R *.dfm}
// бот
Procedure TForm1.Bot;
Var
x, y : integer;
Begin
Randomize;
// определим координаты выстрела
Repeat
x := Random(10) + 1;
y := Random(10) + 1;
Until (P1[x,y] <> 1) And (P1[x,y] <> 20);
// если бот промахнулся
If (P1[x,y] <> 1) And (P1[x,y] <> 2) Then P1[x,y] := 1;
// если бот попал в корабль
If P1[x,y] = 2 Then Begin
P1[x,y] := 20;
P2Win := P2Win + 1;
End;
// отрисуем наше поле
PrintPole(Pole1, P1);
End;
// процедура отрисовки поля
// Pole - компонент TImage на котором надо рисовать
// P - массив, который надо отрисовать
Procedure TForm1.PrintPole(Pole : TImage; P : TPole);
Var
i, x, y : Integer;
Begin
// заливка цветом "вода".
Pole.Canvas.Brush.Style := bsSolid;
Pole.Canvas.Brush.Color := RGB(200, 200, 200);
Pole.Canvas.Rectangle(0,0,200,200);
// рисуем сетку.
For i := 1 To 10 Do
Begin
Pole.Canvas.MoveTo(i * 20, 0);
Pole.Canvas.LineTo(i * 20, 200);
Pole.Canvas.MoveTo(0, i * 20);
Pole.Canvas.LineTo(200, i * 20);
End;
// пройдемся по массиву и отрисуем поля
For x := 1 To 10 Do
Begin
For y := 1 To 10 Do
Begin
If P[x, y] = 1 Then Begin // рисуем выстрел
Pole.Canvas.Brush.Style := bsSolid;
Pole.Canvas.Brush.Color := RGB(0, 0, 0);
Pole.Canvas.Ellipse((x-1) * 20 + 4, (y-1) * 20 + 4, (x-1) * 20 + 16, (y-1) * 20 + 16);
End;
// если мы пытаемся отрисовать вражеский кораблик, то цикл начинается снова
If IntToStr(P[x, y])[1] = '3' Then Continue;
If IntToStr(P[x, y])[1] = '2' Then Begin // рисуем корабли
Pole.Canvas.Brush.Style := bsSolid;
Pole.Canvas.Brush.Color := RGB(200, 5, 5);
Pole.Canvas.Rectangle((x-1) * 20, (y-1) * 20, (x-1) * 20 + 21, (y-1) * 20 + 21);
End;
If IntToStr(P[x, y])[2] = '0' Then Begin // рисуем мертвые части корабля
Pole.Canvas.Brush.Color := RGB(0, 0, 0);
Pole.Canvas.MoveTo((x-1) * 20 , (y-1) * 20);
Pole.Canvas.LineTo((x-1) * 20 + 20, (y-1) * 20 + 20);
Pole.Canvas.MoveTo((x-1) * 20 + 20 , (y-1) * 20);
Pole.Canvas.LineTo((x-1) * 20, (y-1) * 20 + 20);
End;
End;
End;
// проверим, а может ктото уже выйграл
If P1Win = 20 Then Begin ShowMessage('вы победитель!'); Application.Terminate; End;
If P2Win = 20 Then Begin ShowMessage('пока неудачник'); Application.Terminate; End;
End;
// процедура обработки целчка по вражескому полю
Procedure TForm1.Pole2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var
i : Integer;
Mis : Boolean;
Begin
// определим чему равен x.
For i := 0 To 9 Do
If (x >= 20 * i) And (x <= 20 + i * 20) Then
Begin
x := i + 1;
Break;
End;
// определим чему равен y.
For i := 0 To 9 Do
If (y >= 20 * i) And (y <= 20 + i * 20) Then
Begin
y := i + 1;
Break;
End;
// присвоим значение выстрела указанному элементу массива
// если мы сюда уже стреляли
If (P2[x,y] = 1) Or (P2[x,y] = 20) Then Begin
ShowMessage('тут уже стреляли');
Mis := True;
End;
// если мы промахнулись
If (P2[x,y] <> 1) And (P2[x,y] <> 3) And (P2[x,y] <> 20) Then P2[x,y] := 1;
// если мы попали в корабль врага
If P2[x,y] = 3 Then Begin
P2[x,y] := 20;
P1Win := P1Win + 1;
End;
// Оотрисуем поле врага
PrintPole(Pole2, P2);
// заставим бота ответить нам (если мы не промахнулись).
If Mis = False Then Bot;
End;
// при создании формы
Procedure TForm1.FormCreate(Sender: TObject);
Begin
//заполним массив (сделаем вид игры)
// наше поле
// рисуем пару кораблей
P1[8,8] := 2;
P1[7,1] := 2;
P1[7,10] := 2;
P1[6,10] := 2;
P1[5,5] := 2; P1[5,6] := 2;
P1[8,3] := 2; P1[9,3] := 2;
P1[4,8] := 2; P1[5,8] := 2;
P1[3,3] := 2; P1[4,3] := 2; P1[5,3] := 2;
P1[2,7] := 2; P1[2,8] := 2; P1[2,9] := 2;
P1[1,1] := 2; P1[1,2] := 2; P1[1,3] := 2; P1[1,4] := 2;
// поле врага
// нарисуем пару кораблей
P2[1,1] := 3;
P2[10,1] := 3;
P2[1,8] := 3;
P2[8,5] := 3;
P2[6,6] := 3; P2[6,7] := 3;
P2[9,9] := 3; P2[9,10] := 3;
P2[9,7] := 3; P2[10,7] := 3;
P2[5,2] := 3; P2[6,2] := 3; P2[7,2] := 3;
P2[3,10] := 3; P2[4,10] := 3; P2[5,10] := 3;
P2[3,3] := 3; P2[3,4] := 3; P2[3,5] := 3; P2[3,6] := 3;
// заставим отрисовать поля
PrintPole(Pole1, P1);
PrintPole(Pole2, P2);
End;
End.