# Malefiz programmieren - Frage zu den einzelnen Spielfeldern



## Kiola (2. Nov 2008)

Hallo,

ich würde gerne Malefiz programmieren und überlege gerade, wie man die einzelnen Spielfelder wohl programmiert... Die Idee, die ich bis jetzt hatte war, dass man das ganze Spielbrett als Hintergrund nimmt und dann ein Feld von Points erstellt, in dem dann die Koordinaten der einzelnen Spielfelder drin stehen. Und dann würde man in der Methode MouseClicked abfragen, ob die geklickte Koordinate -(minus) die einzelnen Koordinaten, die in dem Feld drin stehen, und dann davon der Betrag kleiner oder gleich dem Radius eines Spielfeldes sind...  
Probleme gäbe es zum Beispiel, wenn das Spielfeld dreidimensional angedeutet ist, d.h. wenn die Spielfelder, die hinten liegen kleiner oder nicht mehr rund sind. Und über Tastatur kann man dann das Spiel auch nicht steuern.
Gibt es einen besseren Weg, als den Weg über die einzelnen Koordinaten?

Hoffe auch Antworten.
Vielen Dank

Kiola


----------



## Quaxli (2. Nov 2008)

Spannendes Problem. Ich weiß aber nicht, ob Dein Ansatz realisierbar wäre. Was mir dazu einfällt wäre folgende Idee (von der ich aber auch nicht weiß, wie praktikabel sie ist):

Du legst hinter das Spielfeld ein Koordinaten-System (ich gehe jetzt mal von einem 2D-Ansatz aus). In diesem Koordinaten-System markierst Du Felder die betreten werden dürfen (= die Felder des Spielbretts) und Felder die nicht betreten werden dürfen (= der ganze Rest). Wenn jetzt ein Feld geklickt wurde errechnest Du über eine Algorithmus zur Wegermittlung, wie weit das Feld entfernt ist und ob Du hinziehen kannst.
Über ein Koordinatensystem fällt Dir die Ermittlung des Weges und die Übersicht der Beziehung der einzelnen Felder zueinander vermutlich leichter als wenn Du nur Einzelfelder in eine Liste packst.

Es gibt in der Informatik ja auch einige Lösungsansätze zur Ermittlung einer kürzesten Wegstrecke. Ich würde dazu mal ein bißchen googeln


----------



## Kiola (2. Nov 2008)

hmmm.
also über die Wege habe ich mir jetzt noch keine Gedanken gemacht.
Aber das mit dem Koordinatensystem, ist das nicht eigentlich auch das, wie ich mir das gedachte habe? 
Weil ich muss doch erstmal wissen, wo genau die einzelnen Spielfelder liegen. Und dazu brauche ich ja die Koordinaten... und die muss man ja irgendwo abspeichern damit man weiß, welches Spielfeld wo liegt. Und da bietet sich doch ein Feld an.
oder verstehe ich das jetzt falsch?


----------



## Quaxli (2. Nov 2008)

Es gibt sicher viele Ansatzmöglichkeiten. Wenn Dir mein Vorschlag nicht gefällt und Deine Herangehensweise funktioniert, dann realisiere die.

Aber noch ein paar Anmerkungen:



> also über die Wege habe ich mir jetzt noch keine Gedanken gemacht.


Solltest Du aber  - das wird nämlich vermutlich eines Deiner Hauptprobleme werden.



> Weil ich muss doch erstmal wissen, wo genau die einzelnen Spielfelder liegen. Und dazu brauche ich ja die Koordinaten


Genau! Und warum nicht aus einem Koordinatensystem?  Vielleicht habe ich mich auch falsch ausgedrückt. Mit Koordinatensystem ist vielleicht nicht ganz das gemeint, was Du Dir jetzt darunter vorstellst. Ich dachte eher an ein 2D-Array aus Feldern, die gewissen Informationen enthalten (wer ist mein Nachbar, darf er betreten werden, etc.)

Aber wie gesagt, mach es wie es Dir genehm ist. Nur solltest Du dabei den ganzen Ablauf im Blick haben. Also nicht nur über das Abspeichern der Felder nachdenken, sondern auch, welche Informationen Du im Spielverlauf von/zu den Feldern benötigst und wie Du darauf zugreifst.
So simpel das Spiel auf Deinem Wohnzimmertisch aussieht, es zu Programmieren ist etwas aufwändiger


----------



## Marco13 (3. Nov 2008)

Was ist denn jetzt die eigentliche Frage? Wie man das Spielfeld intern repräsentiert, oder wie man bei einem Mausklick reuasfindet, welches Feld angeklickt wurde?

Für ersteres: Das ist fast egal. Überleg' dir GENAU, wie die Felder angesprochen werden müssen. Vermutlich muss man von jedem Fald seine Nachbarn kennen oder bestimmen können, vielleicht auch den (kürzesten?) Pfad zwischen einem Feld und einem anderen ausrechnen können usw. Schreib' dir dann eine Klasse "Board" die diese Methoden möglichst allgemeingültig anbietet. Die interne Repräsentation kann dann z.B. über ein 2D-Array erfolgen, z.B. ein Array 
private Field fields[][] = new Field[xx][yy];
wo an den Stellen, wo Felder sind, ein "Field" objekt liegt (mit allen nötigen Informationen über Feldtyp und darauf stehende Spielfigur usw), oder (was für Wegeprobleme sicher "bequemer" wäre) als Graph.... oder oder oder

Für zweiteres: Das wird nur dann schwierig, wenn die Darstellung "3D-mäßig vezerrt" sein soll. Im 2D-Fall kann man sich direkt aus den Koordinaten des Mausklicks ausrechen, welches Feld angeklickt wurde. (Ob man wirklich IN den Kreis geklickt hat, oder knapp daneben, ist IMHO nicht so wichig, kann dann aber tortzdem ganz leicht berücksichtigt werden). Für den 3D-Fall mußt du dir überlegen, wie du die "3D-mäßig verzerrte" Abbildung des Spielbrettes überhaupt machen willst. Wenn die einmal fest vorgegeben ist, kann man die Verzerrung auch leicht wieder "rausrechnen", und landet wieder beim 2D-Fall...


----------



## Landei (3. Nov 2008)

Für das zweite Problem ist hier schon öfters ein "Schatten-Bild" vorgeschlagen worden. Wenn du die 3D-Ansicht als fertiges Bild hast, machst du davon eine Kopie mit Falschfarben, und zwar so, dass jede zu erkennende Region eine einheitliche, eindeutige Farbe zugeordnet bekommt. Dieses Schatten-Bild hältst du nur im Speicher, und bei einem Mausklick auf das Original schaust du einfach an den entprechenden Koordinaten auf dem Schatten-Bild nach, und suchst anhand der Farbe das entsprechende Objekt in deinem Spiel-Model heraus.


----------

