Witam. Ostatnio nie mogąc spać grałem na Nokii w Sudoku i pomyślałem sobie, że mimo że są dostępne w sieci różne gry
napisane w różnych językach - w tym w Delphi, to spróbuje napisać własne. No i utknąłem przy tym jak poprawnie stworzyć
unikalną planszę. To znaczy żeby cyfy od 1 do 9 w 81 polach nie powtarzały się ani w wierszu ani w kolumnie. Pomyślałem
sobie, że jak będę konwertował wylosowaną liczbę na tekst, a później dodawał ją do StringListy (SL_X odpowiedzialnej za
wiersze), a później sprawdzał Pos'em czy wylosowana ponownie liczba jest już w wierszu o zerowym indeksie StringListy.
Jeżeli nie to dodawał bym kolejne kolumny, a po uzyskaniu 9 zapełnionych kolumn czyścił Stringlistę, zwiększał Indeks wierszy
o jeden, a indeks kolumn zerował. No i to działa w wierszach losuje mi unikalne liczby, ale chciałem to samo zrobić dla kolumn,
z tym że jak widać w kodzie, użyłem tablicy 9 stringlist. Jednak kiedy do kodu dodaję (dla Wiesza o indeksie większym od zera):
if (Pos(S, SL_X[0]) = 0)
and (Pos(S, SL_Y[W][0]) = 0) then
To pęrla zamrąża aplikację. Może macie jakieś pomysły na skuteczny algorytm. Prosił bym o jakiś przykładowy kod. I czy w ogóle
mój sposób da prawidłowe rezultaty to znaczy inikalne liczby we wszystkich wierszach i kolumnach (o ile uporam się z tym że
teraz program się zawiesza). A może są jakieś inne sposóby? Googlowałem za źródłami w Delphi, ale znalazłem tylko program,
do rozwiązywania układu, ale z jego źródeł niewiele się dowiedziałem, bo on przy pustej planszy generuje jeden stały układ, a
chyba można takich uzyskać więcej? Z góry dziękuję za wszelkie wskazówki, przykłądowe kody i spsoób poprawienia mojej
merody - o ile w ogóle jest dobra - tak aby można było uzyskać poprawnie wypełnioną planszę do gry w standardowe Sudoku.
Dodam, że użyłem akurat StringList, bo można je łatwo wyświetlić, czego nie umiem ze zbiorami, tablice też mi śie tutaj zbyt
skomplikowane wydały, bo trzeba by było inaczej sprawdzać czy już liczba wylosowana, a tak to tę robotę odwala tutaj Pos().
var
K, W, I : Byte;
S : string;
SL_X : TStringList;
SL_Y : array[0..8] of TStringList;
begin
CzyscSG; // Ustawia tekst wszystkich komórek StringGrid na '':
SL_X := TStringList.Create;
SL_X.Add('');
for I := Low(SL_Y) to High(SL_Y) do
begin
SL_Y[I] := TStringList.Create;
SL_Y[I].Add('');
end;
K := 0;
W := 0;
repeat
S := IntToStr(Random(9) + 1);
if (W = 0) then
begin
if (Pos(S, SL_X[0]) = 0) then
begin
SL_X[0] := SL_X[0] + S;
SG1.Cells[K, W] := S;
SL_Y[K][0] := SL_Y[K][0] + S;
K := K + 1;
end;
end
else
begin
if (Pos(S, SL_X[0]) = 0)
then
begin
SL_X[0] := SL_X[0] + S;
SG1.Cells[K, W] := S;
SL_Y[K][0] := SL_Y[K][0] + S;
K := K + 1;
end;
end;
if K = SG1.ColCount then
begin
K := 0;
W := W + 1;
SL_X[0] := '';
end;
until W = SG1.RowCount;
end;