Soudokou
Publié : jeu. 19/janv./2006 15:04
Voilà mon premier programme en Pure basic. Il s'appelle Soudokou. Il trouve la solution (Pas toujours) des grilles qui sont dans la section Data. J'ai inséré en ligne 340 un délai entre les étapes pour suivre le travail.
Je sais, il faudrait intégrer une saisie des numéros initiaux. Je pourrais aussi ajouter un module de génération automatique de grille. Il faudrait surtout améliorer le moteur pour qu'il trouve toujours une ou plusieurs solutions.
Je demande votre indulgence. J'accepte toutes les remarques, toutes les critiques, toutes les propositions. J'ai conscience que mon code souffre de faiblesses. J'ai des mauvaises habitudes. Je maîtrise mal la structure du Pure Basic. C'est surtout dans ce domaine que j'espère des corrections. Si par ailleurs ma pure-prose peut vous donner des idées, tant mieux.
Dommage que le Figaro ait arrêté de doter sa grille diabolique d'un prix de 500€... Nous aurions pu faire des choux gras...
Je sais, il faudrait intégrer une saisie des numéros initiaux. Je pourrais aussi ajouter un module de génération automatique de grille. Il faudrait surtout améliorer le moteur pour qu'il trouve toujours une ou plusieurs solutions.
Je demande votre indulgence. J'accepte toutes les remarques, toutes les critiques, toutes les propositions. J'ai conscience que mon code souffre de faiblesses. J'ai des mauvaises habitudes. Je maîtrise mal la structure du Pure Basic. C'est surtout dans ce domaine que j'espère des corrections. Si par ailleurs ma pure-prose peut vous donner des idées, tant mieux.
Code : Tout sélectionner
Gosub Principale : End
Principale: ;(
Titre$ = "Soudokou Pure Basic"
Fenetre1= OpenWindow(#PB_Any,0,0,1016,740,$00CF0001,Titre$)
Menu1 = CreateMenu(#PB_Any, WindowID(Fenetre1))
Gadget1 = CreateGadgetList(WindowID(Fenetre1))
InitSprite() : InitKeyboard() : OpenScreen(1000,724,24,"oui")
If Fenetre1 And Menu1 And Gadget1
MenuTitle("Fichier")
MenuItem( 0, "Jeu 01")
MenuItem( 1, "Jeu 02")
MenuItem( 2, "Jeu 03")
MenuItem( 3, "Jeu 04")
MenuItem( 4, "Jeu 05")
MenuItem( 5, "Jeu 06")
MenuItem( 6, "Jeu 07")
MenuItem( 7, "Jeu 08")
MenuBar()
MenuItem( 9, "Quitte")
MenuTitle("Fenetres")
MenuTitle("Commandes")
MenuItem(10, "1 étape")
MenuItem(11, "Solution")
MenuItem(12, "Teste")
Chemin$ = "F:\Clef USB\Pure Basic\"
UseJPEGImageDecoder()
;LoadImage(1, "Data\11.jpeg")
;Icone0 = LoadImage(2,"Data\EAK.ico")
Mul.f = 21 : Xg = 0 : Yg = 0 : Rg = 0 : Ai.b = 0
CouleurCadre = RGB(128, 64, 64)
CouleurRouge = RGB(164, 90, 70)
LoadFont (0, "Comic Sans MS", Mul * 1.5)
LoadFont (1, "Comic Sans MS", Mul * 0.6)
StartDrawing(WindowOutput())
Restore Jeu04
Gosub Quadrillage
Gosub Tableaux
Gosub Nombres
Gosub Candidats
Gosub Boucle
EndIf
Return
Boucle: ;(
Repeat
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape) = 1 : Sortie = 1 : EndIf
Evenement = WaitWindowEvent()
If Evenement = #PB_Event_Gadget
If IsGadget(0)
Select EventGadgetID()
Case 0
Default
EndSelect
EndIf
EndIf
Select Evenement
Case #PB_Event_Menu : Gadget = EventMenuID()-9
Select EventMenuID()
Case 00 : Restore Jeu00 : Gosub Quadrillage : Gosub Nombres : Gosub Candidats
Case 01 : Restore Jeu01 : Gosub Quadrillage : Gosub Nombres : Gosub Candidats
Case 02 : Restore Jeu02 : Gosub Quadrillage : Gosub Nombres : Gosub Candidats
Case 03 : Restore Jeu03 : Gosub Quadrillage : Gosub Nombres : Gosub Candidats
Case 04 : Restore Jeu04 : Gosub Quadrillage : Gosub Nombres : Gosub Candidats
Case 05 : Restore Jeu05 : Gosub Quadrillage : Gosub Nombres : Gosub Candidats
Case 06 : Restore Jeu06 : Gosub Quadrillage : Gosub Nombres : Gosub Candidats
Case 07 : Restore Jeu07 : Gosub Quadrillage : Gosub Nombres : Gosub Candidats
Case 09 : Sortie = 1
Case 10 : Passage = 1 : Gosub Solution
Case 11 : Repeat : Passage = 1 : Gosub solution : Until Passage = 1
Case 12 : Nom$ = "Irina & Marc " : adresse = @Nom$ : Texte$ = PeekS(adresse, 11)
UseFont(1) : DrawingFont(FontID())
Locate(Mul * 33, 0) : DrawText(Nom$ + Str(adresse))
Locate(Mul * 33, 16) : DrawText(Texte$)
Default
EndSelect
Case #PB_Event_CloseWindow : Sortie = 1 ; Until Asc(A$) = 27 Or A$ = "q"
EndSelect
Until Sortie = 1
Return
Quadrillage: ;(
DrawingMode (%0001) : Xg = 3 : Yg = 3
Box (Mul * Xg, Mul * Yg, Mul * 27 , Mul * 27, RGB(148, 168, 202))
For Ai = 3 To 30 Step 3
Line (Mul * Ai, Mul * Yg, 0, Mul * 27, CouleurCadre)
Line (Mul * Xg, Mul * Ai, Mul * 27, 0, CouleurCadre)
Next Ai
For Ai = 3 To 30 Step 9
Line (Mul * Ai - 1, Mul * Yg - 1, 0, Mul * 27 + 2, CouleurCadre)
Line (Mul * Ai + 1, Mul * Yg - 1, 0, Mul * 27 + 2, CouleurCadre)
Line (Mul * Xg - 1, Mul * Ai - 1, Mul * 27 + 2, 0, CouleurCadre)
Line (Mul * Xg - 1, Mul * Ai + 1, Mul * 27 + 2, 0, CouleurCadre)
Next Ai
DrawingMode (%0101)
For Xg = 33 To 41 Step 3 : For Yg = 12 To 20 Step 3
Box (Mul * Xg + 1, Mul * Yg + 1, Mul * 3 - 1, Mul * 3 - 1, CouleurCadre)
Box (Mul * Xg , Mul * Yg , Mul * 3 + 1, Mul * 3 + 1, CouleurCadre)
Box (Mul * Xg - 1, Mul * Yg - 1, Mul * 3 + 3, Mul * 3 + 3, CouleurCadre)
Next Yg : Next Xg
UseFont(0) : DrawingFont(FontID())
Locate(Mul * 12, 0) : FrontColor(128, 64, 64) : DrawText("Soudokou")
Return
Tableaux: ;(
Dim Nom(9, 9) : Dim Lig(9, 9) : Dim Col(9, 9)
Dim Reg(9, 9) : Dim Can(9, 9, 9) : Dim Pla(9, 9)
Return
Nombres: ;(
For Yg = 1 To 9 : For Xg = 1 To 9 : Nom(Xg, Yg) = 0 : Next Xg : Next Yg ;Arrayfill Nom() = 0
UseFont(0) : DrawingFont(FontID()) : FrontColor(128, 32, 128) : Chiffres = 0
For Yg = 1 To 9 : For Xg = 1 To 9 : Read Ai
If Ai <> 0
Nom(Xg, Yg) = Ai : Chiffres = Chiffres + 1
Locate(Mul * (Xg * 3 + 11/12), Mul * (Yg * 3 + 1/12)) : DrawText(Str(Ai))
EndIf
Next Xg : Next Yg
DrawingMode (%0001) : Box (Mul * 24, 0, Mul * 3, Mul * 3 - 1, RGB(198, 198, 198))
DrawingMode (%0001) : Box (Mul * 33, 0, Mul * 10, Mul * 3 - 1, RGB(198, 198, 198))
FrontColor(128, 64, 64) : Locate(Mul * (24 + 3/12), 0) : DrawText(Str(Chiffres))
Etapes = 0
Return
DataSection ;(
Jeu00: ; 23 nombres 04 passages coince
Data.b 0,0,0,0,0,0,3,0,0
Data.b 0,0,0,9,0,0,0,7,0
Data.b 0,0,9,0,5,0,0,8,1
Data.b 4,1,0,0,0,6,0,0,0
Data.b 0,6,0,0,7,0,0,2,0
Data.b 0,0,0,2,0,0,0,5,4
Data.b 1,4,0,0,3,0,2,0,0
Data.b 0,8,0,0,0,2,0,0,0
Data.b 0,0,5,0,0,0,0,0,0
Jeu01: ; 27 nombres 07 passages
Data.b 0,0,4,5,7,3,1,6,0
Data.b 0,0,0,0,0,0,0,2,0
Data.b 7,0,0,8,0,0,0,0,0
Data.b 9,2,0,0,0,0,7,0,0
Data.b 0,0,0,3,4,9,0,0,0
Data.b 0,0,1,0,0,0,0,5,6
Data.b 0,0,0,0,0,7,0,0,8
Data.b 0,1,0,0,0,0,0,0,0
Data.b 0,3,9,6,5,1,4,0,0
Jeu02: ; 26 nombres 09 passages gagnant
Data.b 0,3,6,0,0,0,7,4,0
Data.b 0,0,0,6,0,5,0,0,0
Data.b 2,0,0,0,0,0,0,0,9
Data.b 7,0,5,0,0,0,2,0,1
Data.b 0,0,0,2,0,9,0,0,0
Data.b 9,0,2,0,0,0,4,0,3
Data.b 3,0,0,0,0,0,0,0,2
Data.b 0,0,0,9,0,8,0,0,0
Data.b 0,7,1,0,0,0,9,5,0
Jeu03: ; 24 nombres 10 passages
Data.b 0,0,1,9,0,5,0,0,0
Data.b 0,9,0,2,0,0,6,8,0
Data.b 0,0,0,0,0,0,0,4,9
Data.b 0,0,0,0,4,0,5,0,1
Data.b 0,0,0,0,0,0,0,0,0
Data.b 7,0,8,0,5,0,0,0,0
Data.b 5,6,0,0,0,0,0,0,0
Data.b 0,4,3,0,0,8,0,7,0
Data.b 0,0,0,1,0,6,4,0,0
Jeu04: ; 23 nombres 12 passages
Data.b 0,0,1,9,0,5,0,0,0
Data.b 0,9,0,2,0,0,6,8,0
Data.b 0,0,0,0,0,0,0,4,0
Data.b 0,0,0,0,4,0,5,0,1
Data.b 0,0,0,0,0,0,0,0,0
Data.b 7,0,8,0,5,0,0,0,0
Data.b 5,6,0,0,0,0,0,0,0
Data.b 0,4,3,0,0,8,0,7,0
Data.b 0,0,0,1,0,6,4,0,0
Jeu05: ; 32 nombres 05 passages
Data.b 9,0,0,0,7,0,0,0,6
Data.b 1,0,0,9,0,8,0,0,5
Data.b 0,0,3,0,6,0,1,0,0
Data.b 0,7,0,6,8,1,0,2,0
Data.b 0,0,5,0,0,0,6,0,0
Data.b 0,1,0,5,9,2,0,3,0
Data.b 0,0,7,0,5,0,9,0,0
Data.b 6,0,0,2,0,9,0,0,3
Data.b 5,0,0,0,4,0,0,0,8
Jeu06: ; 24 nombres 10 passages
Data.b 0,0,8,0,0,0,0,1,3
Data.b 0,0,0,6,0,0,5,0,0
Data.b 1,0,7,0,9,0,0,0,0
Data.b 0,5,0,0,0,3,0,6,9
Data.b 0,0,0,0,0,0,0,0,0
Data.b 3,2,0,4,0,0,0,7,0
Data.b 0,0,0,0,5,0,8,0,4
Data.b 0,0,5,0,0,6,0,0,0
Data.b 8,4,0,0,0,0,6,0,0
Jeu07: ; 24 nombres 03 passages coince
Data.b 0,0,0,0,0,9,0,0,0
Data.b 0,3,0,0,1,0,0,0,6
Data.b 0,9,0,2,8,0,4,0,0
Data.b 0,5,9,0,0,6,0,0,3
Data.b 0,0,0,0,0,0,0,0,0
Data.b 8,0,0,7,0,0,9,4,0
Data.b 0,0,4,0,2,5,0,3,0
Data.b 2,0,0,0,7,0,0,5,0
Data.b 0,0,0,8,0,0,0,0,0
EndDataSection ;)
Candidats: ;(
UseFont(1) : DrawingFont(FontID()) : FrontColor( 32, 96, 32) : DrawingMode (%0011)
For Yg = 1 To 9 : For Xg = 1 To 9
Lig(Xg, Yg) = 0 : Col(Xg, Yg) = 0 : Reg(Xg, Yg) = 0
Next Xg : Next Yg
For Yg = 1 To 9 : For Xg = 1 To 9 : For Rg = 1 To 9
Can(Xg, Yg, Rg) = 0
Next Rg : Next Xg : Next Yg
For Xg = 1 To 9 : For Yg = 1 To 9
Rg = 1 + (Xg - 1) / 3 + (Yg - 1) / 3 * 3
Ai = Nom(Xg, Yg)
If Ai <> 0 : Col(Xg, Ai) = 1 : Lig(Yg, Ai) = 1 : Reg(Rg, Ai) = 1 : EndIf
Next Yg : Next Xg
For Xg = 1 To 9 : For Yg = 1 To 9
Rg = 1 + (Xg - 1) / 3 + (Yg - 1) / 3 * 3
If Nom (Xg, Yg) = 0
Box(Mul * Xg * 3 + 2, Mul * Yg * 3 + 2, Mul * 3 - 3, Mul * 3 - 3, RGB(188, 168, 202))
For Ai = 1 To 9
If Col(Xg, Ai) = 0 And Lig(Yg, Ai) = 0 And Reg(Rg, Ai) = 0
Can(Xg, Yg, Ai) = 1 : Xi = (Ai - 1) % 3 : Yi = (Ai - 1) / 3
Locate(Mul * (Xg * 3 + Xi + 4/12 ), Mul * (Yg * 3 + Yi - 1/12)) : DrawText(Str(Ai))
EndIf
Next Ai
EndIf
Next Yg : Next Xg
For Yg = 1 To 9 : For Xg = 1 To 9
Lig(Xg, Yg) = 0 : Col(Xg, Yg) = 0 : Reg(Xg, Yg) = 0 : Pla(Xg, Yg) = 0
Next Xg : Next Yg
For Yg = 1 To 9
Box(Mul * 30 + 2, Mul * Yg * 3 + 2, Mul * 3 - 3, Mul * 3 - 3, RGB(148, 198, 202))
For Ai = 1 To 9
For Xg = 1 To 9
If Can(Xg, Yg, Ai) = 1 : Lig(Yg, Ai) = Lig(Yg, Ai) + 1 : EndIf
Next Xg
Xi = (Ai - 1) % 3 : Yi = (Ai - 1) / 3
If Lig(Yg, Ai) = 1 : FrontColor(224, 64, 64) : EndIf
If Lig(Yg, Ai) = 2 : FrontColor(128, 64, 224) : EndIf
If Lig(Yg, Ai) > 2 : FrontColor(128, 64, 64) : EndIf
If Lig(Yg, Ai) <> 0
Locate (Mul * (30 + Xi + 4/12), Mul * (Yg * 3 + Yi - 1/12)) : DrawText(Str(Lig(Yg, Ai)))
EndIf
Next Ai : Next Yg
For Xg = 1 To 9
Box(Mul * Xg * 3 + 2, Mul * 30 + 2, Mul * 3 - 3, Mul * 3 - 3, RGB(148, 198, 202))
For Ai = 1 To 9
For Yg = 1 To 9
If Can(Xg, Yg, Ai) = 1 : Col(Xg, Ai) = Col(Xg, Ai) + 1 : EndIf
Next Yg
Xi = (Ai - 1) % 3 : Yi = (Ai - 1) / 3
If Col(Xg, Ai) = 1 : FrontColor(224, 64, 64) : EndIf
If Col(Xg, Ai) = 2 : FrontColor(128, 64, 224) : EndIf
If Col(Xg, Ai) > 2 : FrontColor(128, 64, 64) : EndIf
If Col(Xg, Ai) <> 0
Locate (Mul * (Xg * 3 + Xi + 4/12), Mul * (30 + Yi - 1/12)) : DrawText(Str(Col(Xg, Ai)))
EndIf
Next Ai : Next Xg
For Rg = 1 To 9
Xh = (Rg - 1) % 3 : Yh = (Rg - 1) / 3
Box(Mul * (33 + Xh * 3) + 2, Mul * (12 + Yh * 3) + 2, Mul * 3 - 3, Mul * 3 - 3, RGB(148, 198, 202))
For Ai = 1 To 9
For Xg = Xh * 3 + 1 To Xh * 3 + 3
For Yg = Yh * 3 + 1 To Yh * 3 + 3
If Can(Xg, Yg, Ai) = 1 : Reg(Rg, Ai) = Reg(Rg, Ai) + 1 : EndIf
Next Yg
Next Xg
Xi = (Ai - 1) % 3 : Yi = (Ai - 1) / 3
If Reg(Rg, Ai) = 1 : FrontColor(224, 64, 64) : EndIf
If Reg(Rg, Ai) = 2 : FrontColor(128, 64, 224) : EndIf
If Reg(Rg, Ai) > 2 : FrontColor(128, 64, 64) : EndIf
If Reg(Rg, Ai) <> 0
Locate (Mul * (33 + Xh * 3 + Xi + 4/12), Mul * (12 + Yh * 3 + Yi - 1/12)) : DrawText(Str(Reg(Rg, Ai)))
EndIf
Next Ai
Next Rg
DrawingMode (%0111) :
For Xg = 1 To 9 : For Yg = 1 To 9
Rg = 1 + (Xg - 1)/3 + (Yg - 1)/3 * 3
For Ai = 1 To 9
If Can(Xg, Yg, Ai) = 1 : Pla(Xg, Yg) = Pla(Xg, Yg) + 1 : EndIf
Next Ai
For Ai = 1 To 9
If Can(Xg, Yg, Ai) = 1
If Lig(Yg, Ai) = 1 Or Col(Xg, Ai) = 1 Or Reg(Rg, Ai) = 1 Or Pla(Xg, Yg) = 1
Xi = (Ai - 1) % 3 : Yi = (Ai - 1)/3
If Lig(Yg, Ai) = 1 : Line(Mul * (Xg * 3 + Xi) + 2, Mul * (Yg * 3 + Yi + 1/2), Mul * (30 - (Xg * 3 + Xi)), 0, CouleurRouge) : EndIf
If Col(Xg, Ai) = 1 : Line(Mul * (Xg * 3 + Xi + 1/2), Mul * (Yg * 3 + Yi) + 2, 0, Mul * (30 - (Yg * 3 + Yi)), CouleurRouge) : EndIf
If Reg(Rg, Ai) = 1
Box (Mul * (Xg * 3 + Xi) + 2, Mul * (Yg * 3 + Yi) + 2, Mul - 3, Mul - 3, CouleurRouge)
EndIf
FrontColor(255, 240, 240)
Locate(Mul * (Xg * 3 + Xi + 4/12), Mul * (Yg * 3 + Yi - 1/12)) : DrawText(Str(Ai))
EndIf
EndIf
Next Ai
Next Yg : Next Xg
Return
Solution: ;(
DrawingMode (%0111) :
For Xg = 1 To 9 : For Yg = 1 To 9 : For Ai = 1 To 9
If Can(Xg, Yg, Ai) = 1
Xi = (Ai - 1) % 3 : Yi = (Ai - 1)/3
If Lig(Yg, Ai) = 1 : Line(Mul * (Xg * 3 + Xi) + 2, Mul * (Yg * 3 + Yi + 1/2), Mul * (30 - (Xg * 3 + Xi)), 0, RGB(224, 64, 64)) : EndIf
If Col(Xg, Ai) = 1 : Line(Mul * (Xg * 3 + Xi + 1/2), Mul * (Yg * 3 + Yi) + 2, 0, Mul * (30 - (Yg * 3 + Yi)), RGB(224, 64, 64)) : EndIf
EndIf
Next Ai : Next Yg : Next Xg
UseFont(0) : DrawingFont(FontID()) : DrawingMode (%0011)
For Xg = 1 To 9 : For Yg = 1 To 9
Rg = 1 + (Xg - 1) / 3 + (Yg - 1) / 3 * 3
For Ai = 1 To 9
If Can(Xg, Yg, Ai) = 1
If Lig(Yg, Ai) = 1 Or Col(Xg, Ai) = 1 Or Reg(Rg, Ai) = 1 Or Pla(Xg, Yg) = 1
Box(Mul * Xg * 3 + 2, Mul * Yg * 3 + 2, Mul * 3 - 3 , Mul * 3 - 3, RGB(148, 168, 202))
Locate(Mul * (Xg * 3 + 11/12), Mul * (Yg * 3 + 1/12)) : DrawText(Str(Ai))
Nom(Xg, Yg) = Ai : Passage = 0
EndIf
EndIf
Next Ai
Next Yg : Next Xg : Delay(500)
If Passage = 0
Etapes = Etapes + 1
DrawingMode (%0001) : Box (Mul * 33, 0, Mul * 10, Mul * 3 - 1, RGB(198, 198, 198))
UseFont(0) : DrawingFont(FontID()) : FrontColor(128, 64, 128)
Locate(Mul * 33, 0) : DrawText(Str(Etapes) + " étapes")
EndIf
Gosub Candidats
Return