AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Schiffe versenken, Platzierung

Schiffe versenken, Platzierung

Ein Thema von m2zer0 · begonnen am 11. Mai 2010 · letzter Beitrag vom 8. Jun 2010
Antwort Antwort
Seite 2 von 4     12 34   
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#11

Re: Schiffe versenken, Platzierung

  Alt 27. Mai 2010, 19:59
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
Andreas
  Mit Zitat antworten Zitat
m2zer0

Registriert seit: 6. Mai 2010
19 Beiträge
 
#12

Re: Schiffe versenken, Platzierung

  Alt 27. Mai 2010, 20:20
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?

  Mit Zitat antworten Zitat
fui-tak

Registriert seit: 24. Okt 2008
117 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Schiffe versenken, Platzierung

  Alt 27. Mai 2010, 20:55
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;
  Mit Zitat antworten Zitat
m2zer0

Registriert seit: 6. Mai 2010
19 Beiträge
 
#14

Re: Schiffe versenken, Platzierung

  Alt 27. Mai 2010, 22:24
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. :^)
  Mit Zitat antworten Zitat
IceBube

Registriert seit: 9. Jul 2008
177 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
m2zer0

Registriert seit: 6. Mai 2010
19 Beiträge
 
#16

Re: Schiffe versenken, Platzierung

  Alt 28. Mai 2010, 14:12
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
  Mit Zitat antworten Zitat
fui-tak

Registriert seit: 24. Okt 2008
117 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Schiffe versenken, Platzierung

  Alt 28. Mai 2010, 23:19
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
  Mit Zitat antworten Zitat
IceBube

Registriert seit: 9. Jul 2008
177 Beiträge
 
#18

Re: Schiffe versenken, Platzierung

  Alt 28. Mai 2010, 23:35
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
  Mit Zitat antworten Zitat
m2zer0

Registriert seit: 6. Mai 2010
19 Beiträge
 
#19

Re: Schiffe versenken, Platzierung

  Alt 28. Mai 2010, 23:54
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.. :^)
  Mit Zitat antworten Zitat
m2zer0

Registriert seit: 6. Mai 2010
19 Beiträge
 
#20

Re: Schiffe versenken, Platzierung

  Alt 29. Mai 2010, 01:20
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 Uhr.
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