Java (BlueJ) Mensch ärgere dich nicht Programmien

Vernon.098

Neues Mitglied
Hallo liebe Informatiker,

Ich möchte das Spiel Mensch ärgere dich nicht programmieren lol. Momentan habe ich Schwierigkeiten das Spielfeld und die Spielfiguren zu programmieren.
Gerade habe ich den Würfel programmier welcher so aussieht:

import java.util.Random;
public class Würfel {
private Random zufall;
// instance variables - replace the example below with your own
private int x;


public Würfel()
{
// initialise instance variables
zufall = new Random() ;
}

/**
* "Wirft" den Würfel, indem eine Zufallszahl zwischen 1 und 6 (einschliesslich) generiert wird.
* @Return Eine Ganzzahl von 1 bis 6
*/
public int werfen() {
// put your code here
return zufall.nextInt(6)+1;
}
}

Bin mir aber noch mega unsicher dabei xD
Das wäre mega nice, wenn jemand mir helfen könnte 🙂
 
Der Würfel passt schon mal 🙂
Was du jetzt als nächstes brauchst, ist die logische Darstellung des Spielfelds. Von jedem Feld aus muss es eine Möglichkeit geben, um weiter zu kommen.
Ohne mit Indizes zu arbeiten, wäre eine LinkedList wäre also schon mal eine Idee, das letzte Feld verweist wieder auf das erste.
Von 4 Feldern aus muss man auch in der Lage sein, einen Seitenzweig zu erreichen, alles anderen Felder haben diese Möglichkeit NICHT.
Die Seitenzweige sind speziell. Dort kannst du dich nämlich auch rückwärts bewegen. Das letzte Feld in jedem Seitenzweig hat keinen Nachfolger.
Alle Sondereigenschaften können natürlich bei jedem Feld vorhanden sein, dann brauchst du keine verschiedene Datentypen und ersetzt instanceof Abfragen durch besser lesbare Methoden.

Du brauchst also eine Doubly Linked List, jedes Element davon verweist auf den Nachfolger und Vorgänger, außerdem optional auf ein anderes Element.

Entwirf mal einen Datentyp, der diese Eigenschaften speichern kann und auch eine Eigenschaft, ob und welche Spielfigur darauf steht (dazu am Besten auch gleich einen Datentyp für die Spielfigur).
Bau auch gleich Hilfsmethoden wie "hasAlternativeRoute()" oder "hasNext()" ein, damit du dir die Null-Abfragen (wie getNext() != null) im Code sparst. Lesbare Bezeichnungen sind viel angenehmer.

Anschließend bau mal die Liste mit dem Spielfeld und die Seitzenwege auf.

ps: Die Form des Spielfelds ist für die Logik irrelevent, das ist nur grafische Darstellung. Vergiss mal, wie das Brett ausschaut und konzentrier dich darauf, was es macht.
 
Hallo,
erstmals vielen lieben Dank für die Antwort.
Leider kenn ich mich nicht so gut mit Java aus und habe grad echt gar keine Ahnung was ich machen muss.

Wär es vielleicht möglich, schon den die fertige Programmierung hier reinzuschicken, mit jeweils einer Erklärung ?

Das wär sehr sehr nett 🙂
 
Möglich wär's schon, dass überlass ich aber jemand anderem.

Versuch das Ganze auch mal auf dem Papier aufzuschreiben. Zeichne das Spielfeld, stell fest, welche verschiedenen Arten von Feldern es gibt. Was kann man über ein Feld sagen? Worin unterscheiden sich die Feldarten? Du solltest nicht gleich losprogrammieren.


Was du aber programmtechnisch als erstes machen musst: Dich damit beschäftigen, was eine doppelt verkettete Liste (Doubly Linked List) ist und wie man das realisieren könnte.
Insertion und Deletion kannst du erst mal ignorieren, dein Feld ändert sich ja nicht. Du brauchst erst mal nur Next und Previous.

Alternative: Fang mit was einfacherem an. Mensch ärgere dich nicht ist nicht gerade trivial. Es besteht zwar aus an sich einfachen Teilproblemen, aber eben doch aus einer reichlichen Menge davon.
 
Zuletzt bearbeitet:
Also ich fürchte, dass dies so nicht funktioniert. Du willst doch etwas lernen, daher wäre die Frage, an welchem Punkt Du nun genau nicht weiter kommst. Evtl. ist es auch einfach noch zu schwer für Dich? Was hast Du denn schon so gelernt?

Generell ist es so, dass man alles auch deutlich einfacher darstellen kann. Statt die Felder abzubilden kann man auch einfach alle Felder durchnummerieren.

Dann hat jedes Feld eine Nummer. Fang also einfach an bei dem Feld, an dem ein Spieler heraus kommt. Wir nennen diesen Spieler einfach einmal Spieler 1. Das Feld, an dem er heraus kommt, ist dann Feld Nr. 1, das nächste 2, 3, 4, 5, ...
Irgendwann kommt dann das Feld, ab dem der Spieler 2 in sein "Zuhause" einrücken kann. Diese Nummer ist wichtig. Dann kommt das Feld, in das Spieler 2 heraus kommt ... u.s.w.
Das letzte Feld wäre dann das Feld, ab dem Spieler 1 einrücken kann.
Somit hast Du jetzt Spieler1 / 2 / 3 / 4 und zu jedem Spieler hast Du das Ausrück- und das Einrück Feld.

Jede Figur hat ein Spielfeld. Das ist eine Nummer, die einfach die Nummer des Feldes angibt. Dabei bedeutet:
0 - Figur ist nicht im Spiel
-1 - -4 Figur ist auf einem Feld des Einrück-Bereiches.

Damit wäre das Spiel auch abgebildet. Klasse Spieler, jeder Spieler hat 4 Figuren (bzw. 4 Felder, auf denen seien Figuren sind).

Damit kannst Du dann auch das ganze Spiel steuern.
 
Wenn Du das Spiel ganz Universell handhaben willst, dann kannst Du auch gar nicht zählen. Dann erzeugst Du einfach ein Spielfeld mit variablen Anzahlen:
- Anzahl Spieler (Das kann eine beliebige Zahl > 0 sein)
- Anzahl Felder pro Spielern (>= 2, da mindestens einrück und ausrück Felder da sein müssen)
- Anzahl Figuren pro Spieler (>=1 - anzahl Einrückfelder = anzahl Figuren)

Da muss man sich dann nur überlegen, welches Feld welche Nummer hat. Und um zu sehen, ob ein Feld belegt ist, muss man halt alle Figuren durchprüfen.
 
Hallo, ich habe die Oberfläche auf folgende Art geschrieben:
Anwendung in java.swing. Hauptfenster : JFrame. Davon habe ich den ContentPane geholt, der bekommt ein BorderLayout. Ein JPanel wird in das Layout als Center Komponente eingefügt. Dieses Panel hat ein GridLayout mit 13x13 Elementen. .Das sind die Felder. Die Felder wurden durchnumeriert. Über die Nummer wird festgelegt welcher Feldtype es ist (unsichtbar, waitforGame ,home, normal Feld, Einsetzfeld) Hier habe ich ein paar Klassen für die einzelnen Feldtypen definiert um sie speziell darstellen zu können. Die Darstellung passiert in der paintComponent Methode. Mit dem Graphics Objekt lassen sich verschieden graphische Figuren und Images darstellen. Die nicht sichtbaren Felder dieser Matrix haben keine paintComponent Methode. Welches Feld von einem Stein gelegt ist verwalte ich mit einer Hashtable (Key ist ein Integer der Feldnummer, Value ein Figur Object. Das zeichnet sich auch selbst.
Die Reihenfolge der Felder, die gegangen werden, verwalte ich über ein int Array pro Spielfarbe, indem die Feldnummern stehen.
Im NORTH Panel des BorderLayout verwalte ich die Anzahl der Mitspieler, das Würfeln und Infos zum Spiel.
Soweit erstmal zur Oberfläche. Die Funktionalität habe ich noch nicht ganz fertig, aber bis dahin kann ich auch Quellcode anbieten.
 

Anhänge

  • Feld.PNG
    Feld.PNG
    32 KB · Aufrufe: 3

Neue Themen


Zurück
Oben