Salut à tous !
Dans le cadre de la spécialité ISN de Terminale S, nous avons voulu créé, un ami et moi, un programme permettant de résoudre des grilles de Sudoku
Je m'occupe de la partie de l'algorithme de résolution tandis que lui s'est occupé de l'interface graphique.
Nous avons des problèmes pour "assembler" nos deux codes et nous aurions besoin d'un peu d'aide
Je vous laisse donc nos deux codes séparément :
L'algorithme de résolution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 #Fonction permettant l'initialisation de la grille de sudoku d'une part et d'une grille des possibles= solution d'autre part# def init() : global sudoku global possible sudoku = [[0 for j in range(10)] for i in range(10)] possible = [[[0 for k in range(10)] for j in range(10)] for i in range(10)] #Grille facile (réussite) exemple pour la suivi du code place(1,3,6) place(1,4,7) place(2,2,7) place(2,4,9) place(2,5,2) place(2,7,4) place(2,8,5) place(3,2,8) place(3,3,9) place(3,4,3) place(3,5,6) place(3,6,5) place(4,2,3) place(4,3,5) place(4,4,8) place(4,7,2) place(4,8,7) place(5,1,9) place(5,4,2) place(5,6,7) place(5,9,3) place(6,2,2) place(6,3,7) place(6,6,1) place(6,7,5) place(6,8,4) place(7,4,1) place(7,5,7) place(7,6,3) place(7,7,6) place(7,8,8) place(8,2,6) place(8,3,1) place(8,5,8) place(8,6,2) place(8,8,3) place(9,6,6) place(9,7,7) #Grille expert (échec) # place(1,5,8) # place(1,9,3) # place(2,1,3) # place(2,2,8) # place(2,7,5) # place(2,9,7) # place(3,2,2) # place(3,4,1) # place(3,8,6) # place(4,1,7) # place(4,2,4) # place(4,5,6) # place(4,8,8) # place(5,4,5) # place(5,6,1) # place(6,5,4) # place(7,3,2) # place(7,5,9) # place(7,9,4) # place(8,3,6) # place(8,4,7) # place(8,7,8) # place(9,3,4) # place(9,6,6) # place(9,7,7) def affichage() : print for x in range(1,10) : print (sudoku[x]) print () def jeu() : global k k=0 while k==0 : k=1 for x in range(1,10) : for y in range(1,10) : verifca(x,y) for x in range(1,10) : for n in range(1,10) : verifli(x,n) for y in range(1,10) : for n in range(1,10) : verifco(y,n) for z in range(1,10) : for n in range(1,10) : verifbl(z,n) def place(x,y,n) : global sudoku global possible global k sudoku[x][y]=n for i in range(1,10) : if (i!=x) : possible[i][y][n]=1 if (i!=y) : possible[x][i][n]=1 for m in range(1,10) : possible[x][y][m]=1 x1=int((x-1)/3) y1=int((y-1)/3) i1=int((i-1)/3) if (3*x1+(i-1)%3+1!=x or 3*y1+i1+1!=y) : possible[3*x1+(i-1)%3+1][3*y1+i1+1][n]=1 k=0 def verifca(x,y) : compteur=0 for n in range (1,10) : if (possible[x][y][n]==0) : compteur=compteur+1 candidat=n if (compteur==1) : place(x,y,candidat) def verifli(x,n) : compteur=0 for y in range(1,10) : if (possible[x][y][n]==0) : compteur=compteur+1 candidat=y if (compteur==1) : place(x,candidat,n) def verifco(y,n) : compteur=0 for x in range(1,10) : if (possible[x][y][n]==0) : compteur=compteur+1 candidat=x if (compteur==1) : place(candidat,y,n) def verifbl(z,n) : compteur=0 z1=int((z-1)/3) for w in range(1,10) : w1=int((w-1)/3) x1=3*z1+w1+1 y1=3*((z-1)%3)+(w-1)%3+1 if (possible[x1][y1][n]==0) : compteur=compteur+1 candidat1=x1 candidat2=y1 if (compteur==1) : place(candidat1,candidat2,n) sudoku = [] possible = [] init() affichage() jeu() isum=0 for x in range(1,10) : for y in range(1,10) : isum=isum+sudoku[x][y] if (isum==405) : affichage() print ("reussite") else : affichage() print ("echec")
Puis l'interface graphique de mon ami :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121 from tkinter import * import tkinter.messagebox import tkinter.filedialog import random from numpy import * ecriture=("comic sans ms",13) nbcase=9 case=50 x0,y0=9,9 chiffre=[0,1,2,3,4,5,6,7,8,9] Mafenetre = Tk() Mafenetre.title("Jeu du sudoku") cases = dict() cases=zeros((9,9),'i') def grille(): continuer=1 while continuer==1: i=int(input("Ligne ? (0 à 8) ")) if i<0 or i>8: i=int(input("Ligne ? (0 à 8) ")) j=int(input("Colonne ? (0 à 8) ")) if j<0 or j>8: j=int(input("Colonne ? (0 à 8) ")) m=int(input("Valeur ? (1 à 9) ")) if m<1 or m>9: m=int(input("Valeur ? (1 à 9) ")) cases[j,i] = m; continuer=int(input("Continuer ? 1 pour Oui, 0 pour Non ")) for k in range(nbcase+1): Can.create_line(x0+case*k, y0,x0+case*k,y0 + nbcase*case) Can.create_line(x0, y0+case*k,x0+nbcase*case ,y0+case*k) r=1 c=1 for r in range(nbcase): x = x0 + case * r + case // 2 for c in range(nbcase): y = y0 + case * c + case // 2 if cases[r, c]!=0: cases[r, c] = Can.create_text(x, y, text=cases[r,c]) else: cases[r, c] = Can.create_text(x, y, text='') def jouer(event): w = event.widget value = event.keysym if event.keysym in '123456789' else '' if value: r, c = correspond(event.y,event.x) if (r, c) in cases: w.itemconfigure(cases[(r, c)], text=value) def correspond(x,y): return [(y-y0)/c,(x-x0)/c] def Apropos(): tkinter.messagebox.showinfo("A propos","Tutorial Python Tkinter\n(C) Fabrice Sincère") def Règles(): tkinter.messagebox.showinfo("Règles","Un sudoku classique contient neuf lignes et neuf colonnes, donc 81 cases au total. Le but du jeu est de remplir ces cases avec des chiffres allant de 1 à 9 en veillant toujours à ce qu'un même chiffre ne figure qu'une seule fois par colonne, une seule fois par ligne, et une seule fois par carré de neuf cases.\nAu début du jeu, Des chiffres sont déjà placés et il vous reste à trouver les autres. En effet, une grille initiale de sudoku correctement constituée ne peut aboutir qu'à une et une seule solution.\n BONNE CHANCE !") def Résolution(): tkinter.messagebox.showinfo("Résolution","VOIR AVEC") def Quitter(): Mafenetre.destroy() Cadre=Frame(Mafenetre) TexteC=Text(Mafenetre,height=25,width=25) Can=Canvas(Cadre,height=500,width=500,bg="white") Cadre.grid(row=1,column=0) Can.grid(row=2, column=0) TexteC.grid(row=1, column=3) Can.bind( '<KeyPress>', jouer) Can.focus_set() # Création d'un widget Menu menubar = Menu(Mafenetre) menuNouvellePartie = Menu(menubar,tearoff=0) menubar.add_command(label="Nouvelle Partie...", command=grille) menuRésolution = Menu(menubar,tearoff=0) menuRésolution.add_command(label="Grille Personelle",command=grille) menuRésolution.add_command(label="Grille Actuelle",command=Résolution) menubar.add_cascade(label="Résolution", menu=menuRésolution) menurègles = Menu(menubar,tearoff=0) menurègles.add_command(label="Règles", command=Règles) menubar.add_cascade(label="Règles", menu=menurègles) menuaide = Menu(menubar,tearoff=0) menuaide.add_command(label="A propos",command=Apropos) menubar.add_cascade(label="A propos de", menu=menuaide) menuQuitter = Menu(menubar,tearoff=0) menuQuitter.add_command(label="Quitter", command=Quitter) menubar.add_cascade(label="Quitter le jeu", menu=menuQuitter) # Affichage du menu Mafenetre.config(menu=menubar) # Utilisation d'un dictionnaire pour conserver une référence gifdict={} Mafenetre.mainloop()
Dans l’espérance que vous pourrez nous apporter de l'aide,
A bientôt !![]()
Superfranois
Partager