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
| import random
from pylab import*
import numpy
from random import*
import copy
from tkinter import*
from random import*
global G
def GrilleRandom():
global G,n, A
n=4 #Dimensions du Sudoku
G = array([[int(n) for x in range(0,n)] for y in range(0,n)], dtype=object)
G[0] = sample(range(1,n+1), n) #on créée une première ligne aléatoire de chiffres tous différents
x = 1 #on commence donc le x à la seconde ligne
y = 0 #on commence à la première colonne
while x<n and y<n: #tant que x et y sont inférieur au maximum de la grille (4)
m =[] #Nombres déjà utilisés dans les cellules et qui ne peuvent être réutilisés
choix =[] #Liste des nombres qui peuvent être utilisés pour une cellule donnée
for T in range (0,x): #on lit la liste sur toutes les lignes, soit de 0 à 4
m.append(G[T][y]) #on ajoute à la liste chaque nombres utilisés*
T=T+1 #on indente la liste et on recommence
if y!=0: #Même manipulation cette fois pour les ordonnées
for T in range (0,y):
m.append(G[x][T])
T=T+1
#Pour savoir si un nombre est pair, on fait son modulo et si son reste est égal à 0, alors il est pair
if x%2!=0:
if (x+y)%2!=0: #on a remarqué que lorsque x est pair, (seconde et quatrième ligne),
m.append(G[x-1][y+1]) #les nombres en haut à gauche et en haut à droite doivent être différents/
else: #En cherchant quand la somme de x et de y est pair, on peut déterminer quels nombres
m.append(G[x-1][y-1]) #enregistrer dans la liste m, soit ceux déjà utilisés
#donc quand x+y est pair, on enregistre le nombre en haut à droite
#et quand x+y est impair, on enregistre le nombre en haut à gauche
for k in range (1,n+1): #on lit k de 1 à 4
if k not in m: #si un nombre n'appartient pas à la liste m, alors on l'ajoute à une novuelle liste
choix.append(k)
k=k+1 #on indente
if len(choix)!=0: #on lit toute la liste choix avec len
G[x][y]=choice(choix) #le programme choisit un nombre aléatoire dans la liste choix, qui changera à chaque ligne/ordonnée
else:
x=1
y=0
y=y+1 #on indente les ordonnées, jusqu'à 4
if y==n:
y=0
x=x+1
#quand y=4, on indente les lignes
A = G.copy()
GrilleRandom()
def GrilleSuppr():
p = o =0
while p<n and o<n:
a = ''
G[o][p]=a
G[o][randint(2,3)]=a
G[randint(2,3)][p]=a
p = p + 1
o = o + 1
GrilleSuppr()
ecriture=("comic sans ms",13)
nbcase=4
case=100
x0,y0=9,9
chifre=[1,2,3,4]
def zut():
ntm=Toplevel()
def fin ():
fenetre.quit()
fenetre.destroy()
def grille():
for i in range(nbcase+1):
Can.create_line(x0+case*i, y0,x0+case*i,y0 + nbcase*case)
Can.create_line(x0, y0+case*i,x0+nbcase*case ,y0+case*i)
for m in range (0,4):
Can.create_text(60,(m+0.6)*100,text=G[m][0])
Can.create_text(160,(m+0.6)*100,text=G[m][1])
Can.create_text(260,(m+0.6)*100,text=G[m][2])
Can.create_text(360,(m+0.6)*100,text=G[m][3])
def place_number(event):
TexteC.delete("0.0",END)# on efface l'écriture précédente
TexteC.insert(END,"clic detecte en x="+str(event.x) + " et y = " + str(event.y))
a=(event.x)//100 #ici a est censé récupéré la position du clic pour ce qui est des abscisses
b=(event.y)//100 #ici b fait la même chose que b mais pour lees ordonnées
text = current
Can.create_text(a,b,text=text) #ici la fonction est censé afficher le texte au coordonées a et b
Can.create_text((a+0.5)*100+10,(b+0.5)*100+10,text=text) #ici on ajoute 0,5 à a et b pour centrer le nombre dans la case
def jouer(event):
global trouve
[i,j]=correspond(event.x,event.y)
if i in range(nb) and j in range (nb): # on ne fait rien si le click est hors grille
Can.create_rectangle(x0 +case*j,y0+case*i,x0 +case*(j+1),y0+case*(i+1),fill=coul(i,j))
def GrilleVérification():
global G
a = "Vous avez juste"
b = 0
for p in range(0,4):
for o in range(0,4):
if G[o][p]!=A[o][p]:
b= b + 1
if b==1:
a = "Vous avez " +b+ "erreur"
else:
if b>1:
a = "Vous avez" +b+ "erreurs"
def Supprimer():
Can.delete(TexteC)
def display(x):
def wrap():
global current
current = x
return wrap
Cadre=Frame(ntm)
Texte1=Label(ntm,text="Jeu du Sudoku",fg="red",font=ecriture)
BouttonQuit=Button(ntm,text="quitter", command=fin)
BouttonJouer=Button(ntm,text="jouer", command=grille)
TexteC=Text(ntm,height=25,width=25)
Can=Canvas(ntm,height=500,width=500,bg="white")
Bouton1=Button(ntm,text="4",command=display('4'))
Bouton2=Button(ntm,text="3",command=display('3'))
Bouton3=Button(ntm,text="2",command=display('2'))
Bouton4=Button(ntm,text="1",command=display('1'))
Bouton5=Button(ntm,text="Vérifier",command=GrilleVérification)
Bouton6=Button(ntm,text="Supprimer",command=Supprimer)
Texte1.grid(row=0,column=0)
BouttonQuit.grid(row=50, column=100)
Cadre.grid(row=1,column=0)
Can.grid(row=1, column=0)
BouttonJouer.grid(row=0, column=50)
TexteC.grid(row=1, column=3)
Bouton1.grid(row=45, column=49)
Bouton2.grid(row=45, column=48)
Bouton3.grid(row=45, column=47)
Bouton4.grid(row=45, column=46)
Bouton5.grid(row=50, column=50)
Bouton6.grid(row=50, column=60)
Can.bind("<Button-1>",place_number)
fenetre=Tk()
Texte=Label(fenetre,text="Bienvenue dans le jeu de sudoku",fg="red",font=ecriture)
Texte.grid(row=0,column=3)
Boutoniveau1=Button(fenetre,text="Niveau 1",command=zut)
Boutoniveau1.grid(row=2,column=3)
fenetre.mainloop() |
Partager