# Mensche Ärgere Dich Nicht



## muca66 (8. Sep 2011)

Hallo Leute,

momentan bin ich bei der Programmierung des Spiels "Mensch Ärgere Dich Nicht". Ich habe schon die Oberfläche erstellt, komme aber leider nicht mehr weiter. Meine Problem ist, dass ich nicht weiß, wie ich das Spiele zum laufen bringen soll. Jedes Kreis hat bei mir x und y Koordinaten, welche ich per Paint-Methode zeichne. Sollte ich diese lieber in ein Array reinschreiben? Im Spiel gibt es insgesamt 72 Felder. Wie soll ich die Koordinaten von diesen ganzen Feldern am besten abspeichern, so dass ich diese auch im Spiel ansprechen kann? Momentan habe ich eine totale Blockade. Ich hoffe jemand kann mir weiter helfen..


----------



## Fu3L (8. Sep 2011)

Generell dürfte sich eine List<Cell> empfehlen (dabei sei Cell mal eine Klasse, die einen solchen Kreis repräsentiert. Eine Klasse dafür anzulegen lohnt sich natürlich, weil eine Zelle ja auch wissen muss, ob sie eine der spielerspezifischen Zielzellen ist usw.).
Ansprechen kannst du sie dabei auf verschiedene Wege. Das hängt vom Aufbau deines Programms ab und was du durch das Ansprechen erreichen willst^^ (Das wäre also ein Fall für mehr Information)
In 72 Einzelvariablen das ganze zu speichern dürfte eher problematisch werden^^


----------



## hdi (8. Sep 2011)

Hm ist gar nicht so leicht.. Das Problem ist, dass das Spielfeld halt sehr "eigen" ist und sich nicht in eine einfache Anordnung drücken lässt. 

Du kommst wohl nicht darum herum, für jedes der 72 Felder die Zeichen-Koordinaten per Hand zu übergeben. So machst du es im Moment wohl auch. Ist ja auch nicht so wild, immerhin ist das Spielfeld statisch. Aber die Koordinaten kannst du gleich innerhalb der Feld-Instanz (d.h. der Feld-Klasse) abspeichern - über ein 2D-Array kannst du das in dem Fall auch nicht wirklich eleganter machen.

Für die _logische _Anordnung würde ich mir die Felder in einer LinkedList abspeichern. Und zwar in der Reihenfolge, in der die Figuren die Felder durchlaufen. Wo da der Anfang ist, musst du dir halt überlegen. Über den Index der Liste kommst du so leicht an das Nachfolger- bzw. Vorgängerfeld.. Letztes Feld (index = size-1) hat als Nachfolger halt das erste (index = 0). 

Wobei die Zielfelder, in der die Figuren landen sollen und die "Warte"-Felder außerhalb des eigentlichen Spielfelds dann auch gemäß einer bestimmten Regel darin abgespeichert werden, die du für dich festlegen musst.

Ist wirklich etwas ätzend.. :bahnhof: Auf jeden Fall ist es in diesem Fall wohl am besten, wenn du möglichst viel per Hand machst. Das erleichtert dann die Spiellogik, auch wenn du 72 Felder und ihre Werte einzeln und ohne Schleife erzeugen musst... Du solltest aber wenn du ein Feld hast schnell an die Infos rankommen:
- nächstes Feld
- voriges Feld
- ist es ein Start/Zielfeld
- ist es bereits von einer Figur belegt

Ich bin grad schon halb im Bett, ich versuch morgen nochmal im Stau darüber nachzudenken


----------



## muca66 (8. Sep 2011)

Vielen Dank für eure Antworten. Ich habe mal ein wenig nachgeguckt und rausgefunden,dass es eine Point-Klasse gibt. Diese kann man als Liste verwenden und immer die x und y Koordinaten abspeichern. Das wäre eigentlich ideal, wenn ich für jedes Feld diese Koordinaten abspeichern könnte. Das abspeichern an sich ist kein Problem, das Problem ist, dass ich nicht weiß wie ich diese Koordinaten bei der drawoval(int x, int y, int x, int y)-Methode benutzen kann..


----------



## Fu3L (8. Sep 2011)

```
List<Point> points = new LinkedList<Point>();
//Hier befüllen

@Override
public void paintComponent(Graphics g) {
  //Hintergrund zeichnen und/oder super.paintComponent(g);
  for(Point p : points) {
     g.drawOval(p.x, p.y, POINT_WIDTH, POINT_HEIGHT);
  }
}
```

Ich würde allerdings empfehlen eine eigene Klasse zu schreiben, um die genannten Eigenschaften wie "Zielzelle" oder so zu speichern, damit du bei der Bewegung der Figuren diese leichter überspringen kannst (bzw. den Eintritt in diese besser regeln kannst).
Edit: So könntest du auch die Farben spezifischen Farben der Zellen speichern und dann in paintComponent() aufrufen.


----------

