Torpedó

 

Írjunk Delphiben torpedó játékot. A torpedó egy kétszemélyes játék. Az egyik játékos legyen a Gép. A játék egyik közismert szabálya szerint egy négyzet alakú játéktéren különböző méretű és alakú „hajókat” rejtünk el, melyet az ellenfélnek el kell süllyeszteni. A lövés koordináták megadásával történik. Egy lehetséges flotta:

        1-es hajó: 5 darab;

        2-es hajó: 5 darab;

        3-as hajó (vonalas elrendezésben): 3 darab;

        3-as hajó (L alakban): 3 darab;

        4-es hajó (T alakban): 2 darab;

        4-es hajó (vonalas elrendezésben): 2 darab.

 

A hajók elhelyezésének csak egyetlen fontos szabálya van: a hajók sem lapjaik mentén, sem csúcsokban nem érintkezhetnek. Az elhelyezést a gép véletlen-szám generátorára bízzuk. Ha a játéktér nem túlzottan nagy a hajók által elfoglalt területhez képest (itt ez a helyzet), akkor egy egyszerű véletlen választás biztosan hibás elrendezést eredményez. Ezért a helyes hadrend kialakítását az ütközésmentesítő algoritmusra bízzuk. A hajókat egy-egy sztringrácsban jelenítjük meg (a gépét természetesen nem), és az egyszerűség kedvéért a hajó mezőit a típusszámuk kiírásával jelöljük. A hajók nemcsak a képernyőn fekete négyzetekkel megjelenítet helyzetben, hanem tetszőlegesen elforgatva is elhelyezkedhetnek a játéktéren.

 

A játékot a Játékos kezdi és a Géppel felváltva lőnek a másik játékterére. Az győz, aki hamarabb süllyeszti el az ellenfél hajóit. A játék végén a gép kiírja, hogy ki a győztes. A játék elején a Játékos új flottaelrendezést kérhet, ha a megjelenített számára nem szimpatikus. (Kézi elrendezésre nincs lehetőség, és a flotta összetétele sem változtatható). A Játékos számára rendelkezésre áll egy Help funkció, mely a Gép játéktérének azon mezőit, melyre még lőhet a Játékos, sárga háttérrel jeleníti meg. A helyes játékmenet ellenőrzése végett a Játékos mezői automatikusan színessé válnak ott, ahova a Gép már lőtt és ahova már nem kell a Gépnek lőnie.

 

Annak érdekében, hogy a játék ne legyen unalmas, programozzunk be a Gép számára némi stratégiát (de természetesen nem azt, hogy direktben keresse meg a Játékos hajóit.) A játék közben bármikor új játékot indíthatunk, vagy kiléphetünk a programból.

 

A program a játék kezdete előtt:

 

 

            A játék közben:

 

 

A játék végén:

 

 

 

A program listája:

 

UNIT UTorpedo;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

Const HMax=20;
      TM=16;
type
  THely=Record
    X,Y: Integer;
  End;

  THajo=Record
    Tip: Word;
    Mezo: Array[1..4] Of THely;
  End;

  TFlotta=Record
    Hajok: Array[1..HMax] Of THajo;
    FUtSz: Word;
  End;

  TfmTorpedo = class(TForm)
    lbTorpedo: TLabel;
    lbGepJatekos: TLabel;
    btKilepes: TButton;
    sgGepTer: TStringGrid;
    sgJatTer: TStringGrid;
    sgFlotta: TStringGrid;
    btUjFlotta: TButton;
    lbFlotta: TLabel;
    ldGHajok: TListBox;
    ldJHajok: TListBox;
    btHelp: TButton;
    btUjJatek: TButton;
    Procedure HajoKesz(Var F: TFlotta; N: Word);
    Function Utkoz(Var F: TFlotta): Word;
    Procedure Forgat(Var F: TFlotta; N: Word);
    Procedure Rendez(Var F: TFlotta);
    Procedure Kepre(F: TFlotta; SG: TStringGrid);
    Procedure FlottaList(LD: TListBox);
    Procedure GepLoves;
    procedure btKilepesClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btUjFlottaClick(Sender: TObject);
    procedure sgGepTerDblClick(Sender: TObject);
    procedure sgFlottaDrawCell(Sender: TObject; Col, Row: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure btHelpClick(Sender: TObject);
    procedure sgGepTerDrawCell(Sender: TObject; Col, Row: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure btUjJatekClick(Sender: TObject);
    procedure sgJatTerDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmTorpedo: TfmTorpedo;
  Gep, Jat, Puf: TFlotta;
  GJTer, JJTer, HT, GL: Array[1..TM,1..TM] Of Word;
  Xk, Yk: Integer;
  HBe, PCol, PRow: Word;
  Vege, Kozel: Boolean;

implementation

{$R *.dfm}

procedure TfmTorpedo.btKilepesClick(Sender: TObject);
begin
  Close;
end;

procedure TfmTorpedo.sgFlottaDrawCell(Sender: TObject; Col,
  Row: Integer; Rect: TRect; State: TGridDrawState);
begin
  With sgFlotta.Canvas Do
  Begin
    With Brush Do
    If (Col>1) And (Col<7) And (sgFlotta.Cells[Col,Row]<>'') Then
    Color:= clBlack Else Color:= clWindow;
    TextRect(Rect,Rect.Left+1,Rect.Top+1, sgFlotta.Cells[Col,Row]);
  End;
end;

procedure TfmTorpedo.sgGepTerDrawCell(Sender: TObject; Col, Row: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  With sgGepTer.Canvas Do
  Begin
    With Brush Do
    If HT[Col,Row]=1 Then Color:= clYellow Else Color:= clWindow;
    TextRect(Rect,Rect.Left+1,Rect.Top+1, sgGepTer.Cells[Col,Row]);
  End;
end;

procedure TfmTorpedo.sgJatTerDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  With sgJatTer.Canvas Do
  Begin
    With Brush Do
    If GL[ACol,ARow]=7 Then Color:= clAqua Else Color:= clWindow;
    TextRect(Rect,Rect.Left+1,Rect.Top+1, sgJatTer.Cells[ACol,ARow]);
  End;
end;

Procedure TfmTorpedo.HajoKesz(Var F: TFlotta; N: Word);
Var I: Word;
Begin
  With F.Hajok[N] Do
  Begin
    Case N Of
        1..5: Tip:= 1;
       6..10: Tip:= 2;
      11..13: Tip:= 3;
      14..16: Tip:= 4;
      17..18: Tip:= 5;
      19..20: Tip:= 6;
    End;
    For I:= 1 To 4 Do Begin Mezo[I].X:= 0; Mezo[I].Y:= 0 End;
    Mezo[1].X:= Random(TM)+1; Mezo[1].Y:= Random(TM)+1;
    Case Tip Of
      2: Begin
           If Mezo[1].X=TM Then Mezo[1].X:= TM-1;
           Mezo[2].X:=Mezo[1].X+1; Mezo[2].Y:= Mezo[1].Y;
         End;
      3: Begin
           If Mezo[1].X>TM-2 Then Mezo[1].X:= TM-2;
           Mezo[2].X:=Mezo[1].X+1; Mezo[2].Y:= Mezo[1].Y;
           Mezo[3].X:=Mezo[1].X+2; Mezo[3].Y:= Mezo[1].Y;
         End;
      4: Begin
           If Mezo[1].X>TM-2 Then Mezo[1].X:= TM-2;
           If Mezo[1].Y>TM-2 Then Mezo[1].Y:= TM-2;
           Case Random(4) Of
             0: Begin
                  Mezo[2].X:= Mezo[1].X; Mezo[2].Y:= Mezo[1].Y+1;
                  Mezo[3].X:= Mezo[2].X+1; Mezo[3].Y:= Mezo[1].Y+1;
                End;
             1: Begin;
                  Mezo[2].X:= Mezo[1].X+1; Mezo[2].Y:= Mezo[1].Y;
                  Mezo[3].X:= Mezo[1].X; Mezo[3].Y:= Mezo[1].Y+1;
                End;
             2: Begin;
                  Mezo[2].X:= Mezo[1].X+1; Mezo[2].Y:= Mezo[1].Y;
                  Mezo[3].X:= Mezo[1].X+1; Mezo[3].Y:= Mezo[1].Y+1;
                End;
             3: Begin;
                  Mezo[1].X:= Mezo[1].X+1;
                  Mezo[2].X:= Mezo[1].X; Mezo[2].Y:= Mezo[1].Y+1;
                  Mezo[3].X:= Mezo[1].X-1; Mezo[3].Y:= Mezo[1].Y+1;
                End;
           End;
         End;
      5: Begin
           If Mezo[1].X>TM-2 Then Mezo[1].X:= TM-2;
           If Mezo[1].Y>TM-2 Then Mezo[1].Y:= TM-2;
           Case Random(4) Of
             0: Begin
                  Mezo[2].X:= Mezo[1].X; Mezo[2].Y:= Mezo[1].Y+1;
                  Mezo[3].X:= Mezo[1].X+1; Mezo[3].Y:= Mezo[1].Y+1;
                  Mezo[4].X:= Mezo[1].X; Mezo[4].Y:= Mezo[1].Y+2;
                End;
             1: Begin
                  Mezo[2].X:= Mezo[1].X+1; Mezo[2].Y:= Mezo[1].Y;
                  Mezo[3].X:= Mezo[1].X+2; Mezo[3].Y:= Mezo[1].Y;
                  Mezo[4].X:= Mezo[1].X+1; Mezo[4].Y:= Mezo[1].Y+1;
                End;
             2: Begin
                  Mezo[1].X:= Mezo[1].X+1;
                  Mezo[2].X:= Mezo[1].X-1; Mezo[2].Y:= Mezo[1].Y+1;
                  Mezo[3].X:= Mezo[1].X; Mezo[3].Y:= Mezo[1].Y+1;
                  Mezo[4].X:= Mezo[1].X+1; Mezo[4].Y:= Mezo[1].Y+1;
                End;
             3: Begin
                  Mezo[1].X:= Mezo[1].X+1;
                  Mezo[2].X:= Mezo[1].X-1; Mezo[2].Y:= Mezo[1].Y+1;
                  Mezo[3].X:= Mezo[1].X; Mezo[3].Y:= Mezo[1].Y+1;
                  Mezo[4].X:= Mezo[1].X; Mezo[4].Y:= Mezo[1].Y+2;
                End;
           End;
         End;
      6: Begin
           If Mezo[1].X>TM-3 Then Mezo[1].X:= TM-3;
           Mezo[2].X:=Mezo[1].X+1; Mezo[2].Y:= Mezo[1].Y;
           Mezo[3].X:=Mezo[1].X+2; Mezo[3].Y:= Mezo[1].Y;
           Mezo[4].X:=Mezo[1].X+3; Mezo[4].Y:= Mezo[1].Y;
         End;
    End;
    If Tip=1 Then Exit;
    If Random(2)=0 Then Forgat(F,N);
  End;
End;

Function TfmTorpedo.Utkoz(Var F: TFlotta): Word;
Var I, J, K, N, Ut: Word;
Begin
  F.FUtSz:= 0;
  For N:= 1 To HMax Do With F.Hajok[N] Do
  Begin
    Ut:= 0;
    For I:= 1 To 4 Do If (Mezo[I].X>0) Then
    For J:= 1 To HMax Do If J<>N Then
    For K:= 1 To 4 Do
    Begin
      If (Mezo[I].X=F.Hajok[J].Mezo[K].X) And
         (Mezo[I].Y=F.Hajok[J].Mezo[K].Y) Then Inc(Ut);
      If (Mezo[I].X+1=F.Hajok[J].Mezo[K].X) And
         (Mezo[I].Y=F.Hajok[J].Mezo[K].Y) Then Inc(Ut);
      If (Mezo[I].X=F.Hajok[J].Mezo[K].X) And
         (Mezo[I].Y+1=F.Hajok[J].Mezo[K].Y) Then Inc(Ut);
      If (Mezo[I].X+1=F.Hajok[J].Mezo[K].X) And
         (Mezo[I].Y+1=F.Hajok[J].Mezo[K].Y) Then Inc(Ut);
      If (Mezo[I].X-1>0) And (Mezo[I].X-1=F.Hajok[J].Mezo[K].X) And
         (Mezo[I].Y=F.Hajok[J].Mezo[K].Y) Then Inc(Ut);
      If (Mezo[I].X=F.Hajok[J].Mezo[K].X) And
         (Mezo[I].Y-1>0) And (Mezo[I].Y-1=F.Hajok[J].Mezo[K].Y) Then Inc(Ut);
      If (Mezo[I].X-1>0) And (Mezo[I].X-1=F.Hajok[J].Mezo[K].X) And
         (Mezo[I].Y-1>0) And (Mezo[I].Y-1=F.Hajok[J].Mezo[K].Y) Then Inc(Ut);
      If (Mezo[I].X+1=F.Hajok[J].Mezo[K].X) And
         (Mezo[I].Y-1>0) And (Mezo[I].Y-1=F.Hajok[J].Mezo[K].Y) Then Inc(Ut);
      If (Mezo[I].X-1>0) And (Mezo[I].X-1=F.Hajok[J].Mezo[K].X) And
         (Mezo[I].Y+1=F.Hajok[J].Mezo[K].Y) Then Inc(Ut);
    End;
    Inc(F.FUtSz,Ut);
  End;
  Utkoz:= F.FUtSz;
End;

Procedure TfmTorpedo.Forgat(Var F: TFlotta; N: Word);
Var I, P: Word;
Begin
  With F.Hajok[N] Do For I:= 1 To 4 Do
  Begin P:= Mezo[I].X; Mezo[I].X:= Mezo[I].Y; Mezo[I].Y:= P End;
End;

Procedure TfmTorpedo.Rendez(Var F: TFlotta);
Var USz, PUSz: Word;
Begin
  USz:= Utkoz(F);
  While USz>0 Do
  Begin
    Puf:= F; HajoKesz(F,Random(HMax)+1); PUSz:= Utkoz(F);
    If PUSz>USz Then F:= Puf Else Begin USz:= PUSz End;
  End;
End;

Procedure TfmTorpedo.Kepre(F: TFlotta; SG: TStringGrid);
Var I, J: Word;
Begin
  With SG Do
  Begin
    For I:= 1 To ColCount-1 Do For J:= 1 To RowCount-1 Do Cells[I,J]:= '';
    For
 I:= 1 To HMax Do With F.Hajok[I] Do For J:= 1 To 4 Do
    Cells[Mezo[J].X,Mezo[J].Y]:= IntToStr(Tip);
  End;
End;

Procedure TfmTorpedo.FlottaList(LD: TListBox);
Var I: Word;
Begin
  With LD Do
  Begin
    Clear;
    For I:= 1 To 5 Do Items.Add('1');
    For I:= 1 To 5 Do Items.Add('2');
    For I:= 1 To 3 Do Items.Add('3');
    For I:= 1 To 3 Do Items.Add('4');
    For I:= 1 To 2 Do Items.Add('5');
    For I:= 1 To 2 Do Items.Add('6');
  End;
End;

procedure TfmTorpedo.FormCreate(Sender: TObject);
Var I, J: Word;
begin
  Randomize;
  With sgGepTer Do
  Begin
    ColWidths[0]:= 0;
    RowHeights[0]:= 0;
    ColWidths[ColCount-1]:= 0;
    RowHeights[RowCount-1]:= 0;
    Col:= ColCount-1;
    Row:= RowCount-1;
    For I:= 1 To ColCount-1 Do For J:= 1 To RowCount-1 Do Cells[I,J]:= '';
  End;
  With sgJatTer Do
  Begin
    ColWidths[0]:= 0;
    RowHeights[0]:= 0;
    ColWidths[ColCount-1]:= 0;
    RowHeights[RowCount-1]:= 0;
    Col:= ColCount-1;
    Row:= RowCount-1;
  End;
  With sgFlotta Do
  Begin
    ColWidths[0]:= 0;
    ColWidths[7]:= 24;
    RowHeights[0]:= 0;
    ColWidths[ColCount-1]:= 0;
    RowHeights[RowCount-1]:= 0;
    Col:= ColCount-1;
    Row:= RowCount-1;
    Cells[1,2]:= '1:';
    Cells[1,4]:= '2:';
    Cells[1,6]:= '3:';
    Cells[1,8]:= '4:';
    Cells[1,11]:= '5:';
    Cells[1,14]:= '6:';
    Cells[2,2]:= '.';
    Cells[2,4]:= '.';
    Cells[3,4]:= '.';
    For I:= 2 To 4 Do Cells[I,6]:= '.';
    Cells[2,8]:= '.';
    Cells[2,9]:= '.';
    Cells[3,9]:= '.';
    Cells[3,11]:= '.';
    For I:= 2 To 4 Do Cells[I,12]:= '.';
    For I:= 2 To 5 Do Cells[I,14]:= '.';
    Cells[7,2]:= '5db';
    Cells[7,4]:= '5db';
    Cells[7,6]:= '3db';
    Cells[7,8]:= '3db';
    Cells[7,11]:= '2db';
    Cells[7,14]:= '2db';
  End;
  For I:= 1 To HMax Do HajoKesz(Gep,I); Rendez(Gep); //Kepre(Gep,sgGepTer);
  For I:= 1 To TM Do For J:= 1 To TM Do GJTer[I,J]:= 0;
  For I:= 1 To HMax Do With Gep.Hajok[I] Do
  For J:= 1 To 4 Do If Mezo[J].X>0 Then GJTer[Mezo[J].X,Mezo[J].Y]:= Tip;
  FlottaList(ldGHajok);
  btUjFlottaClick(Sender);
  Vege:= False;
  HBe:= 1;
end;

procedure TfmTorpedo.btUjFlottaClick(Sender: TObject);
Var I, J: Word;
begin
  With sgJatTer Do
  For I:= 1 To ColCount-1 Do For J:= 1 To RowCount-1 Do Cells[I,J]:= '';
  For I:= 1 To HMax Do HajoKesz(Jat,I); Rendez(Jat); Kepre(Jat,sgJatTer);
  For I:= 1 To TM Do For J:= 1 To TM Do Begin JJTer[I,J]:= 0; GL[I,J]:= 0 End;
  For I:= 1 To HMax Do With Jat.Hajok[I] Do
  For J:= 1 To 4 Do If Mezo[J].X>0 Then JJTer[Mezo[J].X,Mezo[J].Y]:= Tip;
  FlottaList(ldJHajok);
end;

procedure TfmTorpedo.sgGepTerDblClick(Sender: TObject);
Var I, J, AH: Word;
    Sullyedt: Boolean;
begin
  If Vege Then Exit;
  btUjFlotta.Enabled:= False;
  With sgGepTer Do
  Begin
    If Cells[Col,Row]<>'' Then Exit;
    If GJTer[Col,Row]>0 Then
    Begin
      Cells[Col,Row]:= 'O';
      AH:= 0;
      For I:= 1 To HMax Do With Gep.Hajok[I] Do
      For J:= 1 To 4 Do If (Mezo[J].X=Col) And (Mezo[J].Y=Row) Then AH:= I;
      Sullyedt:= True;
      With Gep.Hajok[AH] Do
      Begin
        For I:= 1 To 4 Do If Mezo[I].X>0 Then
        If Cells[Mezo[I].X,Mezo[I].Y]='' Then Sullyedt:= False;
        If Sullyedt Then
        Begin
          For I:= 1 To 4 Do Cells[Mezo[I].X,Mezo[I].Y]:= 'X';
          With ldGHajok do Items.Delete(Items.IndexOf(IntToStr(Tip)));
        End;
      End;
    End
    Else Cells[Col,Row]:= '.';
    If ldGHajok.Items.Count=0 Then
    With Canvas Do
    Begin
      With Font Do
      Begin
        Size:= 40;
        Name:= 'Times New Roman';
        Color:= clRed;
      End;
      Xk:= ClientWidth Div 2;
      Yk:= ClientHeight Div 2;
      TextOut(Xk-140,Yk,' You Win ');
      Vege:= True;
    End
    Else
    GepLoves;
  End;
end;

Procedure TfmTorpedo.GepLoves;
Var I, J, AH, Ism: Word;
    Sullyedt: Boolean;
Begin
  With sgJatTer Do
  Begin
    If Not Kozel Then
    Begin
      Col:= Random(TM)+1; Row:= Random(TM)+1;
      While GL[Col,Row]=7 Do Begin Col:= Random(TM)+1; Row:= Random(TM)+1 End;
    End
    Else
    Begin
      Col:= PCol+Random(3)-1; Row:= PRow+Random(3)-1; Ism:= 0;
      While ((GL[Col,Row]=7) Or
             (Col<1) Or
             (Col>TM) Or
             (Row<1) Or
             (Row>TM)) And
             (Ism<100) Do
      Begin
        Inc(Ism);
        Case Random(3) Of
          0: Begin Col:= PCol+Random(3)-1; Row:= PRow+Random(3)-1 End;
          1: Begin Col:= PCol; Row:= PRow+Random(3)-1 End;
          2: Begin Col:= PCol+Random(3)-1; Row:= PRow End;
        End;
      End;
      If Ism=100 Then
      Begin
        Col:= PCol+Random(5)-2; Row:= PRow+Random(5)-2; Ism:= 0;
        While ((GL[Col,Row]=7) Or
             (Col<1) Or
             (Col>TM) Or
             (Row<1) Or
             (Row>TM)) And
             (Ism<100) Do
        Begin
          Inc(Ism);
          Case Random(3) Of
            0: Begin Col:= PCol+Random(5)-2; Row:= PRow+Random(5)-2 End;
            1: Begin Col:= PCol; Row:= PRow+Random(5)-2 End;
            2: Begin Col:= PCol+Random(5)-2; Row:= PRow End;
          End;
        End;
      End;
      If Ism=100 Then Kozel:= False;
    End;
    If Col*Row<>0 Then GL[Col,Row]:= 7;
    If JJTer[Col,Row]>0 Then
    Begin
      Cells[Col,Row]:= 'O';
      AH:= 0;
      For I:= 1 To HMax Do With Jat.Hajok[I] Do
      For J:= 1 To 4 Do If (Mezo[J].X=Col) And (Mezo[J].Y=Row) Then AH:= I;
      Sullyedt:= True; Kozel:= False;
      With Jat.Hajok[AH] Do
      Begin
        For I:= 1 To 4 Do If Mezo[I].X>0 Then
        If GL[Mezo[I].X,Mezo[I].Y]=0 Then
        Begin
          Sullyedt:= False;
          PCol:= Col; PRow:= Row;
          Kozel:= True;
        End;
        If Sullyedt Then
        Begin
          For I:= 1 To 4 Do
          Begin
            Cells[Mezo[I].X,Mezo[I].Y]:= 'X';
            If (Mezo[I].X>1) And (Mezo[I].Y>1) Then
            GL[Mezo[I].X-1,Mezo[I].Y-1]:= 7;
            If Mezo[I].X>1 Then
            GL[Mezo[I].X-1,Mezo[I].Y]:= 7;
            If (Mezo[I].X>1) And (Mezo[I].Y<TM) Then
            GL[Mezo[I].X-1,Mezo[I].Y+1]:= 7;
            If Mezo[I].Y>1 Then
            GL[Mezo[I].X,Mezo[I].Y-1]:= 7;
            GL[Mezo[I].X,Mezo[I].Y]:= 7;
            If Mezo[I].Y+1<TM+1 Then
            GL[Mezo[I].X,Mezo[I].Y+1]:= 7;
            If (Mezo[I].X<TM) And (Mezo[I].Y>1) Then
            GL[Mezo[I].X+1,Mezo[I].Y-1]:= 7;
            If Mezo[I].X<TM Then
            GL[Mezo[I].X+1,Mezo[I].Y]:= 7;
            If (Mezo[I].X<TM) And (Mezo[I].Y<TM) Then
            GL[Mezo[I].X+1,Mezo[I].Y+1]:= 7;
          End;
          With ldJHajok do Items.Delete(Items.IndexOf(IntToStr(Tip)));
        End;
      End;
    End
    Else Cells[Col,Row]:= '.';
    sgJatTer.Repaint;
    If ldJHajok.Items.Count=0 Then
    With Canvas Do
    Begin
      With Font Do
      Begin
        Size:= 40;
        Name:= 'Times New Roman';
        Color:= clRed;
      End;
      Xk:= ClientWidth Div 2;
      Yk:= ClientHeight Div 2;
      TextOut(Xk-140,Yk,' I Win ');
      Vege:= True;
    End;
    Col:= ColCount-1; Row:= RowCount-1;
  End;
End;

procedure TfmTorpedo.btHelpClick(Sender: TObject);
Var I, J: Word;
begin
  With sgGepTer Do If HBe=1 Then
  For I:= 1 To TM Do For J:= 1 To TM Do
  Begin
    If Cells[I,J]='' Then HT[I,J]:= 1 Else HT[I,J]:= 0;
    If (Cells[I,J]='') And
       ((Cells[I-1,J-1]='X') Or (Cells[I-1,J]='X') Or
        (Cells[I-1,J+1]='X') Or (Cells[I,J-1]='X') Or
        (Cells[I,J+1]='X') Or (Cells[I+1,J-1]='X') Or
        (Cells[I+1,J]='X') Or (Cells[I+1,J+1]='X')) Then HT[I,J]:= 0;
  End
  Else
  For I:= 1 To TM Do For J:= 1 To TM Do HT[I,J]:= 0;
  sgGepTer.Repaint;
  With btHelp Do
  Begin
    If HBe=0 Then Caption:= 'Help Be' Else Caption:= 'Help Ki';
    HBe:= 1-HBe;
  End;
end;

procedure TfmTorpedo.btUjJatekClick(Sender: TObject);
Var I, J: Word;
begin
  HBe:= 0; btHelp.Caption:= 'Help Be';
  For I:= 1 To TM Do For J:= 1 To TM Do HT[I,J]:= 0;
  FormCreate(Sender);
end;

end.