Seite 3 von 4

Verfasst: 25.05.2007 23:27
von AND51
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.

Verfasst: 26.05.2007 11:04
von GreyEnt
Warum nimmst du nicht das SpinGadget()? Das hat 3 Vorteile!
@AND51
das versuch ich mal.
Ich hatte das Progrämmchen eigentlich schon beiseite gelegt.
Aber warum nicht. Danke Dir.

Dieter

Verfasst: 26.05.2007 14:26
von AND51
Jau, kein Problem. :allright:

Verfasst: 27.05.2007 14:26
von GreyEnt
soll ich es denn mal in PureBoard reinstellen wenn es schön geworden ist?

Verfasst: 27.05.2007 15:15
von Xaby
Na aber auf jeden Fall.

Ein Sodoku-Schummler :D

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.

:allright:

Verfasst: 27.05.2007 18:30
von GreyEnt
@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ß. :)

Verfasst: 27.05.2007 19:20
von AND51
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.

Verfasst: 27.05.2007 20:13
von Andreas_S
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.

Verfasst: 27.05.2007 20:43
von AND51
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.

Verfasst: 28.05.2007 02:34
von milan1612
Hallo zusammen,
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
Habs nicht wirklich getestet, also keine Garantie :allright: