![]() |
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:
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.
TFeld = (feWasser, feSchiff);
{..........} private Felder : array[1..10] of array[1..10] of TFeld;
Delphi-Quellcode:
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:
if Felder[2,4] = feWasser then
//...
Delphi-Quellcode:
(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ß ;-) ).
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; mfg |
Re: Schiffe versenken
Zitat:
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. |
Re: Schiffe versenken
Zitat:
Okay, dann werde ich es jetzt mal mit den Arrays probieren.. |
Re: Schiffe versenken
Zitat:
Delphi-Quellcode:
(entnommen aus deinem oberen Post) solltest du lieber zwei Zeilen machen:
x_hilf:=X div 25; y_hilf:=Y div 25;
Delphi-Quellcode:
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.
x_hilf:=X div 25;
y_hilf:=Y div 25; mfg |
Re: Schiffe versenken
Wenn, dann so:
Delphi-Quellcode:
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.
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; 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. |
Re: Schiffe versenken
Wenn Delphi bzw. "Object Pascal", noch neu Land für dich sind,verweise ich gerne auf diese Seite:
![]() |
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:
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..
begin
xs := x div 25; ys := y div 25; schiff_laenge := laenge / 25; schiff_hoehe := hoehe / 25; for h:= ..... end; (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? |
Re: Schiffe versenken
Wie währe es so ?:
Delphi-Quellcode:
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.
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; Zu Empfehlen währe noch eine Init Procedure zu erstellen, dann erlebst du keine bösen Überraschungen:
Delphi-Quellcode:
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 ?
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; |
Re: Schiffe versenken
Zitat:
Also entweder
Delphi-Quellcode:
oder
MyGameFeld:array[1..20,1..20] of TMyGameFeld;
Delphi-Quellcode:
mfg
MyGameFeld:array[0..19,0..19] of TMyGameFeld;
|
Re: Schiffe versenken
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz