schritt nach vorne

Status
Nicht offen für weitere Antworten.

Baa

Mitglied
hi

ich brauche hilfe ich komme nicht mehr weiter

es geht darum
ich muss ein Simple Gammon entwerfen


Gesamtziel

Ziel dieses Aufgaben ist es, einen vereinfachten Backgammon-Klon---Simple Gammon---zu implementieren. Backgammon wird (wenn nicht virtuell am Computer) auf einem Spielbrett mit 15 Spielsteinen pro Spieler gespielt. Das Spielziel ist dabei, die eigenen Steine erfolgreich vom Brett zu ziehen. Eine grundsätzliche Einführung zu Backgammon ist beispielsweise hier zu finden. Wir werden die Spielregeln jedoch aus Vereinfachungsgründen etwas abändern, eine genaue Beschreibung der angepassten Regeln findet sich in Aufgabenteil 3, wo diese auch tatsächlich implementiert werden müssen.

Grundsätzlich gilt, dass die Aufgaben innerhalb des gesamten SimpleGammon Blocks aufeinander aufbauen.

Aufgabe 1 - Spielsteine, Spielfelder, Spielzüge, und 2 Aufzählungstypen
Zwischenziel: Enumerations, Erstellung grundlegender Objekte

Zunächst sollen einige Klassen erstellt werden, welche die grundlegenden Funktionalitäten für das Spiel modellieren.
Die Aufzählungstypen (Enum) SpikeColor und PlayerID sollen die für das Spiel nötigen Farben sowie 2 Spieler-Bezeichnungen typsicher modellieren. Die Klassen Chip, Spike und Move repräsentieren Spielsteine, Spielfelder, sowie Spielzüge.
SpikeColor.java

Implementieren Sie den Aufzählungstyp SpikeColor im Paket jpp.simpleGammon.basics, welcher die nötigen Farben modelliert. Benötigt werden die Farben LIGHT und DARK für die Spielfelder.
PlayerID.java

Implementieren Sie weiterhin den Aufzählungstyp PlayerID im Paket jpp.simpleGammon.basics, welcher die Spielerbezeichnungen modelliert. Für unsere Zwecke genügen PL_1 (weiße Steine) und PL_2 (schwarze Steine). Diese Typen dienen der Unterscheidung der beiden Spieler, wobei gilt, dass PL_1 die Zacken von 1 bis 24 durchlaufen muss, PL_2 hingegen in umgekehrter Richtung von 24 bis 1.
Chip.java

Die Klasse Chip im Paket jpp.simpleGammon.basics repräsentiert Spielsteine des Simple Gammon Spiels; sie verwaltet die ID des zugehörigen Spielers (entweder PlayerID.PL_1 für weiße Steine oder PlayerID.PL_2 für schwarze Steine), einen boolean-Wert out der angibt, ob der Spielstein aktuell im Aus liegt, einen boolean-Wert done für die Darstellung ob der Spielstein erfolgreich zu Ende (= vom Brett) gespielt wurde, sowie ein Spike-Objekt zur Verwaltung des Spielfelds auf welchem sich der Spielstein aktuell befindet. Die Klasse soll (mindestens) folgende Schnittstelle bereitstellen:

*
public Chip ( PlayerID player )
Der Konstruktor der Spielstein-Klasse; er setzt die ID des Spielers auf den übergebenen Wert und initialisiert die Werte für out und done mit false.
*
public PlayerID getPlayerID ( )
liefert die ID des Spielers.
*
public boolean isDone ( )
gibt an, ob der Spielstein bereits erfolgreich vom Brett gespielt wurde.
*
public void setDone ( boolean done )
setzt den Status des Spielsteins, d.h. ob er erfolgreich vom Brett gespielt werden konnte oder nicht.
*
public boolean isOut ( )
gibt an, ob der Stein aktuell im Aus steht.
*
public void setOut ( boolean out )
setzt den Aus-Status des Spielsteins auf den übergebenen Wert.
*
public Spike getCurrentSpike ( )
liefert das Spielfeld, auf dem sich der Spielstein aktuell befindet.
*
public void setCurrentSpike ( Spike spike )
setzt das aktuelle Spielfeld auf dem sich der Spielstein befindet.

Spike.java

Die Klasse Spike im Paket jpp.simpleGammon.basics modelliert jeweils ein Spielfeld (= eine Zacke) auf dem SimpleGammon Spielfeld. Sie soll die Nummer und die Farbe des Feldes (SpikeColor.LIGHT oder SpikeColor.DARK) verwalten, sowie eine Liste der aktuell auf dem Feld befindlichen Spielsteine. Folgende Schnittstelle soll (mindestens) erfüllt werden:

*
public Spike ( int spikeNumber, SpikeColor color )
Initialisiert die Nummer des Feldes und seine Farbe mit den übergebenen Werten und erzeugt eine leere Liste für die Verwaltung der Spielsteine.
*
public SpikeColor getSpikeColor ( )
liefert die Farbe der Zacke.
*
public int getSpikeNumber ( )
liefert die Nummer des Spielfeldes.
*
public PlayerID getPlayerID ( )
liefert die ID des Spielers der Spielsteine auf dem Feld liegen hat. Falls aktuell keine Spielsteine auf dem Feld liegen, wird null zurückgegeben.
*
public void addChip ( Chip chip )
setzt den übergebenen Chip auf das Spielfeld, fügt ihn also der Spielstein-Liste hinzu.
*
public void removeChip ( Chip chip )
falls die Liste der Spielsteine nicht leer ist wird der übergebene Chip vom Spielfeld (und damit aus der Liste) gelöscht.
*
public boolean hasSingleChip ( )
gibt an, ob das Spielfeld aktuell von genau einem einzigen Stein belegt ist.
*
public boolean hasZeroChips ( )
gibt an, ob das Spielfeld aktuell von keinem einzigen Spielstein belegt ist (also leer).
*
public List< Chip > ArrayList< Chip > getChips ( )
liefert die Liste der aktuell auf dem Feld befindlichen Spielsteine. Hierbei muss der Rückgabetyp mindestens vom Typ List< Chip > sein.
*
public String toString ( )
liefert eine String-Repräsentation der Zacke. Falls sich Steine auf dem Spielfeld befinden soll die Ausgabe wie folgendes Beispiel aussehen:
spike 5 is LIGHT and has 3 chips of color BLACK
Falls das Spielfeld leer ist, soll folgende Ausgabe erfolgen:
spike 5 is DARK and is empty
Dabei werden die Index-Nummer und die Farbe des Feldes, sowie die Anzahl und Farbe der Spielsteine mit den tatsächlichen Werten der entsprechenden Klassenattribute ersetzt; die obigen beiden Ausgaben dienen wirklich nur als Anschauungsbeispiele.

Move.java

Die Klasse Move im Paket jpp.simpleGammon.basics verwaltet einen Spielzug, welcher aus dem Start-Spielfeld sowie einem Ziel-Spielfeld besteht. Weiterhin soll die Klasse mit geeigneten Attributen verwalten können, ob der Spielzug, falls ausgeführt, in der Lage ist einen gegnerischen Stein zu schlagen, oder den zu bewegenden Stein ins Ziel zu bringen. Die folgende Schnittstelle soll (mindestens) erfüllt werden:

*
public Move ( Spike start, Spike destination )
Initialisiert das Start-Feld des Spielzugs mit dem als start übergebenen Wert, das Ziel-Feld des Zugs mit destination.
*
public Spike getStartPos ( )
liefert das Start-Spielfeld des Spielzugs.
*
public Spike getEndPos ( )
liefert das Ziel-Spielfeld des Spielzugs.
*
public int getMoveLength ( )
liefert die Länge des Spielzugs.
*
public void canBeat ( boolean bool )
setzt den Schlagen-Status des Moves: true, falls der Zug einen gegnerischen Stein schlagen kann, false, falls nicht.
*
public boolean beats ( )
liefert den Schlagen-Status des Moves.
*
public void canSetDone ( boolean bool )
setzt den Ziel-Status des Moves: true, falls der Spielzug den zu bewegenden Stein ins Ziel bringen kann, false, falls nicht.
*
public boolean setsDone ( )
liefert den Ziel-Status.
*
public String toString ( )
liefert eine String-Repräsentation der Bewegung. Die Ausgaben orientieren sich an folgenden Beispielen:
o
17 -- > 23
im Fall eines Spielzugs von Feld 17 auf Feld 23
o
20 -- > Chip reaches goal
im Fall eines Spielzugs von Feld 20 ins Ziel
o
17 -- > 12
Beating an opposing chip
im Fall eines Spielzugs von Feld 17 auf Feld 12 wobei auf Feld 12 ein Stein des Gegners ins Aus geschlagen wird.
o
Chip is on the board again: -- > 23
im Fall eines Spielzugs vom Aus zurück auf das Spielfeld auf Feld 23


also und ich bin bei SPIKE
und bei MOVE

mein Code latet

public class Spike {

private int spikeNumber ;
private SpikeColor color;
private Chip chip;
private PlayerID player;
/**
*
* @param spikeNumber
* @param color
*/

public Spike ( int spikeNumber, SpikeColor color ) {
this.spikeNumber = spikeNumber;
this.color = color;

}
public SpikeColor getSpikeColor ( ){
return color;

}
public int getSpikeNumber ( ){
return spikeNumber;

}

/**
* liefert die ID des Spielers.
* @return Spieler
*/
public PlayerID getPlayerID ( ) { //???
return player;
}
public void addChip ( Chip chip ){
this.chip = chip;
}
public void removeChip ( Chip chip ) {
this.chip = chip;
}
public boolean hasSingleChip ( ){
return false;
}
public boolean hasZeroChips ( ){
return false;
}

}
public class Move {
private Spike Start;
private Spike Destination;

public Move ( Spike start, Spike destination ) {
this.Start = start;
this.Destination = destination;
}

public Spike getStartPos ( ) {
return Start;

}

public Spike getEndPos ( ) {
return Destination;

}
public int getMoveLength ( ){
return Destination - Start;

}
public void canBeat ( boolean bool ) {

}

}


kann jamand mir weiterhelfen ??!!


dankeschön:rtfm:
 
ich brauche etwas hilfe wie ich weiter machen soll
also bei

public List< Chip > ArrayList< Chip > getChips ( ) {
}

und hier

public String toString ( ) {
}



merci
 
Als Tipp zu der Sache mit List<Chip>.

Bedenke, dass auf einem Spike auch mehrere Chips sein können.

Kannst du das mit
Java:
private Chip chip;
erreichen?

Evtl. solltest du dann auch nochmal die Methoden:
  • hasZeroChips
  • hasSingleChip
  • addChip
  • removeChip
anschauen.

Bei toString() musst du "nur" den passenden String zusammenbauen und anschließend zurückgeben, wie bei einer normalen Klasse auch.

P.S.:
Ich wäre auch an den weiteren Teilen der Aufgabe interessiert.
 
Das is meine Move Klasse:
Java:
package jpp.simpleGammon.basics;
 
/**
 * Verwaltet einen Spielzug, welcher aus dem Start-Spielfeld sowie einem
 * Ziel-Spielfeld besteht.
 * 
 * @author alexandervilling
 * 
 */
public class Move {
 
    Spike Start;
    Spike Destination;
    boolean bool;
    Move move;
 
    public Move(Spike start, Spike destination) {
        this.Start = start;
        this.Destination = destination;
    }
 
    public Spike getStartPos() {
        return Start;
    }
 
    public Spike getEndPos() {
        return Destination;
    }
 
    public int getMoveLength() {
        int helper;
        helper = (Destination.getSpikeNumber() - Start.getSpikeNumber());
        return helper;
    }
 
    public void canBeat(boolean bool) {
        if (Destination.hasZeroChips())
            bool = false;
        else
            bool = true;
    }
 
    public boolean beats() {
        return bool;
    }
 
    public void canSetDone(boolean bool) {
        if (move.setsDone()) {
            bool = true;
        } else {
            bool = false;
        }
 
    }
 
    public boolean setsDone() {
        bool = true;
        return true;
    }
 
    @Override
    public String toString() {
        String Ausgabe = "";
        move = new Move(Start, Destination);
        if (Destination.hasZeroChips())
            Ausgabe = (move.getStartPos() + "-- >" + move.getEndPos());
        else if (move.setsDone())
            Ausgabe = (move.getStartPos() + "-- >" + "Chip reaches goal");
        else if (Destination.hasSingleChip())
            Ausgabe = ("Beating an opposing chip");
        return Ausgabe;
 
    }
 
}

und hier die fehler:

Testcase: testMove took 0.001 sec
FAILED
Move is not implemented correctly expected:<3> but was:<-3>
junit.framework.AssertionFailedError: Move is not implemented correctly expected:<3> but was:<-3>
at level_1.TestMove.testMove(TestMove.java:39)

Testcase: testGetStartEndPos took -0.002 sec
Testcase: testGetMoveLength took 0.001 sec
FAILED
problems with getMoveLength() / Move expected:<18> but was:<-18>
junit.framework.AssertionFailedError: problems with getMoveLength() / Move expected:<18> but was:<-18>
at level_1.TestMove.testGetMoveLength(TestMove.java:81)

Testcase: testBeatMethods took 0.009 sec
FAILED
problems with canBeat() / Move
junit.framework.AssertionFailedError: problems with canBeat() / Move
at level_1.TestMove.testBeatMethods(TestMove.java:127)

Testcase: testDoneMethods took 0 sec
Caused an ERROR
null
java.lang.NullPointerException
at jpp.simpleGammon.basics.Move.canSetDone(Move.java:48)
at level_1.TestMove.testDoneMethods(TestMove.java:138)

Testcase: testToString took 0.004 sec
Caused an ERROR
problem with Move.toString() expected:<[1 -- > 10]> but was:<[Spike1isDARKand is Empty-- >Spike10isLIGHTand is Empty]>
at level_1.TestMove.testToString(TestMove.java:155)

wie bekomm ich da absolute werte für die spikes rein??
mit math.abs gehts ja nicht, da das nicht auf spike angewendet werden kann??
 
Ähm, es war nicht ganz verständlich, aber kann es sein, dass du bei getMoveLength einfach nur ein nichtnegatives Resultat haben willst?

Java:
    public int getMoveLength() {
        return Math.abs(Destination.getSpikeNumber() - Start.getSpikeNumber());
    }

Variablen schreibt man klein.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben