Seite 1 von 1

code zu "Sudoku - Löser"

Verfasst: 03.06.2006 23:30
von obbba

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

Verfasst: 04.06.2006 10:41
von nicolaus
Orginal bei obbba

Ich benutze die Demo-Version.

Ich hab da schon mal einen nicht funktionierenden code geschrieben.
Ich war irgendwie gans stolz drauf, aber jetzt verstehe ich ihn selbst nicht mehr so ganz :roll: .

Vieleicht kann mir jemand sagen, wo der Fehler ist, oder er kann den Ansatz (die Proceduren) anders weiterverarbeiten.

Ich habe das mal in diesen thread verschoben da ein thread doch reicht!!!! Nicolaus

Verfasst: 04.06.2006 11:52
von a14xerus
hey.. gibs das auc hfür 4.0 ??

die wichtigsten sachen ha bic hschon geändert, aber der meint:
PureBASIC 4.0 hat geschrieben: feld() is not a function, array, macro or liked list
warscheinlich kommen auch noch mehr fehler

Verfasst: 04.06.2006 21:58
von a14xerus
hat denn keiner eine antwort.. oder übersehen alle dieses thema??

Verfasst: 04.06.2006 22:08
von Kiffi
@a14xerus: Keine Panik! ;-)

Arrays sind ab PB4 nicht mehr global. Ein

Code: Alles auswählen

Global Dim Feld(9,9)
sollte Dein aktuelles Problem lösen.

Grüße ... Kiffi

Verfasst: 05.06.2006 10:31
von sen-me
Kiffi hat geschrieben:@a14xerus: Keine Panik! ;-)

Arrays sind ab PB4 nicht mehr global. Ein

Code: Alles auswählen

Global Dim Feld(9,9)
sollte Dein aktuelles Problem lösen.

Grüße ... Kiffi
Nicht nur Arrays, Linked Lists sind auch nicht mehr Global

Verfasst: 05.06.2006 10:44
von Kaeru Gaman
> Nicht nur Arrays, Linked Lists sind auch nicht mehr Global

ich seh nur keine LL in obbbas code, du etwa? :?

Verfasst: 05.06.2006 11:05
von sen-me
Ich wollt es ja nur sagen, er wird bestimmt auch irgendwann mal ne Linked List benutzen...

Verfasst: 05.06.2006 12:10
von Kaeru Gaman
ok.

sorry für meine biestrige art heut... :roll:

Verfasst: 06.06.2006 18:46
von obbba
Es hat sich geklärt. (xfuer() und yfuer() war falsch)
Wer mein Programm ausprobieren will:

Code: Alles auswählen

OpenConsole()
CloseConsole()

#Window_0=0
#OK_Knopf=100
#Loschen=101

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, 400, 20, "OK")
      ButtonGadget(#Loschen,450,400,50,20,"Löschen")
      
    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)
 tada=zahl%9
 If tada=0 : tada=9 : EndIf
 ProcedureReturn tada
EndProcedure

Procedure ybei(zahl)
 ProcedureReturn Round(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
  Case #Loschen
   For n=0 To 80
    SetGadgetText(n,"")
   Next n 
  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

;-eingegebene Zahlen "feststellen"

Dim Fest(82)

For i = 1 To 81
 If Feld(xbei(i),ybei(i))<>0
  Fest(i)=1
 EndIf
Next i

;- neue Werte rausfinden
act=1
While Fest(act)=1
 act+1
Wend

starttime=ElapsedMilliseconds()
Repeat

 Wvorher=Feld(xbei(act),ybei(act))
 For W = 1+Feld(xbei(act),ybei(act)) To 9
  If check(xbei(act),ybei(act),W)=1
   Feld(xbei(act),ybei(act))=W
   Break
  EndIf
 Next W
 
 If Feld(xbei(act),ybei(act))=Wvorher
  Feld(xbei(act),ybei(act))=0
  act-1
  While Fest(act)=1 ; geht solange nach rechts, bis wieder ein Prüfbares Feld kommt
   act-1
  Wend
 Else
  act+1
  While Fest(act)=1 ; geht solange nach links, bis wieder ein Prüfbares Feld kommt
   act+1
  Wend
 EndIf

If act=0 Or ElapsedMilliseconds()-starttime>5000
 MessageRequester("Sorry","Unlösbar")
 Break
EndIf

If act=82
 MessageRequester("Fertig","Gelöst")
 Break
EndIf

ForEver



;-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