Hallo,
ich stehe momentan vor einem Problem, dass mich wirklich zur Verzweiflung bringt und ich habe leider überhaupt keinen Ansatz mehr.
Ich möchte ein kleines, selbst lernendes Schachspiel entwickeln (mehr oder weniger zu Übungszwecken) die eigentliche Spielsteuerung funktioniert soweit auch. Momentan haperts am "Dazulernen". Das Verfahren beruht darauf, dass eine Spielsituation gespeichert wird, die zum Verlust geführt hat um diese in Zukunft zu vermeiden.
Das Grundverfahren soll so laufen:
Ich habe ein Objekt vom Typ Situation (mehrdimensionales Array mit int-Werten), und ein Objekt von Memory-Einträgen (int-Wert für den Spieler schwarz/weiß, Objekt der Spielsituation). Diese Memory-Einträge serialisiere und deserialisiere ich, damit die gelernten Situationen auch nach dem Programmstart noch verfügbar sind.
Das Problem dabei ist: alle Einträge, die durch das Deserialisieren geladen werden, werden nur teilweise korrekt verarbeitet. Der Wert für den Spieler wird korrekt eingelesen, die Spielsituation allerdings nicht, dort wird überall nur eine 0 wiedereingelesen.
Leider kann ich nicht herausfinden, ob das Problem bei der Serialisierung oder der Deserialisierung liegt, weil ja eins vom anderen abhängt.
So, nun genug geschrieben, hier kommt der Code. Entscheidend sollten storeMemory() und restoreMemory() sein, dennoch der komplette Zusammenhang:
Ich hoffe mir kann jemand auf die Sprünge helfen, inzwischen würden mich sogar Lösungen erfreuen.
Vielen Dank im Voraus und schöne Pfingsttage
Tsunami
ich stehe momentan vor einem Problem, dass mich wirklich zur Verzweiflung bringt und ich habe leider überhaupt keinen Ansatz mehr.
Ich möchte ein kleines, selbst lernendes Schachspiel entwickeln (mehr oder weniger zu Übungszwecken) die eigentliche Spielsteuerung funktioniert soweit auch. Momentan haperts am "Dazulernen". Das Verfahren beruht darauf, dass eine Spielsituation gespeichert wird, die zum Verlust geführt hat um diese in Zukunft zu vermeiden.
Das Grundverfahren soll so laufen:
Ich habe ein Objekt vom Typ Situation (mehrdimensionales Array mit int-Werten), und ein Objekt von Memory-Einträgen (int-Wert für den Spieler schwarz/weiß, Objekt der Spielsituation). Diese Memory-Einträge serialisiere und deserialisiere ich, damit die gelernten Situationen auch nach dem Programmstart noch verfügbar sind.
Das Problem dabei ist: alle Einträge, die durch das Deserialisieren geladen werden, werden nur teilweise korrekt verarbeitet. Der Wert für den Spieler wird korrekt eingelesen, die Spielsituation allerdings nicht, dort wird überall nur eine 0 wiedereingelesen.
Leider kann ich nicht herausfinden, ob das Problem bei der Serialisierung oder der Deserialisierung liegt, weil ja eins vom anderen abhängt.
So, nun genug geschrieben, hier kommt der Code. Entscheidend sollten storeMemory() und restoreMemory() sein, dennoch der komplette Zusammenhang:
Java:
import java.util.*;
import java.io.*;
public class Memory
{
static HashSet<MemoryEntry> BannedSituations;
static void resetMemory()
{
BannedSituations = new HashSet<MemoryEntry>();
}
public static void addSituation(Situation s, int player)
{
if(BannedSituations.add(new MemoryEntry(s, player)))
System.out.println("Banned Situation added!");
}
static void storeMemory()
throws IOException
{
FileOutputStream fos = new FileOutputStream("memory.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(BannedSituations);
oos.close();
}
@SuppressWarnings("unchecked")
static void restoreMemory()
throws IOException, ClassNotFoundException
{
FileInputStream fis = new FileInputStream("memory.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
BannedSituations = ((HashSet<MemoryEntry>) ois.readObject());
ois.close();
}
public static boolean isBanned(Situation s, int player)
{
if(BannedSituations.contains(new MemoryEntry(s, player)))
return true;
return false;
}
}
class MemoryEntry implements Serializable
{
private static final long serialVersionUID = 1L;
Situation BannedSituation;
int player;
MemoryEntry(Situation s, int player)
{
this.BannedSituation = s;
this.player = player;
//this.print();
}
@Override
public boolean equals(Object obj){
MemoryEntry entry;
if(obj instanceof MemoryEntry)
entry = (MemoryEntry) obj;
else
return false;
if(this.player != entry.player)
return false;
if(this.BannedSituation.equals(entry.BannedSituation) == false)
return false;
return true;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + this.BannedSituation.hashCode();
result = 31 * result + this.player;
return result;
}
}
Java:
import java.io.Serializable;
import NM.*;
public class Situation extends SituationNM implements Serializable
{
private static final long serialVersionUID = 1L;
public Situation() // Konstruktor zur Initialisierung
{
feld = new int[][] {{1,1,1,1},{0,0,0,0},{0,0,0,0},{2,2,2,2}};
// Ausgangssituation f¸r das Spiel
}
@Override
public boolean equals(Object obj){
Situation sit;
if(obj instanceof Situation)
sit = (Situation) obj;
else
return false;
for(int i = 0; i < 4; i++){
for(int y = 0; y < 4; y++)
if(this.feld[i][y] != sit.feld[i][y])
return false;
}
return true;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + this.feld.hashCode();
return result;
}
}
Ich hoffe mir kann jemand auf die Sprünge helfen, inzwischen würden mich sogar Lösungen erfreuen.
Vielen Dank im Voraus und schöne Pfingsttage
Tsunami
Zuletzt bearbeitet: