Générateur de grille de Sudoku
Publié : lun. 27/févr./2006 23:44
Bonjour,
Cela fait un petit moment que je ne suis pas venu.
Comme le sudoku est à la mode, je vous propose mon générateur de grille (c'est juste le moteur brut de décoffrage):
Cela fait un petit moment que je ne suis pas venu.
Comme le sudoku est à la mode, je vous propose mon générateur de grille (c'est juste le moteur brut de décoffrage):
Code : Tout sélectionner
;------------------------------------------------------------------
; générateur de grille de sudoku par Cookie (www.creationperso.com)
;------------------------------------------------------------------
;------------------------------------------------------------------
;fonctionnement de l'algorithme:
;le programme travaille ligne par ligne
; à chaque fois qu'il avance, il vérifie qu'il n'y a pas
; d'incompatibilité avec les lignes, les colonnes et les blocs, sinon, il recule
; et recommence
;------------------------------------------------------------------
Global Dim grille.s(10,10)
Procedure Cases (grille,numerol,numeroc) ;teste la case dans sa ligne,sa colonne et son bloc
choix.s = "123456789"
indicel.b
indicec.b
hasard.b
choixfinal.s
numblocl = (numerol - 1)/3
numblocc = (numeroc - 1)/3
For indicec = 1 To numeroc ;
choix = ReplaceString (choix,grille(numerol,indicec),"") ;retire les solutions impossibless
Next
For indicel = 1 To numerol
choix = ReplaceString (choix,grille(indicel,numeroc),"") ;retire les solutions impossibles
Next
For indicel = 1 To 3
For indicec = 1 To 3
choix = ReplaceString (choix,grille(3*numblocl +indicel,3*numblocc +indicec),"") ;retire les solutions impossibles
Next
Next
If choix = ""
ProcedureReturn 0
Else
hasard = Random ( Len(choix)-1 ) + 1
choixfinal = Mid ( choix,hasard,1) ;dans la liste des possibles on en choisit un au hasard
ProcedureReturn Val(choixfinal)
EndIf
EndProcedure
Procedure lignes (grille,numerol) ;création d'une ligne
indice.b
indicec.b
resultat.b
test = 0
While test = 0
test = 1
For indicec=1 To 9
resultat= Cases (grille,numerol,indicec)
If resultat = 0
ProcedureReturn 0
EndIf
grille(numerol,indicec) = Str(resultat)
Next
Wend
ProcedureReturn 1
EndProcedure
Procedure creergrille (grille)
ligne.b
colonne.b
;-mise à 0 de la grille
For ligne = 0 To 9
For colonne = 0 To 9
grille(ligne,colonne) = "0"
Next
Next
;--
; pour chaque ligne on crée la combinaison
For ligne = 1 To 9
If lignes(grille,ligne)=0
For colonne =1 To 9
grille(ligne,colonne)="0" ;si la ligne est impossible, on l'efface
Next
If ligne>1
For colonne=1 To 9
grille(ligne-1,colonne)="0" ; et on efface aussi la précédente
Next
EndIf
ligne=ligne-2 ; et on recommence avec la ligne d'avant
EndIf
Next
EndProcedure
;------------------------------------------------
i.b
j.b
a.s=""
creergrille(grille)
For i=1 To 9
For j=1 To 9
a=a+grille(i,j)
;Debug grille(i,j)
Next
a=a+Chr(13)
Debug a
a=""
Next