Console
Clique sur « Exécuter » pour lancer le programme.
Code CoddyRun
@ Initialisation et Variables
ecran est une toile
dimension(ecran, 450, 540)
grille_sudoku est un tableau
grille_initiale est un tableau
sel_l, sel_c est un nombre
sel_l vaut -1
sel_c vaut -1
appActif, jeuGagne est un booléen
appActif vaut vrai
jeuGagne vaut faux
action, ptX, ptY est un nombre
msg_erreur est un texte
msg_erreur vaut ""
pour lig de 0 à 8
ligne_g est un tableau
pour col de 0 à 8
ligne_g ajoute 0
fin pour
grille_sudoku ajoute ligne_g
fin pour
@ Utilitaires
fonction copierGrille(source)
copie est un tableau
pour l de 0 à 8
ligne_c est un tableau
pour c de 0 à 8
ligne_c ajoute source[l][c]
fin pour
copie ajoute ligne_c
fin pour
retourne copie
fin fonction
fonction verifierGagne(g)
pour l de 0 à 8
pour c de 0 à 8
si g[l][c] = 0 alors
retourne faux
fin si
fin pour
fin pour
retourne vrai
fin fonction
@ Fonctions de résolution et de vérification (Backtracking)
fonction estValide(g, l, c, val)
pour i de 0 à 8
si g[l][i] = val alors
retourne faux
fin si
fin pour
pour i de 0 à 8
si g[i][c] = val alors
retourne faux
fin si
fin pour
debutL est un nombre
debutL vaut arrondi_inferieur(l / 3) * 3
debutC est un nombre
debutC vaut arrondi_inferieur(c / 3) * 3
pour i de 0 à 2
pour j de 0 à 2
si g[debutL + i][debutC + j] = val alors
retourne faux
fin si
fin pour
fin pour
retourne vrai
fin fonction
fonction generer(g)
l, c est un nombre
trouve est un booléen
trouve vaut faux
pour i de 0 à 8
pour j de 0 à 8
si g[i][j] = 0 alors
l vaut i
c vaut j
trouve vaut vrai
arrête
fin si
fin pour
si trouve = vrai alors
arrête
fin si
fin pour
si trouve = faux alors
retourne vrai
fin si
possibles est un tableau
pour n de 1 à 9
possibles ajoute n
fin pour
possibles vaut melanger(possibles)
num est un nombre
valide, suite est un booléen
pour k de 0 à 8
num vaut possibles[k]
valide vaut estValide(g, l, c, num)
si valide = vrai alors
g[l][c] vaut num
suite vaut generer(g)
si suite = vrai alors
retourne vrai
fin si
g[l][c] vaut 0
fin si
fin pour
retourne faux
fin fonction
@ Gestion du puzzle
procédure faireTrous(g, nb)
trous_faits est un nombre
trous_faits vaut 0
l, c est un nombre
tant que trous_faits < nb
l vaut hasard(0, 8)
c vaut hasard(0, 8)
si g[l][c] <> 0 alors
g[l][c] vaut 0
trous_faits ajoute 1
fin si
fin tant que
fin procédure
procédure genererNouvelleGrille()
pour l de 0 à 8
pour c de 0 à 8
grille_sudoku[l][c] vaut 0
fin pour
fin pour
ok est un booléen
ok vaut generer(grille_sudoku)
appelle faireTrous(grille_sudoku, 45)
grille_initiale vaut copierGrille(grille_sudoku)
sel_l vaut -1
sel_c vaut -1
msg_erreur vaut ""
jeuGagne vaut faux
fin procédure
procédure lancerSolveur()
grille_sudoku vaut copierGrille(grille_initiale)
generer(grille_sudoku)
sel_l vaut -1
sel_c vaut -1
msg_erreur vaut ""
jeuGagne vaut vrai
fin procédure
@ Affichage de l'interface
procédure dessinerInterface()
effacer(ecran)
remplir(ecran, #FAFAFA)
// 1. Grille et surbrillance
pour l de 0 à 8
pour c de 0 à 8
x, y est un nombre
x vaut c * 50
y vaut l * 50
si sel_l <> -1 et sel_c <> -1 et l = sel_l et c = sel_c alors
rectangle(ecran, x, y, 50, 50, #BBDEFB)
fin si
val est un nombre
val vaut grille_sudoku[l][c]
si val <> 0 alors
txt est un texte
txt vaut convertir_texte(val)
si grille_initiale[l][c] <> 0 alors
label(ecran, x + 16, y + 35, txt, #1E2430, 24)
sinon
label(ecran, x + 16, y + 35, txt, #1565C0, 24)
fin si
fin si
fin pour
fin pour
// 2. Lignes
epaisseur est un nombre
pour i de 0 à 9
si i mod 3 = 0 alors
epaisseur vaut 3
sinon
epaisseur vaut 1
fin si
ligne(ecran, i * 50, 0, i * 50, 450, #000000, epaisseur)
ligne(ecran, 0, i * 50, 450, i * 50, #000000, epaisseur)
fin pour
// 3. Messages d'état
si jeuGagne alors
label(ecran, 100, 472, "VICTOIRE ! BRAVO, GRILLE COMPLÉTÉE !", #2E7D32, 12)
sinon si msg_erreur <> "" alors
label(ecran, 20, 472, msg_erreur, #D32F2F, 12)
sinon si sel_l <> -1 et sel_c <> -1 alors
label(ecran, 70, 472, "Touche [1 à 9] pour remplir, [0] pour effacer", #1565C0, 12)
sinon
label(ecran, 90, 472, "Clique sur une case vide pour la sélectionner", #757575, 12)
fin si
// 4. Boutons d'action
rectangle_arrondi(ecran, 20, 490, 200, 35, 6, #1976D2)
label(ecran, 45, 513, "NOUVELLE GRILLE", #FFFFFF, 13)
rectangle_arrondi(ecran, 230, 490, 200, 35, 6, #4CAF50)
label(ecran, 285, 513, "RÉSOUDRE", #FFFFFF, 13)
fin procédure
@ Logique d'interaction
procédure gererInteragir(act, cx, cy)
// Clic de souris
si act = 0 alors
msg_erreur vaut ""
si cy < 450 et non jeuGagne alors
cl_c, cl_l est un nombre
cl_c vaut arrondi_inferieur(cx / 50)
cl_l vaut arrondi_inferieur(cy / 50)
si cl_c >= 0 et cl_c < 9 et cl_l >= 0 et cl_l < 9 alors
si grille_initiale[cl_l][cl_c] = 0 alors
sel_l vaut cl_l
sel_c vaut cl_c
sinon
sel_l vaut -1
sel_c vaut -1
fin si
fin si
// Bouton NOUVELLE GRILLE
sinon si cx >= 20 et cx <= 220 et cy >= 490 et cy <= 525 alors
genererNouvelleGrille()
// Bouton RÉSOUDRE
sinon si cx >= 230 et cx <= 430 et cy >= 490 et cy <= 525 alors
lancerSolveur()
sinon
sel_l vaut -1
sel_c vaut -1
fin si
// Touche du clavier pressée
sinon
si sel_l <> -1 et sel_c <> -1 et non jeuGagne alors
si act >= 1 et act <= 9 alors
si estValide(grille_sudoku, sel_l, sel_c, act) alors
grille_sudoku[sel_l][sel_c] vaut act
sel_l vaut -1
sel_c vaut -1
msg_erreur vaut ""
jeuGagne vaut verifierGagne(grille_sudoku)
sinon
msg_erreur vaut "Impossible : chiffre déjà présent (ligne/colonne/bloc) !"
fin si
sinon si act = 10 alors
grille_sudoku[sel_l][sel_c] vaut 0
sel_l vaut -1
sel_c vaut -1
msg_erreur vaut ""
fin si
fin si
fin si
fin procédure
@ Exécution principale
genererNouvelleGrille()
tant que appActif
dessinerInterface()
affiche ecran
interagir ecran, ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'] dans action, ptX, ptY
gererInteragir(action, ptX, ptY)
fin tant que