code zu "Sudoku - Löser"
Verfasst: 03.06.2006 23:30
Code: Alles auswählen
#Window_0=0
#OK_Knopf=100
Procedure Eingabefensteroffnen()
If OpenWindow(#Window_0, 240, 66, 523, 439, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Sudoku - Felix - Eingabe der bekannten Werte")
If CreateGadgetList(WindowID())
StringGadget(0, 20, 20, 40, 20, "",#PB_String_Numeric)
StringGadget(1, 70, 20, 40, 20, "",#PB_String_Numeric)
StringGadget(2, 120, 20, 40, 20, "",#PB_String_Numeric)
StringGadget(3, 190, 20, 40, 20, "",#PB_String_Numeric)
StringGadget(4, 240, 20, 40, 20, "",#PB_String_Numeric)
StringGadget(5, 290, 20, 40, 20, "",#PB_String_Numeric)
StringGadget(6, 360, 20, 40, 20, "",#PB_String_Numeric)
StringGadget(7, 410, 20, 40, 20, "",#PB_String_Numeric)
StringGadget(8, 460, 20, 40, 20, "",#PB_String_Numeric)
StringGadget(9, 20, 60, 40, 20, "",#PB_String_Numeric)
StringGadget(10, 70, 60, 40, 20, "",#PB_String_Numeric)
StringGadget(11, 120, 60, 40, 20, "",#PB_String_Numeric)
StringGadget(12, 190, 60, 40, 20, "",#PB_String_Numeric)
StringGadget(13, 240, 60, 40, 20, "",#PB_String_Numeric)
StringGadget(14, 290, 60, 40, 20, "",#PB_String_Numeric)
StringGadget(15, 360, 60, 40, 20, "",#PB_String_Numeric)
StringGadget(16, 410, 60, 40, 20, "",#PB_String_Numeric)
StringGadget(17, 460, 60, 40, 20, "",#PB_String_Numeric)
StringGadget(18, 20, 100, 40, 20, "",#PB_String_Numeric)
StringGadget(19, 70, 100, 40, 20, "",#PB_String_Numeric)
StringGadget(20, 120, 100, 40, 20, "",#PB_String_Numeric)
StringGadget(21, 190, 100, 40, 20, "",#PB_String_Numeric)
StringGadget(22, 240, 100, 40, 20, "",#PB_String_Numeric)
StringGadget(23, 290, 100, 40, 20, "",#PB_String_Numeric)
StringGadget(24, 360, 100, 40, 20, "",#PB_String_Numeric)
StringGadget(25, 410, 100, 40, 20, "",#PB_String_Numeric)
StringGadget(26, 460, 100, 40, 20, "",#PB_String_Numeric)
StringGadget(27, 20, 150, 40, 20, "",#PB_String_Numeric)
StringGadget(28, 70, 150, 40, 20, "",#PB_String_Numeric)
StringGadget(29, 120, 150, 40, 20, "",#PB_String_Numeric)
StringGadget(30, 190, 150, 40, 20, "",#PB_String_Numeric)
StringGadget(31, 240, 150, 40, 20, "",#PB_String_Numeric)
StringGadget(32, 290, 150, 40, 20, "",#PB_String_Numeric)
StringGadget(33, 360, 150, 40, 20, "",#PB_String_Numeric)
StringGadget(34, 410, 150, 40, 20, "",#PB_String_Numeric)
StringGadget(35, 460, 150, 40, 20, "",#PB_String_Numeric)
StringGadget(36, 20, 190, 40, 20, "",#PB_String_Numeric)
StringGadget(37, 70, 190, 40, 20, "",#PB_String_Numeric)
StringGadget(38, 120, 190, 40, 20, "",#PB_String_Numeric)
StringGadget(39, 190, 190, 40, 20, "",#PB_String_Numeric)
StringGadget(40, 240, 190, 40, 20, "",#PB_String_Numeric)
StringGadget(41, 290, 190, 40, 20, "",#PB_String_Numeric)
StringGadget(42, 360, 190, 40, 20, "",#PB_String_Numeric)
StringGadget(43, 410, 190, 40, 20, "",#PB_String_Numeric)
StringGadget(44, 460, 190, 40, 20, "",#PB_String_Numeric)
StringGadget(45, 20, 230, 40, 20, "",#PB_String_Numeric)
StringGadget(46, 70, 230, 40, 20, "",#PB_String_Numeric)
StringGadget(47, 120, 230, 40, 20, "",#PB_String_Numeric)
StringGadget(48, 190, 230, 40, 20, "",#PB_String_Numeric)
StringGadget(49, 240, 230, 40, 20, "",#PB_String_Numeric)
StringGadget(50, 290, 230, 40, 20, "",#PB_String_Numeric)
StringGadget(51, 360, 230, 40, 20, "",#PB_String_Numeric)
StringGadget(52, 410, 230, 40, 20, "",#PB_String_Numeric)
StringGadget(53, 460, 230, 40, 20, "",#PB_String_Numeric)
StringGadget(54, 20, 280, 40, 20, "",#PB_String_Numeric)
StringGadget(55, 70, 280, 40, 20, "",#PB_String_Numeric)
StringGadget(56, 120, 280, 40, 20, "",#PB_String_Numeric)
StringGadget(57, 190, 280, 40, 20, "",#PB_String_Numeric)
StringGadget(58, 240, 280, 40, 20, "",#PB_String_Numeric)
StringGadget(59, 290, 280, 40, 20, "",#PB_String_Numeric)
StringGadget(60, 360, 280, 40, 20, "",#PB_String_Numeric)
StringGadget(61, 410, 280, 40, 20, "",#PB_String_Numeric)
StringGadget(62, 460, 280, 40, 20, "",#PB_String_Numeric)
StringGadget(63, 20, 320, 40, 20, "",#PB_String_Numeric)
StringGadget(64, 70, 320, 40, 20, "",#PB_String_Numeric)
StringGadget(65, 120, 320, 40, 20, "",#PB_String_Numeric)
StringGadget(66, 190, 320, 40, 20, "",#PB_String_Numeric)
StringGadget(67, 240, 320, 40, 20, "",#PB_String_Numeric)
StringGadget(68, 290, 320, 40, 20, "",#PB_String_Numeric)
StringGadget(69, 360, 320, 40, 20, "",#PB_String_Numeric)
StringGadget(70, 410, 320, 40, 20, "",#PB_String_Numeric)
StringGadget(71, 460, 320, 40, 20, "",#PB_String_Numeric)
StringGadget(72, 20, 360, 40, 20, "",#PB_String_Numeric)
StringGadget(73, 70, 360, 40, 20, "",#PB_String_Numeric)
StringGadget(74, 120, 360, 40, 20, "",#PB_String_Numeric)
StringGadget(75, 190, 360, 40, 20, "",#PB_String_Numeric)
StringGadget(76, 240, 360, 40, 20, "",#PB_String_Numeric)
StringGadget(77, 290, 360, 40, 20, "",#PB_String_Numeric)
StringGadget(78, 360, 360, 40, 20, "",#PB_String_Numeric)
StringGadget(79, 410, 360, 40, 20, "",#PB_String_Numeric)
StringGadget(80, 460, 360, 40, 20, "",#PB_String_Numeric)
ButtonGadget(#OK_Knopf, 20, 400, 480, 20, "OK")
EndIf
EndIf
EndProcedure
Dim Feld(9,9)
Procedure check(x,y,wert) ; Gibt 1 aus , wenn auf Feld x/y der angegebene wert stehen darf, sonst 0.
For xx=1 To 9
If Feld(xx,y)<>wert
horizontalok=1
Else
If xx<>x
horizontalok=0
Break
EndIf
EndIf
Next xx
For yy=1 To 9
If Feld(x,yy)<>wert
vertikalok=1
Else
If yy<>y
vertikalok=0
Break
EndIf
EndIf
Next yy
kastenok=0
If x=1 Or x=4 Or x=7
If y=1 Or y=4 Or y=7
If Feld(x+1,y+1)<>wert And Feld(x+1,y+2)<>wert And Feld(x+2,y+1)<>wert And Feld(x+2,y+2)<>wert
kastenok=1
EndIf
EndIf
If y=2 Or y=5 Or y=8
If Feld(x+1,y-1)<>wert And Feld(x+1,y+1)<>wert And Feld(x+2,y-1)<>wert And Feld(x+2,y+1)<>wert
kastenok=1
EndIf
EndIf
If y=3 Or y=6 Or y=9
If Feld(x+1,y-1)<>wert And Feld(x+1,y-2)<>wert And Feld(x+2,y-1)<>wert And Feld(x+2,y-2)<>wert
kastenok=1
EndIf
EndIf
EndIf
If x=2 Or x=5 Or x=8
If y=1 Or y=4 Or y=7
If Feld(x+1,y+1)<>wert And Feld(x+1,y+2)<>wert And Feld(x-1,y+1)<>wert And Feld(x-1,y+2)<>wert
kastenok=1
EndIf
EndIf
If y=2 Or y=5 Or y=8
If Feld(x+1,y-1)<>wert And Feld(x+1,y+1)<>wert And Feld(x-1,y-1)<>wert And Feld(x-1,y+1)<>wert
kastenok=1
EndIf
EndIf
If y=3 Or y=6 Or y=9
If Feld(x+1,y-1)<>wert And Feld(x+1,y-2)<>wert And Feld(x-1,y-1)<>wert And Feld(x-1,y-2)<>wert
kastenok=1
EndIf
EndIf
EndIf
If x=3 Or x=6 Or x=9
If y=1 Or y=4 Or y=7
If Feld(x-1,y+1)<>wert And Feld(x-1,y+2)<>wert And Feld(x-2,y+1)<>wert And Feld(x-2,y+2)<>wert
kastenok=1
EndIf
EndIf
If y=2 Or y=5 Or y=8
If Feld(x-1,y-1)<>wert And Feld(x-1,y+1)<>wert And Feld(x-2,y-1)<>wert And Feld(x-2,y+1)<>wert
kastenok=1
EndIf
EndIf
If y=3 Or y=6 Or y=9
If Feld(x-1,y-1)<>wert And Feld(x-1,y-2)<>wert And Feld(x-2,y-1)<>wert And Feld(x-2,y-2)<>wert
kastenok=1
EndIf
EndIf
EndIf
If horizontalok=1 And vertikalok=1 And kastenok=1
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure xbei(zahl)
ProcedureReturn zahl%9
EndProcedure
Procedure ybei(zahl)
ProcedureReturn zahl/9+1
EndProcedure
;##############################################################################################
;##############################################################################################
Eingabefensteroffnen()
Repeat ; Fensterschleife
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadgetID()
Case #OK_Knopf
Gosub rechnung
EndSelect
EndSelect
ForEver
End
;##############################################################################################
;##############################################################################################
rechnung:
;- Werte einlesen
Dim Feld(9,9) ;nochmal alles erst löschen
nr=0
For y= 1 To 9
For x= 1 To 9
Feld(x,y)=Val(GetGadgetText(nr))
nr+1
Next x
Next y
;- neue Werte rausfinden
pruefeld=1
While prueffeld<82
Repeat
If Feld(xbei(prueffeld)-zurueck,ybei(prueffeld)-zurueck)=0
For w = zurueck+1 To 9
If check(xbei(prueffeld)-zurueck,ybei(prueffeld)-zurueck,w)
Feld(xbei(prueffeld)-zurueck,ybei(prueffeld)-zurueck)=w
EndIf
Next w
Else
Break
EndIf
zurueck+1
Until prueffeld-zurueck=1
prueffeld+1
Wend
;-werte auslesen
nr=0
For y= 1 To 9
For x= 1 To 9
SetGadgetText(nr,Str(Feld(x,y)))
nr+1
Next x
Next y
Return