Einzelnen Beitrag anzeigen

IceBube

Registriert seit: 9. Jul 2008
178 Beiträge
 
#15

Re: Schiffe versenken, Platzierung

  Alt 27. Mai 2010, 23:51
Hallo!

Mir war langweilig , und dachte ich schreib dir schnell meine Variante dazu..

Delphi-Quellcode:
type
  //Schiff Typ (Size, Senkrecht?)
  TTypus = Record
    Size : Integer;
    Senkrecht : Boolean;
  end;

  //Form
  TForm1 = class(TForm)
    DrawGrid1: TDrawGrid;
    procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure DrawGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  //NewGame
  procedure NewGame();

var
  Form1: TForm1;

  //Schiffm Typen (0=Unbesetz, 1=Besetzt, 2=Treffer)
  Ships : Array[0..25, 0..20] of Integer;
  Typen : Array[0..2] of TTypus;

  //Aktiv - Gesetzt Schiff-typ
  Aktiv : Integer;

  //State - 0 = Setzen, 1=Play..
  State : Integer;

implementation

{$R *.dfm}

procedure NewGame();
var
  X, Y : Integer;
begin
  //----
  //Neues Spiel
  //----
  for Y := 0 to 20 do
    for X := 0 to 25 do
      Ships[X, Y] := 0;

  //
  Form1.DrawGrid1.Repaint;
end;


procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  //----
  //DrawCell - TDrawGrid
  //----
  with Sender as TDrawGrid do
  begin
    //
    case Ships[aCol, aRow] of
      0: Canvas.Brush.Color := clWhite; //Frei
      1: Canvas.Brush.Color := clRed; //Besetzt
      2: Canvas.Brush.Color := clBlue; //Treffer
    end;

    //
    canvas.fillrect(rect);
  end;

end;

procedure TForm1.DrawGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Row, Col : Integer;
  I, iX, iY : Integer;
  Typ : TTypus;
  //------------------
  Collision : Boolean;
begin
  //----
  //Setze ein Schiff
  //----
  DrawGrid1.MouseToCell(X, Y, Col, Row);

  //
  if State = 1 then
  begin
    //Treffer
    if Ships[Col, Row] = 1 then
      Ships[Col, Row] := 2
    else
      ShowMessage('Kein Treffer!');

    //Alle gefunden?
    Collision := True;

    for iY := 0 to 20 do
      for iX := 0 to 25 do
        if Ships[iX,iY] = 1 then Collision := False;

    //
    if Collision then
      //Gewonnen
      ShowMessage('Sie haben gewonnen!');

    Exit;
  end;

  //Typ
  Typ := Typen[Aktiv];

  //Prüfen
  Collision := False;
  if not Typ.Senkrecht then
    for I := -1 to Typ.Size do
    begin
      if Ships[Col+I, Row] = 1 then Collision := True;

      //Auf den Seiten?
      if Ships[Col+I, Row+1] = 1 then Collision := True;
      if Ships[Col+I, Row-1] = 1 then Collision := True
    end
  else
    for I := -1 to Typ.Size do
    begin
      if Ships[Col, Row+I] = 1 then Collision := True;
      //Auf den Seiten?
      if Ships[Col+1, Row+I] = 1 then Collision := True;
      if Ships[Col-1, Row+I] = 1 then Collision := True;
    end;

  //Collision?
  if Collision then
  begin
    ShowMessage('Sie können hier kein Schiff setzen!');
    Exit;
  end;

  //
  if not Typ.Senkrecht then
    for I := 0 to Typ.Size-1 do
      Ships[Col+I, Row] := 1
  else
    for I := 0 to Typ.Size-1 do
      Ships[Col, Row+I] := 1;

  //
  DrawGrid1.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //--------
  //Form Create
  //--------

  //Typen
  //--------------------------
  //5er Schiff Waagrecht
  Typen[0].Size := 5;
  Typen[0].Senkrecht := False;

  //3er Schiff Senkrecht
  Typen[1].Size := 3;
  Typen[1].Senkrecht := True;

  //2er Schiff Senkrecht
  Typen[2].Size := 2;
  Typen[2].Senkrecht := True;
  //--------------------------

  //Aktives Schiff (0-2)
  Aktiv := 2;

  //
  State := 0;
end;
Hoffe das hilft dir

lg

Edit : Spielmode hinzugefügt...
Edit2: Dachte man kann die Schiffe auch nebeinander bauen :S
Jetzt aber nicht mehr
  Mit Zitat antworten Zitat