Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

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)

kindliche kaiserin 17. Feb 2010 10:18


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:
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;
Die Variablen "laenge" und "hoehe" habe ich global deklariert.


Kann mir bitte jemand sagen, wo bei mir der Fehler liegt?


Danke!

patti 17. Feb 2010 10:21

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:

Mit GetCursorPos können Sie die aktuellen Bildschirmkoordinaten des Mauscorsours ermittteln.

DeddyH 17. Feb 2010 10:29

Re: Schiffe versenken
 
Und wenn es unbedingt OnClick sein muss, kann man die Screenkoordinaten mit Delphi-Referenz durchsuchenScreenToClient umrechnen lassen.

kindliche kaiserin 17. Feb 2010 10:37

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:
Variablen Shift: TShiftState; X, Y: Integer);
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..

DeddyH 17. Feb 2010 10:43

Re: Schiffe versenken
 
Brauchst Du ja auch nicht, X und Y werden Dir ja "frei Haus" geliefert.

patti 17. Feb 2010 10:45

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:
ShowMessage(IntToStr(x) + ' -  ' + IntToStr(y));
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.

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

markus5766h 17. Feb 2010 15:27

Re: Schiffe versenken
 
Zitat:

Zitat von kindliche kaiserin
Die interne Delphi-Hilfe würde ich ja gerne zur Hilfe ziehen, aber die kann bei mir nicht geöffnet werden...warum auch immer..?

Hallo,

mal so ins blaue geraten : Du benutzt Windows VISTA oder Windows 7 ?

Ich nehme an, dann wird dies Dein Problem beheben :
WinHlp32.exe für Windows VISTA (und auch Win7)

patti 17. Feb 2010 16:12

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 Delphi-Reference benutzen, da solltest du zu sowas einige Dinge finden.

kindliche kaiserin 17. Feb 2010 19:51

Re: Schiffe versenken
 
Ja, ich nutze Delphi 7 unter Win Vista..^^
Danke, für die beiden Hilfen..:)

kindliche kaiserin 18. Feb 2010 20:19

Re: Schiffe versenken
 
So nun stehe ich vor einem weiteren Problem:

Delphi-Quellcode:
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;
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?

Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 Uhr.
Seite 1 von 5  1 23     Letzte »    

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