Hallo,
bei Bitboard geht es um die Moeglichkeit moeglichst schnell Stellungen auf Sieg zu pruefen.
Insbesondere bei Verwendung bei 4 Gewinnt von 64 Bit Zahlen.
Ich stelle das mal dar:
Bei 4 gewinnt wirft man die Steine spaltenweise in ein Gestell/Spielfeld mit 7 Spalten und 6 Zeilen ein.Damit waere es anschaulich, diese auch so zu speichern.
Auf Bitebene waeren also 7 Byte mit belegten Bits fuer die Zeilen 0..5
Ein Spielfeld haette damit 7 Byte, fuer den Computer optimal sind aber 8 Byte = 64 Bit, also laesst man dieses eine Byte immer auf 0.
Jeder Spieler verwaltet so ein Spielfeld fuer sich mit den nur von ihm belegten Feldern und die Vereinigungsmenge beider ergibt das tatsaechliche Spielfeld oder wird zusaetzlich verwaltet.
Man erstellt alle moeglichen Anordnungen von 4 in einer Reihe als Bitmasken
Spalte 0..3/Zeile = 0 waere dann ( 2 hoch 0 = 1 )
0|0|0|0|1|1|1|1| = 16843009dez = 0x0000000001010101 (hex)
Spalte 0..3/Zeile = 5 waere dann ( 2 hoch 5 = 32 )
0|0|0|0|32|32|32|32| = 538976288dez = 0x0000000020202020
das sind 69??? verschiedene ( horizontal = 6*4,vertikal 3*7, links steigende diagonalen 3*4 und rechts steigende Diagonalen 3*4,forum softgames/developia gibt es scheinbar nicht mehr. TGGC und hamsterofdeath aegerten sich wie so oft...)
Ein Test, ob man gewonnen hat waere also ein Vergleich darauf, ob ein logisches UND mit der Maske, die Maske selbst ergibt.
IF Maske[i] AND MeinSpielfeld = Maske[i] then
gewonnen
Man testet aber nicht mit allen Masken, sondern nur mit denen die fuer das Feld, in das man den letzten Stein geworfen hat, gelten.
Grusz Horst
P.S.
BitTest,BitSet und BitClear gibt es sicher in tausend Varianten.Hier mal pascal.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| const EinsInt64 : Int64 = 1;
function Bittest (TestZahl : int64,Bitnr: integer):boolean;
begin result := TestZahl AND (EinsInt64 shl BitNr) <> 0; end;
procedure BitSet(var TestZahl : int64,Bitnr: integer); begin TestZahl := TestZahl OR (EinsInt64 shl BitNr); end;
procedure BitClear(var TestZahl : int64,Bitnr: integer); begin TestZahl := TestZahl AND NOT(EinsInt64 shl BitNr); end; |