Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Schiffe versenken, Platzierung (https://www.delphipraxis.net/151288-schiffe-versenken-platzierung.html)

shmia 27. Mai 2010 18:59

Re: Schiffe versenken, Platzierung
 
Zitat:

Zitat von m2zer0
..bin noch ein Anfänger was Delphi angeht

Ein "Char" ist ein einzelnes Zeichen und natürlich darf man damit ebenso wie mit "Boolean" ein- oder mehrdimensionale Arrays aufbauen.
Grundlagentutorial

m2zer0 27. Mai 2010 19:20

Re: Schiffe versenken, Platzierung
 
Mhh..
Char zu benutzen wäre auf jedenfall intelligenter, da hast du recht.
Nur hab ich noch nie damit gearbeitet, deswegen weiß ich zB. nicht wie ich meinen Quelltext daran anpassen kann.

Nehmen wir mal

Delphi-Quellcode:
 begin
      with sender as TDrawgrid do
        begin
          if arr2[acol,arow]
            then canvas.brush.color := clred
            else canvas.brush.color := clwhite;
           canvas.fillrect(rect);
        end;
    end;
Diese Abfrage setzt ja Boolean voraus, wie sieht sie unter Verwendung von Char aus?

:)

fui-tak 27. Mai 2010 19:55

Re: Schiffe versenken, Platzierung
 
Das müsste dann so gehen:
Delphi-Quellcode:
begin
      with sender as TDrawgrid do
        begin
          if not(arr2[acol,arow] = '*') //wenn hier kein * ist, dann wird ... clRed ausgeführt
            then canvas.brush.color := clred
            else canvas.brush.color := clwhite;
           canvas.fillrect(rect);
        end;
end;

m2zer0 27. Mai 2010 21:24

Re: Schiffe versenken, Platzierung
 
Hat geklappt danke :)
Hab jetzt fast alles umgeschrieben damit array of char akzeptiert wird, nur der Teil mit dem TRect macht mir noch Probleme.

Delphi-Quellcode:
DrawGrid1.MouseToCell(X, Y,Col, Row); //Mausposition auslesen

r.Left :=Col-1;
r.Top :=Row-1;

  if Horizontal=0 then
   begin
    r.Right:=col+z;
    r.Bottom:=Row+1;
   end
  else
   begin
    r.Right:=col+1;
    R.Bottom:=row+z;
   end;


  if r.Left = -1
    then r.Left := 0;
  if r.Top = -1
    then r.Top := 0;
  if r.Right =10 then
    r.Right := r.Right -1;
  if r.Bottom = 10 then
    r.Bottom := r.Bottom -1;

  gueltig:=true;

  for iX := r.Left to r.Right do                       //Hier müsste
    for iY := r.Top to r.Bottom do                     //noch etwas geändert
      if (arr2[iX,iY]='k') then gueltig := false;      //werden, nur was?
Es ist das Feld um das Schiff, damit man die Schiffe nicht direkt aneinander oder ineinander Platzieren kann.
Die Platzierung wird in eine If-Abfrage gesetzt (if gueltig then), nur im Moment bin ich ein klein wenig verwirrt. :^)

IceBube 27. Mai 2010 22:51

Re: Schiffe versenken, Platzierung
 
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 :)

m2zer0 28. Mai 2010 13:12

Re: Schiffe versenken, Platzierung
 
Vielen, vielen Dank :)
Es gibt nicht mehr viele Leute die so hilfsbereit sind wie du :)
Aber ich hab das Gefühl das nahezu alle hier in der DP unglaublich nett sind :)

Ich werd mir das alles morgen genauer anschauen, da ich heute im Stress bin.

Mit freundlichen Grüßen m2zer0 :)

fui-tak 28. Mai 2010 22:19

Re: Schiffe versenken, Platzierung
 
Zitat:

Zitat von m2zer0
Delphi-Quellcode:
...

  gueltig:=true;

  for iX := r.Left to r.Right do                       //Hier müsste
    for iY := r.Top to r.Bottom do                     //noch etwas geändert
      if (arr2[iX,iY]='k') then gueltig := false;      //werden, nur was?
Es ist das Feld um das Schiff, damit man die Schiffe nicht direkt aneinander oder ineinander Platzieren kann.
Die Platzierung wird in eine If-Abfrage gesetzt (if gueltig then), nur im Moment bin ich ein klein wenig verwirrt. :^)



Ich weiß nicht ob ich dich richtig verstehe, aber ich glaube du hättest gerne sowas:
Delphi-Quellcode:
...
  gueltig:=true;

  for iX := r.Left to r.Right do                      
    for iY := r.Top to r.Bottom do                    
      if not(arr2[iX,iY]='*') then gueltig := false; //wenn auf dem Feld ein Schiff irgendeiner Art ist (in deinem Beispiel gingen nur k-Schiffe), wird gueltig auf false gesetzt

IceBube 28. Mai 2010 22:35

Re: Schiffe versenken, Platzierung
 
Zitat:

Zitat von fui-tak
Delphi-Quellcode:
(...)
 ... //wenn auf dem Feld ein Schiff irgendeiner Art ist (in deinem Beispiel gingen nur k-Schiffe), wird gueltig auf false gesetzt

Hmm, wieso? Das ist ja bei "Schiffe versenken" egal, oder nicht?

Bei meinem Code erkennt man nicht ob ein ganzes Schiff versenkt worden ist

Tipp:
Verwende statt "Integer" einen eigenen Typ!

z.B.:
Delphi-Quellcode:
type
 TShip = Record
    Typ    : TTypus;
    Treffer : array[0..10] of Boolean; //Wahr = Treffer, max. 11 
 end;

 //..
 Ships : Array[-1..20, -1..25] of TShip;
 

 //Prüfen ob ganzes Schiff versenkt!
 var
   iX, iY, I : Integer;
 
 for iY := 0 to 20 do
   for iX := 0 to 25 do
   begin
     Collision := True;    
     
     for I := Low(Ships[iX, iY].Treffer) to High(Ships[iX, iY].Treffer) do    
       if not Ships[iX, iY].Treffer[I] then Collision := False;


     //Versenkt?
     if Collision then
      ShowMessage('Schiff Position (X, Y): ' + inttostr(iX)+', ' + inttostr(iY) +^J+ 'Wurde versenkt!');
   end;
lg

m2zer0 28. Mai 2010 22:54

Re: Schiffe versenken, Platzierung
 
Da ich auch gerne Anzeigen lassen würde welches Schiff versenkt würde, benutze ich lieber, wie mir einige posts zuvor gesagt wurde:
Array of Char;

Das hat recht viele Vorteile, nur mein Problem ist, dass ich nicht weiß wie ich die Schleife, die dafür sorgte, dass Schiffe nicht an/ineinander liegen, passend für Array of Char umschreibe.

Edit: Ok, das Problem hat sich grad von allein gelöst^^ ich hätte nur einmal nachdenken sollen. Vielleicht ist es schon ein wenig zu spät.. :^)

m2zer0 29. Mai 2010 00:20

Re: Schiffe versenken, Platzierung
 
So :)
Nun brauche ich einen Computergegner. Er muss keine Taktik haben, es reicht wenn seine Schiffe zufällig platziert werden und seine Schüsse auch zufällig sind. Die Platzierung sollte jedoch unter den gleichen Richtlinien wie die des Spielers ablaufen.

Die Frage ist nur wie? :)

Naja, es ist spät und ich brauche Schlaf. Bis morgen dann ;)

m2zer0.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz