AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schiffe versenken

Ein Thema von kindliche kaiserin · begonnen am 17. Feb 2010 · letzter Beitrag vom 28. Feb 2010
Antwort Antwort
Seite 3 von 5     123 45      
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#21

Re: Schiffe versenken

  Alt 19. Feb 2010, 11:23
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
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
KB-Selbst

Registriert seit: 3. Okt 2005
Ort: Haßfurt
4 Beiträge
 
Delphi 7 Professional
 
#22

Re: Schiffe versenken

  Alt 19. Feb 2010, 12:22
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.
  Mit Zitat antworten Zitat
kindliche kaiserin

Registriert seit: 17. Feb 2010
16 Beiträge
 
#23

Re: Schiffe versenken

  Alt 19. Feb 2010, 12:27
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..
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#24

Re: Schiffe versenken

  Alt 19. Feb 2010, 13:26
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:

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
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
KB-Selbst

Registriert seit: 3. Okt 2005
Ort: Haßfurt
4 Beiträge
 
Delphi 7 Professional
 
#25

Re: Schiffe versenken

  Alt 19. Feb 2010, 14:16
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.
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#26

Re: Schiffe versenken

  Alt 19. Feb 2010, 14:46
Wenn Delphi bzw. "Object Pascal", noch neu Land für dich sind,verweise ich gerne auf diese Seite:
http://www.delphi-treff.de/
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
kindliche kaiserin

Registriert seit: 17. Feb 2010
16 Beiträge
 
#27

Re: Schiffe versenken

  Alt 19. Feb 2010, 15:50
@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..


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?
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#28

Re: Schiffe versenken

  Alt 19. Feb 2010, 20:14
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 ?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#29

Re: Schiffe versenken

  Alt 19. Feb 2010, 23:20
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

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

MyGameFeld:array[0..19,0..19] of TMyGameFeld; mfg
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#30

Re: Schiffe versenken

  Alt 20. Feb 2010, 05:38
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 ?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


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 20:00 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