Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Informatik-Projekt: 4x4x4 (https://www.delphipraxis.net/124599-informatik-projekt-4x4x4.html)

gowoot 21. Nov 2008 17:48


Informatik-Projekt: 4x4x4
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute :)

Ich hab da mal eine Frage. Wir sollen uns im Rahmen eines Informatik-Projektes der Klasse 13 ein (Strategie-)Spiel programmieren.

Meine Gruppe hat sich für das Spiel 4x4x4 entschieden, eine Art dreidimensionales Vier-Gewinnt.

Ein Bild des Spielfeldes befindet sich im Anhang.

Die Felder können per Eingabe der Koordinaten in Edit-Felder schon aufgerufen und markiert werden.
Es handelt sich dabei um einzelne Polygone.

Meine Frage nun: Wie könnte es man anrichten, die Felder mit der Maus anwählbar zu machen? Ich habe dazu leider nichts gefunden, und bin hinsichtlich dieses Gebietes, genauso wie meine Mitschüler, kaum bewandert.
Wie könnte man dies möglichst einfach anstellen?



Vielen Dank für eure Hilfe!

Gruß



btw: Falls der Thread hätte doch woanders hingehören sollen, dann tuts mir Leid. :(

jokerfacehro 21. Nov 2008 18:14

Re: Informatik-Projekt: 4x4x4
 
hmm, man könnte für die felder ganz normale panels nehmen, diese dann in deiner rautenform ausschneiden und dann ist auch der mausbereich dazu passend, samt den events.

FAlter 21. Nov 2008 18:17

Re: Informatik-Projekt: 4x4x4
 
Hi,

wenn du die Polygone selbst zeichnest, solltest du ja die Koordinaten der Eckpunkte kennen und daraus (einfacherweise in der Zweipunktform) die Geradengleichung herleiten können.

Diese formst du in die Hessesche Normalform um, bzw. es reicht, sie in die Normalform umzuwandeln und das Vorzeichen HNF-gemäß anzupassen. Dann kannst du durch Einsetzen des geklickten Punktes ermitteln, ob die Koordinaten in einem Polygon waren, indem du für die Begrenzungsgeraden das Vorzeichen so überprüfst, dass der Punkt dazwischen sein muss.

War jetzt nur so eine Idee. Da du ja gerade in der 13. Klasse bist, solltest du verstehen, was ich meine*, und die Idee in Code umwandeln können. Vielleicht bekommst du auch noch eine Idee beim weiter darüber nachdenken, wie du das Problem noch vereinfachen/die Lösung optimieren kannst.

Mfg
FAlter

*) Mir fällt jedenfalls keiner ein bei uns, der in der 13. noch Info gemacht hat und nicht im Mathe-LK war.

Jakob Ullmann 21. Nov 2008 19:06

Re: Informatik-Projekt: 4x4x4
 
Der Einfachheit halber könntest du auch Begrenzungsrechtecke für die Polygone anlegen, und dich von hinten nach vorne durcharbeiten, ob der Cursor auf so einem Rechteck liegt. Wäre IMHO einfacher. :mrgreen:

Uwe Raabe 21. Nov 2008 19:45

Re: Informatik-Projekt: 4x4x4
 
Es geht wohl noch einfacher:

Ich nehme mal an, daß die Koordinaten der linken, unteren Ecken der jeweiligen Spielflächen, die Breite und Höhe bekannt sind. Dann läßt sich aus dem Y-Wert der Maus schon mal ermitteln, in welcher Spielfläche man sich eventuell befindet. Jetzt zieht man den Basis-Y-Wert der Spielfläche ab, dividiert durch 4 und rundet das Ganze. Nun hat man eine Zahl im Bereich 0..3, die die Zeile wiedergibt.

Dem Anschein nach wird hier eine Micky-Maus-Perspektive {(X,Y) -> (X+Y/2,Y/2} verwendet. Demnach muss man jetzt einfach die im vorigen Schritt errechnete Y-Differenz nach links gehen und den so korrigierten X-Wert vom Basis-X-Wert abziehen. Liegt der neue Wert im gültigen X-Bereich, wird wieder durch 4 dividiert und gerundet. Das wars dann.

gowoot 22. Nov 2008 14:42

Re: Informatik-Projekt: 4x4x4
 
Hallo,

erst einmal danke für die Ideen.
Die letzte von Uwe Raabe erscheint mir am sinnvollsten.
@Jakob Ullman: Wie lege ich denn solche 'Begrenzungsrechtecke' an? Bedenke, die Spielfelder ragen in die Tiefe.

Allerdings habe ich noch ein kleines Problem. Wie kann ich denn die Mauskoordinaten herausfinden?
Die Idee von hier klappt bei mir nicht so ganz:
http://www.delphipraxis.net/internal...ct.php?t=21893


Vielen Dank nochmal!

Corpsman 22. Nov 2008 15:01

Re: Informatik-Projekt: 4x4x4
 
Hier eine weitere Idee, allerdings ohne KI

4-Gewinnt in 3D

Codewalker 22. Nov 2008 15:02

Re: Informatik-Projekt: 4x4x4
 
Alternative: Für das Zeichnen der Polygone müssen dir ja die Eckpunkte bekannt sein. Mithilfe einer PointinPoly-Funktion kannst du dann schnell überprüfen, ob ein Punkt (der Mauszeiger) in einem Polygon liegt. Bei 4x4x4 Polygonen dürfte das ausreichend schnell sein. Wenn es noch schneller sein muss, kannst du erstmal überprüfen, über welcher Ebene dein Mauszeiger ist (grob, anhand des umgebenden Rechtecks). Dann musst du nur noch 16 Polygone vergleichen. Du könntest nun nochmal z.B. auf vier Quadranten einschränken, so dass du im Zweifelsfall ~6 Polygone mit PointinPoly überprüfen musst. Ob sich der Aufwand aber für die Geschwindigkeit lohnt, wage ich zu bezweifeln - es sei denn, du willst aus 4x4x4 später mal 200x200x200 machen :mrgreen: .

Delphi-Quellcode:
function PointinPoly(P: Tpoint): boolean;
var
  hnd: hdc;
begin
  hnd := CreatePolygonRgn(PolyArray, AnzahlPunkte, Winding); // Polygonregion erstellen
  Result := PtInRegion(hnd, p.x, p.y); // Testen, ob Punkt drin
  DeleteObject(hnd); // freigeben Objekt
end;
PolyArray ist dabei ein Array of TPoint, AnzahlPunkte ein Integer mit der Anzahl der Punkte im Array. WINDING eine Windows-Konstante (ALTERNATE wäre die andere, passt aber hier nicht).

Mfg

Codewalker

Uwe Raabe 22. Nov 2008 16:14

Re: Informatik-Projekt: 4x4x4
 
Zitat:

Zitat von gowoot
Allerdings habe ich noch ein kleines Problem. Wie kann ich denn die Mauskoordinaten herausfinden?

Was ist das denn für eine Komponente, mit bzw. auf der das Spielfeld gezeichnet wird? Bei einer Paitnbox z.B. bekommst du die Koordinaten im OnMouseDown Event.

gowoot 22. Nov 2008 21:06

Re: Informatik-Projekt: 4x4x4
 
@Uwe Raabe: Danke, das hab ich gesucht. Hab's mal in einem extra Programm getestet, funktioniert wunderbar. Zeichenfläche ist ein Image. :)

@All: Hatte heute nicht wirklich viel Zeit. Das übrige werde ich morgen testen, und nochmals herzlichen Dank :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 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