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 1 von 5  1 23     Letzte »    
kindliche kaiserin

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

Schiffe versenken

  Alt 17. Feb 2010, 10:18
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!
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

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

Re: Schiffe versenken

  Alt 17. Feb 2010, 10:21
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.
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Schiffe versenken

  Alt 17. Feb 2010, 10:29
Und wenn es unbedingt OnClick sein muss, kann man die Screenkoordinaten mit Delphi-Referenz durchsuchenScreenToClient umrechnen lassen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
kindliche kaiserin

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

Re: Schiffe versenken

  Alt 17. Feb 2010, 10:37
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 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..
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Schiffe versenken

  Alt 17. Feb 2010, 10:43
Brauchst Du ja auch nicht, X und Y werden Dir ja "frei Haus" geliefert.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

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

Re: Schiffe versenken

  Alt 17. Feb 2010, 10:45
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:

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

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#7

Re: Schiffe versenken

  Alt 17. Feb 2010, 15:27
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)
Markus H.
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

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

Re: Schiffe versenken

  Alt 17. Feb 2010, 16:12
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.
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
kindliche kaiserin

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

Re: Schiffe versenken

  Alt 17. Feb 2010, 19:51
Ja, ich nutze Delphi 7 unter Win Vista..^^
Danke, für die beiden Hilfen..
  Mit Zitat antworten Zitat
kindliche kaiserin

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

Re: Schiffe versenken

  Alt 18. Feb 2010, 20:19
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 11:36 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