Das Richtige Gadget für ein Sudoku ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag 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
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Jau, kein Problem. :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag von GreyEnt »

soll ich es denn mal in PureBoard reinstellen wenn es schön geworden ist?
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag 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ß. :)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag 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:
Antworten