Java Reversi-Spielbrett-Repräsentation

AwesomeSauce

Lt. Junior Grade
Registriert
Juli 2009
Beiträge
396
Hallo alle zusammen,

Ohne gross um den Brei herumzureden, komme ich gleich zur Sache:

Unsere Aufgabe ist es, eine KI für das Spiel Reversi (Othello) mittels eines Spielbaums zu schreiben. Dazu brauchen wir eine effiziente Repräsentation des Spielbretts, welches 8x8 Felder gross ist.

Hierzu einfach ein mehrdimensionales Array zu verwenden, wäre zwar die simpleste und komfortabelste Lösung, jedoch sehr ineffizient. Die Maschine, auf der das Spiel dann gegen unsere Gegner antreten soll, stellt uns nur 128MB (die wir jedoch voll verwenden können) Ram zur Verfügung:rolleyes:.

Pro Feld können drei Zustände angenommen werden (nicht besetzt, von Spieler 1 besetzt, von Spieler 2 besetzt). Wir haben uns daher überlegt, dass wir hierfür zwei Longs benutzen könnten. Im einen Long wird jeweils gespeichert, ob das Feld besetzt ist oder nicht, im anderen Long wird gespeichert, von welchem Spieler das Feld besetzt ist.

Jedoch ist uns nicht ganz ersichtlich, wie wir die Longs aus dem Spielbrett heraus erstellen sollen, oder bei gegebenen Longs wieder einzelne Felder herauslesen können. Bit-weise wäre es ja kein grosses Problem, jedes Bit entspricht ja dem Zustand eines Feldes.

Vielleicht hat ja jemand von euch die zündende Idee:)
 
Was willst du jetzt mit deinen sogenannten Longs aussagen. Meinst du damit das Speichern von numerischen Werte? Wenn ja:

1. Benutzt du das Wort zu oft
2. Seid ihr wohl noch nicht soweit gekommen

Was hälst du von einer Inspiration von den massig Javaumsetzungen von Reversi?
Bsp.: http://www.bluering.nl/reversi/reversi.java

Desweiteren:
8x8 mehrdimensionales array ineffizient? hmmm...
 
Zuletzt bearbeitet:
3 Zustände pro Feld wären etwas weniger als 2 Bits, bei 64 Feldern 128 bits.
Also einen linearen Speicherbereich von 16 Bytes holen und da passt alles rein.

Wo genau ist das Problem?

€: Wenn man den einen der vier Zustände in 2 Bits nicht verschwendet, kann
man das Spielfeld sogar in 102 Bits (etwa 13 Bytes) speichern. Dann wird es
aber wohl etwas komplizierter :L
 
Zuletzt bearbeitet:
Vielen Dank auf jeden Fall für die Hilfe:daumen:

Habe das Problem jetzt gelöst:
Code:
private boolean getBitAtX(long number, int x)
{
	return (number & (1L << x)) != 0;
}
	
private long setBitAtX(long number, int x, boolean val)
{
	if (val) {
		return (number | (1L << x));
	}
	return (number & ~(1L << x));
}

@ecsil
Damit war natürlich der Datentyp Long gemeint...
 
Zuletzt bearbeitet:
Zurück
Oben