Thema: Delphi Array Werte vergleichen

Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Array Werte vergleichen

  Alt 15. Nov 2011, 17:20
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;
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)
  Mit Zitat antworten Zitat