![]() |
Schiffe versenken
Hallo,
ich habe folgendes Problem. Wie der Thread-Titel schon sagt, möchte ich gerne das Spiel Schiffe versenken programmieren. Nur komme ich jetzt nicht weiter. Ich habe auf meinem Formular zwei Image-Felder...einmal das Spielfeld des Computergegners und einmal eigene Feld. Außerdem noch fünf unterschiedlich große Imagefelder, die die Schiffe darstellen. Wenn man nun auf ein Schiff klickt, werden die Höhe und Breite der Felder in den Speicher geladen. Dann soll man auf das eigene (Image-)Spielfeld klicken, damit dort das Schiff an der jeweiligen Stelle eingesetzt wird. Beim Klick auf das Spielfeld werden auch die Koordinaten des Mausklicks in den Speicher geladen, damit man dann den Startpunkt für das Rechteck hat, welches dann mithilfe der Variablen Höhe und Breite vom Schiff in das Spielfeld gezeichnet wird. Nur funktioniert das nicht alles so, wie ich es mir vorstelle. Wenn ich in die linke obere Ecke des Feldes klicke, welche ja die Koords (0,0) haben müssten, werden aber die Koords (737,437) geladen. Hier der Quellcode:
Delphi-Quellcode:
Die Variablen "laenge" und "hoehe" habe ich global deklariert.
procedure TForm1.img_menschMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var x_hilf, xs, y_hilf, ys: integer; begin if (hoehe=0) and (laenge=0) then showmessage('Bitte wählen Sie ein Schiff aus.') else begin x_hilf:=X div 25; y_hilf:=Y div 25; xs:=x_hilf*25; ys:=y_hilf*25; img_mensch.canvas.pen.color:=clblack; img_mensch.Canvas.Pen.Width:=0; img_mensch.canvas.brush.color:=clgreen; img_mensch.canvas.moveto(xs,ys); img_mensch.Canvas.Rectangle(xs, ys, xs+laenge, ys+hoehe); X:=0; Y:=0; hoehe:=0; laenge:=0; end; end; Kann mir bitte jemand sagen, wo bei mir der Fehler liegt? Danke! |
Re: Schiffe versenken
Benutze doch lieber die Ereignisse OnMouseDown oder OnMouseUp deiner TImage-Komponente. Da bekommst du als Paramater x bzw. y die Koordinaten relativ zu der oberen linken Ecke der Komponente überliefert, mit denen du dann weiterarbeiten kannst.
mfg PS: Willkommen in der DP ;-) Edit: Noch zur Erklärung, warum GetCursorPos in diesem Fall "falsche Werte" liefert: Die Koordinaten sind die Maus-Koordinaten auf den gesamten Bildschirm bezogen. In der Hilfe von Delphi zu GetCursorPos steht: Zitat:
|
Re: Schiffe versenken
Und wenn es unbedingt OnClick sein muss, kann man die Screenkoordinaten mit
![]() |
Re: Schiffe versenken
Nein, muss nicht unbedingt OnClick sein. Kannte nur die Ereignisse 'OnMouseUp/Down' noch nicht.
Die interne Delphi-Hilfe würde ich ja gerne zur Hilfe ziehen, aber die kann bei mir nicht geöffnet werden...warum auch immer..? Ich habe jetzt das Ereignis 'OnMouseDown' genommen. Da wird mir ind ie Prozedur ja automatisch die
Delphi-Quellcode:
rein geschrieben? Wie binde ich die jetzt in meinen Quellcode ein? Denn GetCursorPos kann ich ja nun nicht verwenden, um einen Wert für X und Y zu erhalten..
Variablen Shift: TShiftState; X, Y: Integer);
|
Re: Schiffe versenken
Brauchst Du ja auch nicht, X und Y werden Dir ja "frei Haus" geliefert.
|
Re: Schiffe versenken
In den bei der Funktion übergebenen Paramatern x und y stecken die Werte schon drin. Mit denen kannst du einfach weiterarbeiten. Wenn du beispielsweise folgendes in der OnMouseDown-Routine machst:
Delphi-Quellcode:
dann bekommst du jedesmal eine Nachricht mit den beiden Koordinaten angezeigt. Wenn du in der linken oberen Ecke deiner Komponente klickst, dann bekommst du halt eben für beide Werte 0 angezeigt.
ShowMessage(IntToStr(x) + ' - ' + IntToStr(y));
In der Routine machst du dann das gleiche wie bisher beim Click-Ereignis, nur ohne die Bestimmung der Koordinaten, denn die bekommst du ja überliefert. mfg |
Re: Schiffe versenken
Zitat:
mal so ins blaue geraten : Du benutzt Windows VISTA oder Windows 7 ? Ich nehme an, dann wird dies Dein Problem beheben : ![]() |
Re: Schiffe versenken
Bei neueren Delphi-Versionen hat man aber keine Probleme mehr damit, weil das Hilfeformat geändert wurde. Hängt aber wie gesagt von der Delphi-Version ab. Als Alternative kannst du die
![]() |
Re: Schiffe versenken
Ja, ich nutze Delphi 7 unter Win Vista..^^
Danke, für die beiden Hilfen..:) |
Re: Schiffe versenken
So nun stehe ich vor einem weiteren Problem:
Delphi-Quellcode:
Jetzt wird zwar kontrolliert, ob die Schiffe aneinander angrenzen, aber nur wenn beide Schiffe in einer lage sind, also beide wagerecht oder beide vertikal. Wenn nun aber eins wagerecht und eins vertikal ist und sie sich schneiden, wird dies noch nicht "verhindert", weil ich noch keine Idee habe, wie ich das kontrollieren lassen könnte..Hättet ihr da eventuell einen Lösungsvorschlag für mich?
procedure TForm1.img_menschMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var x_hilf, xs, y_hilf, ys: integer; begin if (hoehe=0) and (laenge=0) then showmessage('Bitte wählen Sie ein Schiff aus.') else begin x_hilf:=X div 25; y_hilf:=Y div 25; xs:=x_hilf*25; ys:=y_hilf*25; if xs+laenge>250 then showmessage('Das Schiff muss sich komplett innerhalb des Feldes befinden.') else if ys+hoehe>250 then showmessage('Das Schiff muss sich komplett innerhalb des Feldes befinden.') else if (img_mensch.Canvas.Pixels[xs-12,ys-12]=clgreen) or (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-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+laenge-12,ys+hoehe+12]=clgreen) or (img_mensch.Canvas.Pixels[xs+12,ys+hoehe+12]=clgreen) or (img_mensch.Canvas.Pixels[xs-12,ys+hoehe+12]=clgreen) or (img_mensch.Canvas.Pixels[xs-12,ys+12]=clgreen) then showmessage('Die Schiffe dürfen sich nicht überlagern bzw. nebeneinander sein.') else . . . . end; end; Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 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