G
Guest
Gast
hallo leute,
ich hab ein kleines progrämmchen geschrieben mit dem man shogi spielen kann. shogi ist ein brettspiel, dass in unseren breiten bekannten schach ähnelt. dort benutze ich für die einzelnen gangarten der steine das singletonmuster. also könig z.b. kann jedes feld um ihn herum ansteuern, also ist seine gangart ein feld nach oben, ein feld nach unten, ein feld nach rechts, ein feld nach links und dann noch jeweils die felder diagonal.
es gibt die möglichkeit eine gespielte partie abzuspeichern und sie später dann auch zu laden. an dieser stelle, d.h. beim laden der partie gibt es auch schwierigkeiten. ich poste mal den betreffenden quellcodeabschnitt:
im shogi ist es so, dass die geschlagenen steine nicht aus dem spiel sind, man sagt sie sind "auf der hand". diese können zu einem späteren zeitpunkt im spielverlauf wieder eingesetzt werden. es gibt einen bereich auf dem brett, wo diese steine dargestellt werden. die obere methode stellt diese steine dar. nach dem laden einer partie gibt es wie gesagt ein problem und zwar ist es so, dass steine die auf der hand waren nicht dargestellt werden. d.h. der für sie vorgesehen bereich ist leer. beim deabuggen (netbeans) komme ich nicht über die erste if-abfrage drüber. das ist auch der grund, ganz klar, warum die steine auf der hand nicht dargestellt werden (laut deabugger gibt es keine values zu diesem key, das hab ich auch mit der zeile System.out.... überprüft. die hashmap enthält aber schon die steine die auf der hand sind). im deabugger gibt es ja eine spalte die value heisst, ich gehe davon aus dass das die adresen im arbeitsspeicher sind, richtig??? also in dieser spalte steht, dass die variable typ (aus der klammer der for-schleife) einen anderen wert besitzt als der key der hashmap, (das ganze z.b. für die gangart vom bauer). in meinen augen sieht es so aus, als ob es zwei verschiedene gangarten (gangartobjekte) gäbe (da die werte im arbeitsspeicher verschieden sind), was aber dem singletonmuster ja widersprechen würde. und noch etwas, wenn ich in einer gangartklasse, in der also auch das singletonobjekt deklariert ist, hashcode und equals überschreibe (sehr notdürftig überschreibe
) dann werden die steine dargestellt, was aber beim singleton ja auch nicht so optimal ist und ich würde das am liebsten sauber, also ohne die methoden zu überschreiben erledigen. ich füge noch den quellcode von der gangart vom bauer an:
hat irgend jemand eine idee, warum zwei verschiedene singletonobjekte vorhanden sind? und wie ich das lösen kann? müssen evt. singletons auf eine besondere art und weise abgespeichert werden (ich benutze das standartverfahren)? andere vorschläge warum das nicht läuft!
ich danke euch schon mal
ich hab ein kleines progrämmchen geschrieben mit dem man shogi spielen kann. shogi ist ein brettspiel, dass in unseren breiten bekannten schach ähnelt. dort benutze ich für die einzelnen gangarten der steine das singletonmuster. also könig z.b. kann jedes feld um ihn herum ansteuern, also ist seine gangart ein feld nach oben, ein feld nach unten, ein feld nach rechts, ein feld nach links und dann noch jeweils die felder diagonal.
es gibt die möglichkeit eine gespielte partie abzuspeichern und sie später dann auch zu laden. an dieser stelle, d.h. beim laden der partie gibt es auch schwierigkeiten. ich poste mal den betreffenden quellcodeabschnitt:
Code:
private void zeichneSteine(Graphics g) {
// HashMaps mit Steinen auf der Hand ermitteln
HashMap<Gangart, ArrayList<Stein>> mapSteineAufDerHandW = stellung.steineAufDerHand(Farbe.WEISS);
Gangart [] typenAufDerHand = { Bauer.typ(), Lanze.typ(), Springer.typ(), Silber.typ(), Gold.typ(), Laeufer.typ(), Turm.typ(), Koenig.typ() };
// weis
for(Gangart typ : typenAufDerHand) {
// System.out.println(mapSteineAufDerHandW.containsKey(typ));
if(mapSteineAufDerHandW.get(typ) != null) {
if(!(mapSteineAufDerHandW.get(typ).isEmpty())) {
int x = anfangFelderX + mapPositionW.get(typ).linie()*GrafikFeld.feldBreite();
int y = mapPositionW.get(typ).reihe()*GrafikFeld.feldBreite();
g.drawImage(mapImageW.get(typ), x, y ,this);
g.setFont(new Font( "Verdana", Font.BOLD, 10 ));
g.setColor (Color.BLACK);
int anzahl = mapSteineAufDerHandW.get(typ).size();
g.drawString(""+anzahl,x,y+GrafikFeld.feldBreite()-5);
}
}
}
}
Code:
public final class Bauer implements Gangart {
private static final long serialVersionUID = 1L;
private final static Gangart mGangart = new Bauer();
//private final static int mDeltaHor = 0;
/**
* erzeugt einen Bauern.
*/
private Bauer() {
}
/**
* liefert die einzige Instanz der konkreten Gangart.
*/
public static Gangart typ() {
return mGangart;
}
/**
* liefert eine textuelle Darstellung
*/
public final String toString() {
return "P"; //Pawn
}
/**
* Clonen verhindern.
*/
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
//===================================================================
// public boolean equals (Object vergl) {
// if (this == vergl) return true;
// if (vergl == null) return false;
// if (getClass() != vergl.getClass()) return false;
// return true;
// }
// public int hashCode() {
// return 1;
// }
}
hat irgend jemand eine idee, warum zwei verschiedene singletonobjekte vorhanden sind? und wie ich das lösen kann? müssen evt. singletons auf eine besondere art und weise abgespeichert werden (ich benutze das standartverfahren)? andere vorschläge warum das nicht läuft!
ich danke euch schon mal