Sudoku + interface

Zmatt Messages postés 1 Date d'inscription dimanche 18 mai 2014 Statut Membre Dernière intervention 18 mai 2014 - Modifié par Zmatt le 18/05/2014 à 15:41
Supafresh Messages postés 40 Date d'inscription samedi 1 février 2014 Statut Membre Dernière intervention 7 août 2014 - 19 mai 2014 à 21:30
Bonjour,
Je suis débutante en python, et je suis entrain de programmer un jeu de sudoku avec interface graphique sauf que je ne connais pas très bien tkinter.
Dans mon programme je voulais que l'utilisateur puisse cliquer sur un case puis cliquer sur un bouton remplacer ou effacer. J'ai reussi a faire un pointeur pour trouver les coordonnées mais après je ne sais pas comment faire pour récuperer ces coordonnées pour les utiliser avec les autres fonctions.
Je ne sais pas si je suis très claire mais voici mon programme pour l'instant :
#sudoku
from tkinter import*
from math import*

l0=[5,3,4,6,7,8,9,0,0]
l1=[6,7,2,1,9,5,3,4,8]
l2=[1,9,8,3,4,2,5,6,7]
l3=[8,5,9,7,6,1,4,2,3]
l4=[4,2,6,8,5,3,7,9,1]
l5=[7,1,3,9,2,4,8,5,6]
l6=[9,6,1,5,3,7,2,8,4]
l7=[2,8,7,4,1,9,6,3,5]
l8=[3,4,5,2,8,6,1,7,9]

listedeliste=[l0,l1,l2,l3,l4,l5,l6,l7,l8]
copie_liste=[0]*9
for i in range(9):
copie_liste[i]=[0]*9
for j in range(9):
copie_liste[i][j]=listedeliste[i][j]

def pointeur(event):
global i0,j0
i0,j0 = ceil(9/360*event.x),ceil(9/360*event.y)
chaine.configure(text = "Clic detecte en X =" + str(i0) +\
", Y =" + str(j0))


def communication(event):
n=une_entree.get()


# vérifie que le chiffre ne se trouve pas déjà dans la ligne ou dans la colonne
def validationCL(i,j,n,listedeliste):
valide=True
if(listedeliste[i][j]==0):
for a in range(9):
colonne=listedeliste[a][j]
ligne=listedeliste[i][a]
if(colonne==n or ligne==n):
valide=False
texte2=Label(fenetre,text="Le chiffre est mauvais")
texte2.pack()
for i in range(9):
for j in range(9):
x=i*40+15
y=j*40+25
canevas.create_text(x,y,fill="black",text=listedeliste[j][i])

else:
valide=False
texte3=Label(fenetre,text="Il y a déjà un chiffre à cet emplacement")
texte3.pack()
for k in range(len(listedeliste)):
print(listedeliste[k])
return valide


# vérifie que le chiffre ne se trouve pas dans le carré
def balcarré(i,j,n):
valide=True
haut=i//3
long=j//3
for k in range(3):
for l in range(3):
if(listedeliste[3*haut+k][3*long+l]==n):
valide=False
texte4=Label(text="le chiffre est mauvais car il est déjà présent dans le carré")
texte4.pack()

return valide

def effacer_case(i0,j0):
if(copie_liste[i0][j0]==0):
listedeliste[i0][j0]=0
for i in range(9):
for j in range(9):
x=i*40+15
y=j*40+25
canevas.create_text(x,y,fill="black",text=listedeliste[j][i])
else:
texte5=Label(text="vous ne pouvez pas remplacer ce nombre")
texte5.pack()
for i in range(9):
for j in range(9):
x=i*40+15
y=j*40+25
canevas.create_text(x,y,fill="black",text=listedeliste[j][i])

def remplacer_case(i0,j0,n):
z=balcarré(i0,j0,n)
if(z==True):
w=validationCL(i,j,n,listedeliste)
if(w==True):
listedeliste[i][j]=n
for i in range(9):
for j in range(9):
x=i*40+15
y=j*40+25
canevas.create_text(x,y,fill="black",text=listedeliste[j][i])

def nbzero(listedeliste):
nb=0
nombre=0
for i in range(9):
nombre=listedeliste[i].count(0)
nb=nb+nombre
return nb


#prg principal
def grille():
global listedeliste
for i in range(1,9):
canevas.create_line(40*i,0,40*i,360,fill="black")
canevas.create_line(0,40*i,360,40*i,fill="black")
for i in range(9):
for j in range(9):
x=i*40+15
y=j*40+25
canevas.create_text(x,y,fill="black",text=listedeliste[j][i])



fenetre=Tk()

#widgets
texte1=Label(fenetre,text="Rentrer le nombre a remplacer : ")
texte1.pack()

une_entree=Entry(fenetre)
une_entree.pack()
une_entree.bind("<Return>",communication)


hauteur=360
largeur=360
canevas=Canvas(fenetre,bg="white",height=hauteur,width=largeur)
canevas.pack()


canevas.bind("<Button-1>", pointeur)
canevas.pack()
chaine = Label(fenetre)
chaine.pack()

bouton1=Button(fenetre,text="jouer",command=grille)
bouton1.pack()
bouton2=Button(fenetre,text="remplacer",command=remplacer_case)
bouton2.pack()
bouton3=Button(fenetre,text="effacer",command=effacer_case)
bouton3.pack()

fenetre.mainloop()


for p in range(len(listedeliste)):
print(listedeliste[p])

i,j = -1,-1
while(nbzero(listedeliste)!=0):
pointeur(event)

nbzero(listedeliste)
texte2=Label(fenetre,text="Le sudoku est terminé")
texte2.pack()

1 réponse

Supafresh Messages postés 40 Date d'inscription samedi 1 février 2014 Statut Membre Dernière intervention 7 août 2014 3
Modifié par Supafresh le 19/05/2014 à 21:32
Bonjour, a partir des coordonnees tu peux retrouver la valeur correspondante en faisant monTabDeVal[x][y] = varStock. Comme cela, grace aux coordonnees tu stocke la valeur que tu veux dans varStock. Pour l'utiliser dans d'autres fonctions, tu met varStock en parametre de tes fonctions. Ne parle pas de pointeur s'il te plait car il n'y a pas son implementation en Python.
0
Rejoignez-nous