Das Richtige Gadget für ein Sudoku ?
Hey Dieter, ich hab die Idee!!
Warum nimmst du nicht das SpinGadget()? Das hat 3 Vorteile!
1. Man könnte das Spiel komplett mit der Maus spielen, da man ja die 2 Pfeile hat um die Zahlen zu verändern.
2. Du kannst von vornherein begrenzen, dass der Anwender nur die Zahlen 1-9 einsetzen darf, der Benutzer kann also keine Buchstaben oder Zahlenkolonnen hineinschreiben, die du wieder rausfiltern musst!
3. Du kannst die zahl darin mit GetGadgetState() ermitteln und brauchst daher nicht die Kombination Val(GetGadgetText()).
Ich würde an deiner Stelle SpinGadget() nehmen, diese machst du dann in der Schriftart Arial, Größe 20. Diese großen Zahlen sehen dann beinahe wie Images aus. Das heißt, du müsstest dich nicht selbst mit Images herumärgern.
Warum nimmst du nicht das SpinGadget()? Das hat 3 Vorteile!
1. Man könnte das Spiel komplett mit der Maus spielen, da man ja die 2 Pfeile hat um die Zahlen zu verändern.
2. Du kannst von vornherein begrenzen, dass der Anwender nur die Zahlen 1-9 einsetzen darf, der Benutzer kann also keine Buchstaben oder Zahlenkolonnen hineinschreiben, die du wieder rausfiltern musst!
3. Du kannst die zahl darin mit GetGadgetState() ermitteln und brauchst daher nicht die Kombination Val(GetGadgetText()).
Ich würde an deiner Stelle SpinGadget() nehmen, diese machst du dann in der Schriftart Arial, Größe 20. Diese großen Zahlen sehen dann beinahe wie Images aus. Das heißt, du müsstest dich nicht selbst mit Images herumärgern.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
Na aber auf jeden Fall.
Ein Sodoku-Schummler
Auch gern für diese größeren, es gibt ja auch welche,
wo die anordnung irgendwie so ist:
[X]..[X]
.. [X] ..
[X]..[X]
[X] 9x9 Feld. Die Felder überlappen sich an den Rändern.
So dass jeweils eins der 3 x 3 Felder von jedem aus der Ecke gleichzeitig das Feld in der Ecke aus dem Sodoku in der Mitte ist.
Und natürlich selbst Sodokus mit Zufallsgenerator.
Interessant wäre, wie dein Allgorithmus dahinter aussieht.
Ob du es durch einfaches Probieren schaffst, oder ob es wirklich Formeln dafür gibt, wie man mit wenigen Zahlen die anderen ermitteln muss.

Ein Sodoku-Schummler

Auch gern für diese größeren, es gibt ja auch welche,
wo die anordnung irgendwie so ist:
[X]..[X]
.. [X] ..
[X]..[X]
[X] 9x9 Feld. Die Felder überlappen sich an den Rändern.
So dass jeweils eins der 3 x 3 Felder von jedem aus der Ecke gleichzeitig das Feld in der Ecke aus dem Sodoku in der Mitte ist.
Und natürlich selbst Sodokus mit Zufallsgenerator.
Interessant wäre, wie dein Allgorithmus dahinter aussieht.
Ob du es durch einfaches Probieren schaffst, oder ob es wirklich Formeln dafür gibt, wie man mit wenigen Zahlen die anderen ermitteln muss.

Kinder an die Macht http://scratch.mit.edu/
@Xaby
Also bislang kann mein Programm nur 9x9 Felder lösen, wenn es ausreichend
Vorgabezahlen gibt. Es werden quasi alle Felder ausgefüllt die eindeutig bestimmbar sind. Aber die option "Lösung selber finden bei mehrdeutigen Vorgaben" gehört selbstverständlich auch in so ein Programm, nur hab ich noch keinen Ansatz das umzusetzen.
Und natürlich Benutzerdefinierte Feldgrößen, so Groß das der Compi kotzt, ist auch ein muß.
Also bislang kann mein Programm nur 9x9 Felder lösen, wenn es ausreichend
Vorgabezahlen gibt. Es werden quasi alle Felder ausgefüllt die eindeutig bestimmbar sind. Aber die option "Lösung selber finden bei mehrdeutigen Vorgaben" gehört selbstverständlich auch in so ein Programm, nur hab ich noch keinen Ansatz das umzusetzen.
Und natürlich Benutzerdefinierte Feldgrößen, so Groß das der Compi kotzt, ist auch ein muß.

Ich habe mal eine Frage:
Wie löst man ein Sudoku-Rätsel? Es muss doch einen optimalen Algorithmus geben!
Wenn ich persönlich ein Rätsel löse, habe ich natürlich auch so meine Strategie. Aber die kann ich ja schlecht meinem Programm aufzwingen und hoffen, dass es jedes Rätsel löst.
Meine meinung ist, wenn die Zahlen so vorgegeben sind, dass das Rätsel lösbar wird (egal nach wie viel Bedenkzeit), dann kann man mit einem Algorithmus es schaffen.
Dieter, stellst du den Algo mal hier rein oder erklärst du ihn? Das würde brennend interessieren! Hinweis: Wenn du das nicht hier veröffentlichen möchtest, ist es auch OK. Schließlich hat jeder Programmierer das (Urheber-)Recht und ist nicht dazu gezwungen, seinen COde zu veröffentlichen.
Wie löst man ein Sudoku-Rätsel? Es muss doch einen optimalen Algorithmus geben!
Wenn ich persönlich ein Rätsel löse, habe ich natürlich auch so meine Strategie. Aber die kann ich ja schlecht meinem Programm aufzwingen und hoffen, dass es jedes Rätsel löst.
Meine meinung ist, wenn die Zahlen so vorgegeben sind, dass das Rätsel lösbar wird (egal nach wie viel Bedenkzeit), dann kann man mit einem Algorithmus es schaffen.
Dieter, stellst du den Algo mal hier rein oder erklärst du ihn? Das würde brennend interessieren! Hinweis: Wenn du das nicht hier veröffentlichen möchtest, ist es auch OK. Schließlich hat jeder Programmierer das (Urheber-)Recht und ist nicht dazu gezwungen, seinen COde zu veröffentlichen.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
Hier stehen ein paar Lösungsmethoden. Ich weis aber nicht ob das weiterhilft.
//Edit: hier steht auch die Algorithmische-Methode. Dort kann man auch nachsehen wie man eines macht.
//Edit: hier steht auch die Algorithmische-Methode. Dort kann man auch nachsehen wie man eines macht.
Hi!
Danke für den Link. Die Scan MEthode ist die, nach der ich primär arbeite; so würde ich auch mein Programm arbeiten lassen.
Schade nur, das man damit nicht alle Rätsel lösen kann.
Kann mir einer vielleicht nochmal die Buchtracking-Methode erklären? mit der scheint man wirklich alles knacken zu können! Und mir gefällt die Rekursivität dieser Methode.
Danke für den Link. Die Scan MEthode ist die, nach der ich primär arbeite; so würde ich auch mein Programm arbeiten lassen.
Schade nur, das man damit nicht alle Rätsel lösen kann.
Kann mir einer vielleicht nochmal die Buchtracking-Methode erklären? mit der scheint man wirklich alles knacken zu können! Und mir gefällt die Rekursivität dieser Methode.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
Hallo zusammen,
ich hab mal schnell was zusammengezimmert, vielleicht gefällts euch ja.
Habs nicht wirklich getestet, also keine Garantie 
ich hab mal schnell was zusammengezimmert, vielleicht gefällts euch ja.
Code: Alles auswählen
Global Window, Popup
Global Dim Arr.l(80)
Global Index.l = 0
Font = LoadFont(#PB_Any, "Comic Sans MS", 14, 256)
Window = OpenWindow(#PB_Any, 0, 0, 340, 340, "Sudoku", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
If Window
If CreateGadgetList(WindowID(Window))
Index = 0
For y = 0 To 8
For x = 0 To 8
x1 = 10 + (x * 34)
If Index % 9 >= 3 : x1 + 7 : EndIf
If Index % 9 >= 6 : x1 + 7 : EndIf
y1 = 10 + (y * 34)
If Index >= 27 : y1 + 7 : EndIf
If Index >= 54 : y1 + 7 : EndIf
Arr(Index) = TextGadget(#PB_Any, x1, y1, 34, 34, "", #PB_Text_Center | #PB_Text_Border | #SS_NOTIFY)
Index + 1
Next
Next
For i = 0 To 80
SetGadgetFont(Arr(i), FontID(Font))
SetGadgetColor(Arr(i), #PB_Gadget_BackColor, RGB(255,255,225))
SetGadgetColor(Arr(i), #PB_Gadget_FrontColor, RGB(64, 122, 37))
Next
Else
End
EndIf
Else
End
EndIf
Procedure.l DisplayPopup(gadget.l, posx.l, posy.l)
DisableWindow(Window, 1)
Popup = OpenWindow(#PB_Any, WindowX(Window) + posx, WindowY(Window) + posy, 98, 94, "", #PB_Window_BorderLess, WindowID(Window))
SetWindowLong_(WindowID(Popup), #GWL_EXSTYLE, GetWindowLong_(WindowID(Popup), #GWL_EXSTYLE) | #WS_EX_DLGMODALFRAME)
StickyWindow(Popup, 1)
CreateGadgetList(WindowID(Popup))
ButtonGadget(0, 2, 2, 30, 21, "1")
ButtonGadget(1, 34, 2, 30, 21, "2")
ButtonGadget(2, 66, 2, 30, 21, "3")
ButtonGadget(3, 2, 25, 30, 21, "4")
ButtonGadget(4, 34, 25, 30, 21, "5")
ButtonGadget(5, 66, 25, 30, 21, "6")
ButtonGadget(6, 2, 48, 30, 21, "7")
ButtonGadget(7, 34, 48, 30, 21, "8")
ButtonGadget(8, 66, 48, 30, 21, "9")
ButtonGadget(9, 2, 71, 94, 21, "Clear")
x.s = GetGadgetText(gadget)
If x = ""
DisableGadget(9, 1)
Else
For i = 0 To 9
Select GetGadgetText(i)
Case x
DisableGadget(i, 1) : Break
EndSelect
Next
EndIf
retval.l
Repeat
Eve = WaitWindowEvent()
If EventWindow() = Popup
If Eve = #PB_Event_Gadget
Select EventGadget()
Case 0 : retval = 1
Case 1 : retval = 2
Case 2 : retval = 3
Case 3 : retval = 4
Case 4 : retval = 5
Case 5 : retval = 6
Case 6 : retval = 7
Case 7 : retval = 8
Case 8 : retval = 9
Case 9 : retval = 0
EndSelect
Break
EndIf
EndIf
ForEver
CloseWindow(Popup)
DisableWindow(Window, 0)
ProcedureReturn retval
EndProcedure
Repeat
Event = WaitWindowEvent()
If EventWindow() = Window
Select Event
Case #PB_Event_Gadget
gad.l = EventGadget()
Select gad
Case Arr(0) To Arr(80)
x.l = DisplayPopup(gad, GadgetX(gad) + GadgetWidth(gad), GadgetY(gad) + GadgetHeight(gad))
If x = 0
SetGadgetText(gad, "")
Else
SetGadgetText(gad, Str(x))
EndIf
EndSelect
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
