Entwickler-Ecke

Open Source Units - Class TSudoku


Christian V. - So 15.04.07 00:20
Titel: Class TSudoku
Sudoku

Hallo DF - Community

Mir war es heute(mittlerweile gestern :wink:) langweilig, deshalb habe ich beschlossen meinen Sudoku Algorithmus(Es sind sogar 2 :wink:) in ein Objekt zu verwandeln um sie damit leichter benutzbar zu machen und ihn hier zur Verfügung zu stellen.

Die bisherigen Funktionen:

Heuristik
Löst das Sudoku mit Hilfe einer programmierten Logik. Diese Löst schwere Sudoku's von "Die Zeit" in Sekundenbruchteilen.
Backtracking
Falls die Heuristik mal nicht weiter weiss, gibt es noch die Backtracking Methode. Diese Löst jedes Sudoku, bisher aber nur die "erste" Lösung. Diese Methode ist langsamer, das merkt man aber nicht. Selbst ein Sudoku ohne! vorgegebene Zahlen wird in einem Sekundenbruchteil gelöst.

Funktion zum Berechnen weiterer Lösungen folgt.

Anleitung:

  1. Unit USudoku einbinden über uses
  2. Variable vom Typ TSudoku erstellen.
  3. .create methode aufrufen
  4. Werte ins Objekt laden. Dies geschieht per .Setvalue(0,1..81,val) //Wert 0 für leeres Feld!
  5. Gewünschte Lösungsfunktion starten .SolveLogic / .SolveAdvanced
  6. Auf Fehler überprüfen per .ErrorNumber 0=Kein Fehler, 1=Regelverletzung
  7. Falls 1, dann steht Feldnummer die den Fehler verursach hat in ind .ErrorValue
  8. Mit der Funktion GetValue(0,1..81) kann man einen Wert abfragen.
  9. .free


Anmerkungen
Die Funktionen zum Setzen/Abrufen der Werte brauchen als ersten Paramter eine 0, damit auf die erste lösung zugegriffen wird. Ich bin gerade debei eine Funktion hinzuzufügen, die noch weitere Möglichkeiten berechnen kann, und diese in einem anderen Array abspeichert.

Es ist egal ob die Werte Zeile um Zeile, oder Spalte um Spalte ins Objekt geschrieben werden, solange sie in der gleichen Reihenfolge wieder ausgelesen werden.

Funktionsweise




Ich freue mich auf Feedback.

Nicht hauen wegen GOTO's, das ist schneller :D


Jakob Schöttl - So 15.04.07 12:42
Titel: Re: Class TSudoku
user profile iconinvulnerabilis hat folgendes geschrieben:
Werte ins Objekt laden. Dies geschieht per .Setvalue[0,1..81]:=Integer

ist das eine Array-Eigenschaft? Sieht so aus. In Eigenschaften sollten aber normalerweise nicht die Präfix Set oder Get stehen, weil die ja für die (Set-/Get-)Methoden dann davor gestellt werden. Und es sieht ja auch blöd aus, wenn man die Werte abfragt, und da dann steht i := obj.SetValue[0,8];

Das würde ich vllt noch ändern...


Christian V. - So 15.04.07 13:37

Tut mir leid, da habe ich wohl einen kelinen Fehler in meiner anleitung, bei GetValue braucht es 3 Varablen.

SetValue ruft eine Prozedur auf mit drei Variabeln. Die erste ist um das gewünschte Sudoku anzusprechen(Standard ist 0, da hier die erste lösung gespeichert wird, 1 wenn eine 2. Lösung vorhanden ist usw, dieses Feature wird aber noch nicht unterstützt.), der 2. Parameter dient dazu das gewünschte Feld zu bestimmen, der dritte um den gewünschten Wert zu setzen.

Du kannst damit keine Werte abfragen
Um einen Wert abzufragen rufst du die Funktion GetValue auf, die Analog zu SetValue funktioniert. Unterschied ist halt, dass du einen Rückgabewert begkommst, und deshalb auch nur 2 Parameter mitgeben musst.


Jakob Schöttl - So 15.04.07 13:59

Aber die Syntax ist mit Eckigen Klammern [ ] ?
Dann würde ich an deiner Stelle eine Array-Eigenschaft draus machen.
Obwohl ich jetzt ehrlich gesagt gar nicht weiß, ob es überhaupt mehrdimensionale Array-Eigenschaften gibt...


Christian V. - So 15.04.07 14:06

Ja sind natürlich normale () für Parameter. Ich war heute Morgen wohl ein bisschen müde. :D

Danke für dein Aufmerksames lesen der Anleitung. :wink:


Christian V. - So 15.04.07 20:50

Ich habe dann mal die Beschreibung meiner Funktionen ein wenig erweitert.

//Edit: rund 70 hits, erst 2 Downloads und erst ein Benutzer meldet sich weil ihm was an der Anleitung ins Auge gestochen ist? :(


Martok - So 15.04.07 23:01

Christian V. hat folgendes geschrieben:
//Edit: rund 70 hits, erst 2 Downloads und erst ein Benutzer meldet sich weil ihm was an der Anleitung ins Auge gestochen ist? :(

Tjahaha.... wer braucht schon einen Sudoku-Löser?

Das Problem ist ja, dass es davon tausende gibt...hättest du mich nicht 'gezwungen', hätte ich mir den auch nie angeguckt ;)

Wann hast du eigentlich deinen Nick geändert? In der SB steht noch invulnerabilis drin (*EinenBugVermut*)... :roll:


Christian S. - So 15.04.07 23:05

user profile iconMartok hat folgendes geschrieben:
In der SB steht noch invulnerabilis drin (*EinenBugVermut*)... :roll:
Das ist "as desigend". Die Shoutbox braucht die aktuellen Daten nicht, weil die Anzeige eine sehr geringe Halbwertzeit hat. Daher werden die Daten angezeigt, die zum Zeitpunkt des Shouts aktuell waren. Die Daten werden in der SHoutbox-Tabelle gecached.


Christian V. - Mo 16.04.07 13:47

Zitat:
Tjahaha.... wer braucht schon einen Sudoku-Löser?


Ich weiss, das braucht fast niemand. Ich habe es geschrieben da jemand Hilfe mit sienem Sudoku-Programm hatte. :wink:.
Allerdings ist war das auch eine gute Übung für mich, da ich wieder mal seit längerem nichts programmiert habe.