Einzelnen Beitrag anzeigen

conran

Registriert seit: 26. Jun 2005
Ort: Hamburg
3 Beiträge
 
Delphi 7 Enterprise
 
#1

Problem mit Sudoku ähnlichem Programm

  Alt 1. Mär 2006, 17:50
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.
leo
  Mit Zitat antworten Zitat