Hallo Leute,
ich habe mich vor kurzem hier bei euch im Forum angemeldet,
da wir in der Schule nun angefangen haben, einen Sudoku-Generator zu
programmieren und es bei euch dazu ganz interessante Lösungsansätze
gibt.
Nun... Ich wollte sowas lieber selbst versuchen und hab jetzt mal angefang
meinen persönlichen Lösungsansatz zu programmieren.
Ich will allerdings nicht gleich einen fertigen Sudoku-Generator schreiben,
sondern habe jetzt angefangen, ein 9x9 StringGrid mit Zufallszahlen zu füllen.
Das ist ja fürs erste ganz einfach.
Alls nächstes habe ich es soweit geschafft, dass in einer Zeile keine doppelten Zahlen vorkommen.
Jede Zeile wird also mit den Zahlen 1 bis 9 in zufälliger Reihenfolge gefüllt.
Hierauf dachte ich mir, dass das ja auch ganz einfach zu erweitern wäre für die Spalten,
also das in keiner Spalte eine Zahl doppelt vorkommt. Aber weit gefehlt, das Programm will nicht so
wie ich. Begrenze ich die Zeilenanzahl auf beispielsweise 2 bis 4, läufts noch ohne mucken durch.
Sobald es aber das volle 9x9 StringGrid füllen soll, hängt sich das Programm auf, bzw ich
habe 100% CPU Auslastung und nichts tut sich.
Nun kommt ihr an die Reihe. Ich werde hier unter mal meinen Code anhängen und hoffe,
dass ihr mir Tipps oder Anmerkungen geben könnt, was mein Problem ist, wieso es so nicht funktioniert,
und was man eventuell verbessern könnte.
Mir wär dabei am liebsten, wenn man das im Rahmen meiner Delphi-Kenntnisse lassen könnte. Ihr
werdet sehn das ich nur einfache Befehle verwende.
Ich sag schonmal vielen Dank und hoffe das ihr mir helfen könnt, mich ein bischen vom Fleck zu bewegen.
Schönen Gruß, Leo
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 =
class(TForm)
grid: TStringGrid;
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
Zahl:
array[0..8, 0..8]
of integer;
implementation
{$R *.dfm}
function DelArray(): integer;
// Funktion zum löschen des Arrays
var y,x:integer;
begin
for y:=0
to 8
do
begin
for x:=0
to 8
do
begin
Zahl[y,x] := 0;
end;
end;
end;
function CheckZeile(value: integer; Spalte: integer; Zeile: integer): integer;
var i,x,y: integer;
// Funktion überprüft, ob Zahl in
begin // betreffender Zeile schon vorkommt
result := -1;
for i:=0
to 8
do
begin
if Zahl[i,Zeile]=value
then
begin
result:=1;
break;
end;
end;
end;
function CheckSpalte(value: integer; Spalte: integer; Zeile: integer): integer;
var i,x,y: integer;
// Funktion überprüft, ob Zahl in
begin // betreffender Spalte schon vorkommt
result := -1;
for i:=0
to 8
do
begin
if Zahl[Spalte,i]=value
then
begin
result:=1;
break;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
// Hauptprozedur
var spalte,zeile,rdzahl,b,zaehler,summe,left,i:integer;
begin
zaehler := 0;
// Zaehler nullsetzen
DelArray;
// Array löschen
for spalte:=0
to 8
do // spalte 0 bis 8 nacheinander durchgehen
begin
for zeile:=0
to 8
do // in jeder spalte zeile 0 bis 8 durchgehen
begin
summe := 0;
repeat
if spalte = 8
then begin // wenn letzte spalte,
for i:= 0
to 7
do
begin
summe := summe+Zahl[i,Zeile];
// summe der zahlen bisher in zeile
end;
// ausrechnen
left := 45-summe;
rdzahl := left;
// und daraus die letzte fehlende zahl
b := -1;
// bilden
end else
begin // wenn nicht letzte spalte
Randomize;
rdzahl := random(9)+1;
// zufallszahl erzeugen
b := CheckZeile(rdzahl,spalte,zeile);
// überprüfe ob zahl schon in Zeile
if b=-1
then begin b:= CheckSpalte(rdzahl,spalte,zeile);
end;
// wenn das nicht der Fall ist
zaehler := zaehler+1;
// überprüfe pb zahl schon in spalte
Edit1.Text := inttostr(zaehler);
// Zaehler hochzählen und ausgeben
end;
until b=-1;
// wenn b=-1 (Zahl also nicht in spalte oder zeile bisher vorhanden, dann..
Zahl[Spalte,Zeile] := rdzahl;
// erzeugte zufallszahl array zuweisen
Form1.grid.Cells[Spalte,Zeile]:=inttostr(Zahl[Spalte,Zeile]);
// und ausgeben im STringGrid
end;
end;
end;
end.