Dein Konzept ist da etwas schwerfällig
Beim SuDoKu hat man ja 9x9 Felder.
Diese Felder bilden wiederum logische Einheiten über die Spalten, die Reihen und jeweils 3x3 Blöcke.
- Jede Spalte hat 9 Felder
- Jede Reihe hat 9 Felder
- Jeder Block hat 9 Felder
Code:
B | 0 1 2 3 4 5 6 7 8 | S | 0 1 2 3 4 5 6 7 8 | R | 0 1 2 3 4 5 6 7 8
--+------------------ | --+------------------ | --+------------------
0 | 0 0 0 1 1 1 2 2 2 | 0 | 0 1 2 3 4 5 6 7 8 | 0 | 0 0 0 0 0 0 0 0 0
1 | 0 0 0 1 1 1 2 2 2 | 1 | 0 1 2 3 4 5 6 7 8 | 1 | 1 1 1 1 1 1 1 1 1
2 | 0 0 0 1 1 1 2 2 2 | 2 | 0 1 2 3 4 5 6 7 8 | 2 | 2 2 2 2 2 2 2 2 2
3 | 3 3 3 4 4 4 5 5 5 | 3 | 0 1 2 3 4 5 6 7 8 | 3 | 3 3 3 3 3 3 3 3 3
4 | 3 3 3 4 4 4 5 5 5 | 4 | 0 1 2 3 4 5 6 7 8 | 4 | 4 4 4 4 4 4 4 4 4
5 | 3 3 3 4 4 4 5 5 5 | 5 | 0 1 2 3 4 5 6 7 8 | 5 | 5 5 5 5 5 5 5 5 5
6 | 6 6 6 7 7 7 8 8 8 | 6 | 0 1 2 3 4 5 6 7 8 | 6 | 6 6 6 6 6 6 6 6 6
7 | 6 6 6 7 7 7 8 8 8 | 7 | 0 1 2 3 4 5 6 7 8 | 7 | 7 7 7 7 7 7 7 7 7
8 | 6 6 6 7 7 7 8 8 8 | 8 | 0 1 2 3 4 5 6 7 8 | 8 | 8 8 8 8 8 8 8 8 8
Erstelle dir eine Klasse (z.B. TSuDoKuBlock), die 9 Spielfelder aufnehmen kann und auch eine Methode (CanHaveNumber( x : integer ) : Boolean), die in diesen 9 Spielfeldern prüft, ob eine Zahl x dort gesetzt werden darf.
Delphi-Quellcode:
function TSuDoKuBlock.CanHaveNumber( x : integer ) : Boolean;
begin
Result := True;
// Alle Felder im Block prüfen, ob diese Zahl schon vorkommt
for FeldIndex := 0 to 8 do
Result := Result and ( fFields[ FeldIndex ].Number <> x );
end;
Ein Spielfeld kann in max. 3 Blöcken gleichzeitig sein.
Erstelle dir eine Klasse (z.B. TSuDoKuFeld), das 3 Blöcke aufnehmen kann.
Diese Klasse bekommt jetzt auch eine Methode (CanHaveNumber(x : Integer) : Boolean) und die macht nichts anderes als
Delphi-Quellcode:
function TSuDoKuFeld.CanHaveNumber( x : integer ) : Boolean;
begin
// Alle 3 Blöcke müssen diese Zahl zulassen
Result := fBlocks[0].CanHaveNumber( x ) and fBlocks[1].CanHaveNumber( x ) and fBlocks[2].CanHaveNumber( x );
end;