D:\Documents\2012\python\sudoku.py dimanche 27 janvier 2013 23:18
# Variables globales : f,canvas,sudo
class sudoku:
def __init__(self):
self.tab=[0]*9
for iin range(9):
self.tab[i]=[0]*9
for iin range(9):
for jin range(9):
self.tab[i][j]=[0,0]
def verif(self,x,y,val):
ox,oy=3*(x/3),3*(y/3)
for iin range(9):
if (self.tab[x][i][0]==val and i!=y)or (self.tab[i][y][0]==val and i!=x):
return(False)
if self.tab[ox+i/3][oy+i%3][0]==val and (ox+i/3,oy+i%3)!=(x,y):
return(False)
return(True)
def cherche(self,ox,oy):
posx,posy=ox,oy
while self.tab[posx][posy][0]!=0:
if posx!=8:
posx+=1
elif posy!=8:
posx=0;posy+=1
else:
return((9,9))
return((posx,posy))
def solverec(self,posx,posy):
for iin range(1,10):
if self.verif(posx,posy,i):
self.tab[posx][posy][0]=i
(a,b)=self.cherche(posx,posy)
if (a,b)==(9,9):
return(True)
r=self.solverec(a,b)
if r:
return(True)
self.tab[posx][posy][0]=0
return(False)
def solve(self):
(a,b)=self.cherche(0,0)
if (a,b)!=(9,9):
if self.solverec(a,b):
self.affiche()
else:
Msg.showinfo(title="sudoku",message="Pas de solution")
-1-
D:\Documents\2012\python\sudoku.py dimanche 27 janvier 2013 23:18
def affiche(self):
for xin range(9):
for yin range(9):
if self.tab[x][y][0]!=0:
c=str(self.tab[x][y][0])
else:
c=''
canvas.itemconfig(self.tab[x][y][1],text=c,font=("Times","18","bold"),fill=
'black')
canvas.coords(self.tab[x][y][1],30*x+15,30*y+15)
def sauver(self):
descr=Selector.asksaveasfilename(initialdir=os.getcwd(),filetypes=[("sudoku","*.sudo"
)],defaultextension=".sudo")
try:
file=open(descr,'w')
chaine=''
for iin range(9):
for jin range(9):
chaine+=str(self.tab[i][j][0])
file.write(chaine)
file.close()
return(True)
except:
return(False)
def ouvrir(self):
descr=Selector.askopenfilename(initialdir=os.getcwd(),filetypes=[("sudoku","*.sudo")])
try:
file=open(descr,'r')
chaine=file.readline()
file.close()
if len(chaine)!=81:
return(False)
for iin range(9):
for jin range(9):
self.tab[i][j][0]=int(chaine[i+9*j])
self.affiche()
return(True)
except:
return(False)
def touche(ev):
x=ev.x/30
y=ev.y/30
if (ev.char>="0" and ev.char<="9" and xin range(9)and yin range(9)):
if ev.char<>"0":
val=int(ev.char)
if sudo.verif(x,y,val):
sudo.tab[x][y][0]=val
canvas.itemconfig(sudo.tab[x][y][1],text=ev.char,font=("Times","18","bold"
),fill='black')
canvas.coords(sudo.tab[x][y][1],30*x+15,30*y+15)
canvas.update()
-2-
D:\Documents\2012\python\sudoku.py dimanche 27 janvier 2013 23:18
else:
Msg.showinfo(title="sudoku",message="incoherence")
else:
sudo.tab[x][y][0]=0
canvas.itemconfig(sudo.tab[x][y][1],text="")
canvas.coords(sudo.tab[x][y][1],30*x+15,30*y+15)
# ------------------- Modules
from Tkinter import *
import tkMessageBox as Msg
import tkFileDialog as Selector
import sys
import os
#
#---------------------Principal
#
sudo=sudoku()
f=Tk()
menu=Menu(f)
menuf=Menu(menu)
menu.add_cascade(label="Fichiers",menu=menuf)
menuf.add_command(label="sauver",command=sudo.sauver)
menuf.add_command(label="ouvrir un fichier",command=sudo.ouvrir)
canvas=Canvas(f,bg='dark grey',height=320,width=300)
canvas.pack()
canvas.create_text(10,280,text='Pour modifier, placer la souris sur une case (pas de',anchor=
NW)
canvas.create_text(10,300,text='click) et taper sur un chiffre (0 pour effacer)',anchor=NW)
for iin range(10):
if i%3==0:
color='red'
else:
color='black'
canvas.create_line(0,i*30,270,i*30,width=2,fill=color)
canvas.create_line(i*30,0,i*30,270,width=2,fill=color)
for iin range(9):
for jin range(9):
sudo.tab[i][j][1]=canvas.create_text(0,0,text=' ')
f.bind("<Key>",touche)
b=Button(f,text='quitter',command=f.destroy)
b.pack(side=LEFT,padx=5,pady=5)
r=Button(f,text='resoudre',command=sudo.solve)
r.pack(side=RIGHT,padx=5,pady=5)
f.config(menu=menu)
f.mainloop()
-3-
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !