Also ich würde das gesamte Konzept anders angehen
SuDoKu (3x3) besteht ja aus 81 Feldern, welche in (3x9) 27 Blöcken organisiert sind.
Jedes Feld ist dabei immer in 3 Blöcken enthalten ( Reihe, Spalte, Quadrant )
Wenn du beim Aufbau des Spielfeldes diese Strukturen erzeugst, dann wird die Abfrage zum Kinderspiel:
Delphi-Quellcode:
TSuDoKuBlock = class;
TSuDoKuField = class
private
// Liste der Blöcke, zu dem dieses Feld gehört
_Items : array[0..2] of TSuDoKuBlock;
_Value : Integer;
procedure SetValue( aValue : Integer );
public
function CanSetValue( aValue : Integer ) : Boolean; override;
property Value : Integer read _Value write _Value;
end;
TSuDoKuBlock = class( TSuDoKuBase )
private
// Liste der Felder, die in diesen Block gehören
_Items : array[0..8] of TSuDoKuField;
public
function CanSetValue( aValue : Integer ) : Boolean; override;
end;
...
function TSuDoKuBlock.CanSetValue( aValue : Integer ) : Boolean;
var
idx : integer;
begin
Result := True;
if ( Value > 0 ) then
for idx := 0 to 8 do
begin
Result := Result and ( _Items[ idx ].Value <> aValue );
// Wir können aufhören, wenn wir eine Abbruchbedingung gefunden haben
if not Result then
Break;
end;
end;
function TSuDoKuField.CanSetValue( aValue : Integer ) : Boolean;
var
idx : integer;
begin
Result := True;
if ( Value > 0 ) then
for idx := 0 to 2 do
begin
Result := Result and _Items[ idx ].CanSetValue( aValue );
// Wir können aufhören, wenn wir eine Abbruchbedingung gefunden haben
if not Result then
Break;
end;
end;
Jetzt braucht man nur noch das Feld selber fragen und bekommt die passende Antwort:
Delphi-Quellcode:
if SuDoKuGame.Field[ 3, 7 ].CanSetValue( 6 ) then
SuDoKuGame.Field[ 3, 7 ].Value := 6;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)