Delphi-PRAXiS
Seite 3 von 5     123 45      

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

patti 19. Feb 2010 10:23

Re: Schiffe versenken
 
Warum versuchst du nicht das, was mimi in Post #16 vorgeschlagen hat? Speichere die einzelnen Felder einfach in einem 2-dimensionalen Array. Ausschauen könnte das z.B. so:

Delphi-Quellcode:
TFeld = (feWasser, feSchiff);
{..........}
   private
      Felder : array[1..10] of array[1..10] of TFeld;
So kannst du dann ganz einfach auf jedes beliebige Feld zugreifen und äußerst einfach bestimmen, welchen Zustand ein bestimmtes Feld hat. Jeden Pixel eines Images auszulesen ist dagegen sehr umständlich.

Delphi-Quellcode:
if Felder[2,4] = feWasser then
  //...
In deiner Zeichenroutine gehts du dann eben alle Felder mit Hilfe einer verschachtelten Schleife durch und malst jeweils ein Rechteck in der entsprechednen Farbe, etwa so:

Delphi-Quellcode:
var x,y : integer;
var r  : TRect;
const GroesseEinesFeldes = 24;
begin
//--
for x := 1 to 10 do
begin
   for y := 1 to 10 do
   begin
      r.Left := (x-1)*GroesseEinesFeldes;
      r.Top := (y-1)*GroesseEinesFeldes;
      r.Right := x*GroesseEinesFeldes;
      r.Bottom := y*GroesseEinesFeldes;
      //
      case Felder[x,y] of
      fWasser : PaintBox.Canvas.Brush.Color := clBlue;
      fSchiff : PaintBox.Canvas.Brush.Color := clSilver;
      end;
      //
      PaintBox.Canvas.FillRect(r);
   end;
end;
(So ungefähr, hab den Quelltext nur innerhalb des Antwort-Editors der Delphipraxis geschrieben und nicht überprüft, können also noch Fehler drin sein. Aber vielleicht reicht das ja schonmal als Denkanstoß ;-) ).

mfg

KB-Selbst 19. Feb 2010 11:22

Re: Schiffe versenken
 
Zitat:

Zitat von kindliche kaiserin
Das habe ich gerade schon gefunden und verbessert, trotzdem funktioniert es noch nicht..:/

Naja, jetzt postest du die Verbesserungen. Dann können wir weiter sehen.
Und nicht vergessen: Die Formatierung des Sourcecodes sollte dringend angepasst werden.

Im übrigen bin auch ich der Meinung: Das Verwenden eines eigenen Arrays wie hier mehrfach erwähnt bringt erhebliche Vorteile gegenüber deiner jetzigen Version.

kindliche kaiserin 19. Feb 2010 11:27

Re: Schiffe versenken
 
Zitat:

Zitat von KB-Selbst
Und nicht vergessen: Die Formatierung des Sourcecodes sollte dringend angepasst werden.

Was sollte ich denn an der Formatierung deiner Meinung nach ändern?



Okay, dann werde ich es jetzt mal mit den Arrays probieren..

patti 19. Feb 2010 12:26

Re: Schiffe versenken
 
Zitat:

Zitat von kindliche kaiserin
Was sollte ich denn an der Formatierung deiner Meinung nach ändern?

Wichtig ist letzendlich, dass du damit klar kommst und du dich in deinem eigenen SourceCode zurecht findest. Einpaar Dinge haben sich aber sozusagen als "Standard" durchgesetzt. Dazu gehört beispielsweise, dass man pro Zeile nur eine Anweisung hat. Aus dem hier:

Delphi-Quellcode:
x_hilf:=X div 25; y_hilf:=Y div 25;
(entnommen aus deinem oberen Post) solltest du lieber zwei Zeilen machen:

Delphi-Quellcode:
x_hilf:=X div 25;
y_hilf:=Y div 25;
Das wirkt gleich viel übersichtlicher. Außerdem sind deine Einrückungen etwas ungewöhnlich. Du schreibst beispielsweise alle "else" untereinander, obwohl sie in "verschiedenen Ebenen" liegen. Das ist aber wie gesagt Geschmackssache, zumindest wenn man nicht in einem größeren Team an einem Projekt arbeitet.

mfg

KB-Selbst 19. Feb 2010 13:16

Re: Schiffe versenken
 
Wenn, dann so:

Delphi-Quellcode:
const c_Err1 = 'Die Schiffe dürfen sich nicht überlagern bzw. nebeneinander sein.';

      x_hilf:=X div 25; y_hilf:=Y div 25; // Das mit den vielen Befehlen in einer Zeile stört mich jetzt weniger.
      xs:=x_hilf*25; ys:=y_hilf*25;

        if (xs+laenge>250) or (if ys+hoehe>250)
        then
          showmessage('Das Schiff muss sich komplett innerhalb des Feldes befinden.')

        else
        for h:=0 to laenge do
        begin
          if (img_mensch.Canvas.Pixels[xs+h,ys     -12]=clgreen) or
             (img_mensch.Canvas.Pixels[xs+h,ys+hoehe+12]=clgreen)
          then
            showmessage(c_Err1)
          else
            for i:=0 to hoehe do
            begin
              if (img_mensch.Canvas.Pixels[xs      -12,ys+hoehe]=clgreen) or
                 (img_mensch.Canvas.Pixels[xs+laenge+12,ys+hoehe]=clgreen)
              then
                showmessage(c_Err1)
              else
                if (img_mensch.Canvas.Pixels[xs-       12,ys     -12]=clgreen) or
                   (img_mensch.Canvas.Pixels[xs+laenge+12,ys     -12]=clgreen) or
                   (img_mensch.Canvas.Pixels[xs+laenge+12,ys+hoehe+12]=clgreen) or
                   (img_mensch.Canvas.Pixels[xs-       12,ys+hoehe+12]=clgreen)
                then
                  showmessage(c_Err1)
                else
.
.
.
            end;
        end;
Du kannst natürlich so formatieren wie du willst. Wenn du's aber so machst, wie ich oben angegeben, siehst du gleich, welche FOR-Schleife wo endet.

Auch das Nicht-Verwenden von Begin/End hat, ganz besonders in deinem Falle (mehrere Verschachtelungen) einen erheblichen Nachteil: Den ; an der falschen Stelle gesetzt und die For-Schleife ist beendet, wo sie gar nicht beendet werden soll. Dumm nur, dass die Falschpositionierung des Strichpunktes nur sehr schwer zu finden ist.

mimi 19. Feb 2010 13:46

Re: Schiffe versenken
 
Wenn Delphi bzw. "Object Pascal", noch neu Land für dich sind,verweise ich gerne auf diese Seite:
http://www.delphi-treff.de/

kindliche kaiserin 19. Feb 2010 14:50

Re: Schiffe versenken
 
@KB: Ja, also die Formatierung finde ich wirklich wesentlich übersichtlicher. Werde ich mir in Zukunft auch angewöhnen, darauf mehr zu achten.


@Mimi: Ich hatte schonmal zwei Jahre in der Schule zu tun. Jedoch haben wir da sichlerich nicht alle Möglichkeiten ausgeschöpft. Außerdem habe ich seitdem kein einziges Programm mehr mit Delphi geschrieben..deshalb ist es mitlerweile schon wieder fast Neu-Land..:D


Ich hatte mir jetzt folgendes überlegt:

Delphi-Quellcode:
begin
      xs := x div 25; ys := y div 25;
      schiff_laenge := laenge / 25;
      schiff_hoehe := hoehe / 25;

        for h:= .....

    end;
Mittels der For-Schleife wollte ich in die jeweiligen Array-Felder was reinschreiben wie z.B. "belegt". Danach wollte ich die Felder, in denen "belegt" o.a. drin steht einfärben..

(Wie) ist das möglich? Mit dieser Variante dürfte ich dann doch später bei der "Spiel-Prozedur" doch auch ohne Probleme arbeiten können, oder?

mimi 19. Feb 2010 19:14

Re: Schiffe versenken
 
Wie währe es so ?:
Delphi-Quellcode:
type
  TMyGameFeld = record
    belegt:Boolean;
    // Vielleicht sind noch weitere Variablen Sinvoll, wenn nicht währe ein Record übertrieben
  end;
  {
    Die 20 X 20 ist die Größe. Sie wird so Berechnet: SpielFeldBreiteInPixel durch Objekt Größe.
    Ich glaube du verwendest TImage oder ? Dann würde das so aussehen:
    Image1.Widht div 20 mit der Annahme das 20 Pixel dein Objekt breit ist. Das Funktioniert genau so mit der Höhe.
  }
  MyGameFeld:array[0..20,0..20] of TMyGameFeld;

//  In der MouseDown Methode des TImage würdest du jetzt "nur" noch folgendes schreiben:
mx:=x div 20; my:=y div 20;
// mx und my musst du vorher noch Deklarieren.
jetzt kannst du mit mx und my auf MyGameFeld zugreifen:
MyGameFeld[mx,my].belegt:=True;
Du kannst auch mit Klassen Arbeiten. Wie gesagt: Wenn du nur eine Variable brauchst währe der Record übertrieben. Dann musst du es leicht anpassen: Statt "of TMyGameFeld" würde es dann "of Boolean" heißen.

Zu Empfehlen währe noch eine Init Procedure zu erstellen, dann erlebst du keine bösen Überraschungen:
Delphi-Quellcode:
procedure ...Init;
begin
  for y:=0 to 20 do begin
    for x:=0 to 20 do begin
     GameFeld[x,y].Belegt:=False;
    end;
  end;
end;
Das ist jetzt nur eine Art Pseude-Code. Aber so ähnlich würde ich es machen und es müsste sogar Funktionieren. Ich hoffe das hilft dir weiter. Hier sind komplette Fertige Lösungen nicht gerne gesehen. Darum schreibe ich das so. Ich glaube davon hast du mehr oder ?

patti 19. Feb 2010 22:20

Re: Schiffe versenken
 
Zitat:

Zitat von mimi
Delphi-Quellcode:
  {
    Die 20 X 20 ist die Größe. Sie wird so Berechnet: SpielFeldBreiteInPixel durch Objekt Größe.
    Ich glaube du verwendest TImage oder ? Dann würde das so aussehen:
    Image1.Widht div 20 mit der Annahme das 20 Pixel dein Objekt breit ist. Das Funktioniert genau so mit der Höhe.
  }
  MyGameFeld:array[0..20,0..20] of TMyGameFeld;

Achtung! So wie du es geschrieben hast, wäre das Spielfeld 21 und nicht 20 Felder breit bzw. hoch ("0..20" sind nämlich 21 Elemente).

Also entweder

Delphi-Quellcode:
MyGameFeld:array[1..20,1..20] of TMyGameFeld;
oder

Delphi-Quellcode:
MyGameFeld:array[0..19,0..19] of TMyGameFeld;
mfg

mimi 20. Feb 2010 04:38

Re: Schiffe versenken
 
Zitat:

Achtung! So wie du es geschrieben hast, wäre das Spielfeld 21 und nicht 20 Felder breit bzw. hoch ("0..20" sind nämlich 21 Elemente).
Sicher ? Das das auch bei Statischen Array gilt ? Bei Dynamischen, ok, aber bei Statischen ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 Uhr.
Seite 3 von 5     123 45      

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