Page 1 sur 1

Générateur de grille de Sudoku

Publié : lun. 27/févr./2006 23:44
par cookie
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):

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

Publié : mar. 28/févr./2006 2:05
par Frenchy Pilou
Si tu le couples avec
ce solveur ultra rapide,
http://purebasic.hmt-forum.com/viewtopi ... ght=sudoku

nous on a plus qu'à aller à la pêche :lol:

Publié : mer. 08/mars/2006 14:44
par cookie
Merci :D

J'ai travaillé à partir de mon moteur sur une petite application.

La voici:

http://www.creationperso.com/index.php? ... 22&lang=fr

Publié : mer. 08/mars/2006 16:09
par Frenchy Pilou
Tu fais un CD de tes musiques et tu balances le tout à http://www.jamendo.com/fr/ 8)

Publié : mar. 14/mars/2006 11:48
par cookie
@Frenchy Pilou: merci, je vais voir ce site que je ne connais pas :)

J'ai modifié mon prog. Maintenant on peut jouer sur la grille:
http://www.creationperso.com/index.php? ... 24&lang=fr