2048

.

Vidéo

html5 video test by EasyHtml5Video.com v3.9.1

.

Objectif du tutoriel :

OBJECTIF

Construire

  • Afficher une fenêtre, avec un titre et une icône.
  • Déterminer la dimension de la fenêtre pour qu’elle puisse afficher des textes et des images.
  • Inclure dans la fenêtre un canevas (Canvas) pour afficher des images qui peuvent se déplacer à l’aide de la souris.
  • Utiliser les listes et les tableaux pour stocker des données.

Télécharger les images de 2048 téléchargement  images de 2048 .

_images/deux000.PNG

.

Le code du programme principal:

Affichage du code
liste des fonctions
#deux48.py from tkinter import * from random import randrange def creer_fenetre(fenetre,taille,titre,icone,couleur): pass def nettoie_fenetre(fenetre,can,liste_widgets): pass def creer_item(tim): pass def Tableau(ligne,colonne): pass def remplir(liste,ligne,colonne): pass def melange(liste): pass def listetableau(tableau,ligne,colonne): pass def liste_image(dossier,nombre): pass def taille_photo(photo): pass def listetableau0(tableau,ligne,colonne,score): pass def listetableau(tableau,ligne,colonne): #fabrication d'une liste avec un tableau lignes colonnes #remplissage d'une liste liste=[] for ln in range(0,ligne): for cn in range(0,colonne): liste.append(tableau[ln][cn]) return liste def remplir(tableau,liste,ligne,colonne): pass def change_nombre(tableau,ligne,colonne): pass def change_tableau(tableau,liste,ligne,colonne): pass def addition_lc(liste): pass def addition(tableau,ligne, colonne,sens ,dimensions,l_items,l_image): pass def affiche_mouv(fenetre,can,dimensions,tableau,ligne,colonne,score,l_items,\ pass def regroupe(liste): pass def affiche_fond(can,l_image,tableau,ligne,colonne,l_items,dimensions): pass def click_souris(event,fenetre,can,l_nombre,l_image,lp,cp,ligne,colonne,l_items,tableau,plein,ls,score): pass def click_souris_releve(event,fenetre,can,l_nombre,l_image,lp,cp,ligne,colonne,l_items,tableau,plein,ln,cn,ls,score): pass def nombre_aleatoire(liste): pass def quitter(): fenetre.destroy() def jouer(fenetre,can,l_image,ligne,colonne,largeur,hauteur,l_items,dimensions,ls): pass #--------déclaration des variables---------------# largeur,hauteur=625,625 ligne,colonne=4,4 l_widgets=[] dimensions=150 score=0 k1,k2,k3,k4=0,0,0,0 temp1,temp2,temp3,temp4=4*[0],4*[0],4*[0],4*[0] sortie1,sortie2,sortie3,sortie4=4*[0],4*[0],4*[0],4*[0] photos=11*[0] memoire=[0,0,0,score,-1] #lp=hauteur de chaque ligne en pixels #cp=largeur de chaque colonne en pixels lp,cp=int(hauteur/ligne),int(largeur/colonne) #liste qui va contenir les images l_nombre=ligne*colonne*[0]#liste qui va contenir des nombres #--------------création de la fenêtre------------# fenetre = Tk() couleur="violet" titre="2048 " taille=str(largeur)+'x'+str(hauteur+50) creer_fenetre(fenetre,taille,titre,couleur) fenetre.resizable(width=False,height=False) #-création du canvas qui va contenir les données-# can=Canvas(fenetre,width=largeur,height=hauteur,bg='violet') #le canvas contient le nombre de lignes et de colonnes#qui sont déclarées dans les variables can.grid(row=0,column=0,rowspan=ligne,columnspan=colonne) #affichage du fond d'écran #------remplissage des listes des données-------# #il faut remplir la liste d'images dans la fenêtre #sinon cela ne marche pas l_items=[] Lab=Button(fenetre,text='rejouer',bg='blue',fg='white',font='verdana 16 bold',\ command=lambda:jouer(fenetre,can,l_image,ligne,colonne,largeur,hauteur,l_items,dimensions,ls)) Lab.grid(row=4,column=3) ls=Label(fenetre,text='',bg='violet',fg='red',font='verdana 15 bold') ls.grid(row=4,column=2) lb=Label(fenetre,text='2048',bg='violet',fg='black',font='verdana 20 bold') lb.grid(row=4,column=1,) bd=Button(fenetre,text='Quitter',bg='red',fg='white',font='verdana 16 bold',command=quitter) bd.grid(row=4,column=0) l_image=liste_image("images150",23)#contient 11 images dans cet exemple jouer(fenetre,can,l_image,ligne,colonne,largeur,hauteur,l_items,dimensions,ls) fenetre.mainloop()
Le code des fonctions tableau et image
Fonctions
from tkinter import * from random import randrange def creer_fenetre(fenetre,taille,titre,couleur): fenetre.geometry(taille) fenetre.title(titre) fenetre.configure(bg=couleur) fenetre.resizable(width=False,height=False) return fenetre def nettoie_fenetre(fenetre,can,liste_widgets): can.delete(ALL) for w in liste_widgets:w.destroy() return fenetre def creer_item(tim): #creation d'un item #tim+'.png' ="inombre.png" (nombre =1;2; #ou 9 ou 10 ... p1=PhotoImage(file=tim+'.png') return p1 def Tableau(ligne,colonne): #fabrication d'un tableau lignes colonnes" tableau=ligne*[0] for ln in range(ligne):tableau[ln]=colonne*[0] return tableau def remplir(liste,ligne,colonne): tableau=Tableau(ligne,colonne) for ln in range(0,ligne): for cn in range(0,colonne): tableau[ln][cn]=liste[colonne*ln+cn] return tableau def melange(liste): #remplissage aléatoire d'une liste de nombres entiers" numimage=len(liste) for i in range(numimage):liste[i]=2 k=0 while k<numimage-1: remelange=False numero=randrange(1,numimage+1) for j in range(0,numimage): if numero==liste[j] :remelange=True if remelange==False: liste[k]=numero k=k+1 return liste def listetableau(tableau,ligne,colonne): #fabrication d'une liste avec un tableau lignes colonnes" liste=[] for ln in range(0,ligne): for cn in range(0,colonne): liste.append(tableau[ln][cn]) return liste def liste_image(dossier,nombre): items=nombre*[''] for i in range(nombre): tim=dossier+'/i'+str(i) items[i]=creer_item(tim) return items def taille_photo(photo): largeur=photo.width() hauteur=photo.height() return largeur,hauteur
Le code de la fonction addition
Addition
def listetableau0(tableau,ligne,colonne,score): #fabrication d'une liste avec un tableau lignes colonnes debut=score//64 if debut>6:debut=6 liste=[] plein=False for ln in range(1,ligne): for cn in range(1,colonne): if tableau[ln][cn]==0: liste.append(ln*4+cn) if len(liste)==0:plein=True if plein==False: numimage=len(liste) numero=randrange(0,numimage) nombre=randrange(debut+1,debut+4) numero1=liste[numero] ln=numero1//4 cn=numero1%4 tableau[ln][cn]=nombre+11 return tableau,plein def listetableau(tableau,ligne,colonne): #fabrication d'une liste avec un tableau lignes colonnes liste=[] for ln in range(0,ligne): for cn in range(0,colonne): liste.append(tableau[ln][cn]) return liste def remplir(tableau,liste,ligne,colonne): for ln in range(0,ligne): for cn in range(0,colonne): tableau[ln][cn]=liste[colonne*ln+cn] return tableau def change_nombre(tableau,ligne,colonne): temp,plein=listetableau0(tableau,ligne,colonne) temp,nombre=nombre_aleatoire(temp) nombre=2*nombre return temp,plein,nombre def change_tableau(tableau,liste,ligne,colonne): k=0 for ln in range(1,ligne-1): for cn in range(1,colonne-1): if tableau[ln][cn]==0: tableau[ln][cn]=liste[k] k=k+1 return tableau def addition_lc(liste): temp=[] retour=4*[0] return retour
Le code de la fonction affiche mouvement
Mouvement
def affiche_mouv(fenetre,can,dimensions,tableau,ligne,colonne,score,l_items,l_image,sens,temp1,sortie1,temp2,sortie2,temp3,sortie3,temp4,sortie4): tabdroit=Tableau(4,4) if sens=="droite": for i in range(colonne): tableau[0][i]=sortie1[i] tableau[1][i]=sortie2[i] tableau[2][i]=sortie3[i] tableau[3][i]=sortie4[i] if sens=="gauche": for i in range(4): tableau[0][3-i]=sortie1[i] tableau[1][3-i]=sortie2[i] tableau[2][3-i]=sortie3[i] tableau[3][3-i]=sortie4[i] if sens=="haut": for i in range(4): tableau[i][0]=sortie1[i] tableau[i][1]=sortie2[i] tableau[i][2]=sortie3[i] tableau[i][3]=sortie4[i] if sens=="bas": for i in range(4): tableau[i][0]=sortie1[3-i] tableau[i][1]=sortie2[3-i] tableau[i][2]=sortie3[3-i] tableau[i][3]=sortie4[3-i] for w in l_items:can.delete(w) tableau,l_items=affiche_fond(can,l_image,tableau,ligne,colonne,l_items,dimensions)
Le code de la fonction regroupe
regroupe
def regroupe(liste): #regroupe les lignes ou les colonnes k=0 temp=4*[0] sortie=4*[0] for i in range(4): if liste[i]!=0: temp[k]=liste[i] k=k+1 if k==1: sortie[0]=temp[0] sortie[1]=0 sortie[2]=0 sortie[3]=0 if k==2 : if temp[0]==temp[1]: sortie[0]=temp[0]+1 sortie[1]=0 sortie[2]=0 sortie[3]=0 if temp[0]!=temp[1]: sortie[0]=temp[0] sortie[1]=temp[1] sortie[2]=0 sortie[3]=0 if k==3: if temp[0]==temp[1]: sortie[0]=temp[0]+1 sortie[1]=temp[2] temp[2]=0 if temp[0]!= temp[1]: sortie[0]=temp[0] if temp[1]==temp[2]: sortie[1]=temp[1]+1 if temp[1]!=temp[2]: sortie[1]=temp[1] sortie[2]=temp[2] if k==4: if temp[0]==temp[1]: sortie[0]=temp[0]+1 if temp[2]==temp[3]: sortie[1]=temp[2]+1 sortie[1]=temp[2] sortie[2]=temp[3] if temp[2]!=temp[3]: sortie[1]=temp[2] sortie[2]=temp[3] sortie[3]=0 if temp[0]!=temp[1]: sortie[0]=temp[0] if temp[1]==temp[2]: sortie[1]=temp[1]+1 sortie[2]=temp[3] sortie[3]=0 if temp[1]!=temp[2]: sortie[1]=temp[1] if temp[2]==temp[3]: sortie[2]=temp[3]+1 sortie[3]=0 if temp[2]!=temp[3]: sortie[2]=temp[2] sortie[3]=temp[3] return temp,k,sortie
Le code de la fonction affiche fond et des souris
SCRIPT
def affiche_fond(can,l_image,tableau,ligne,colonne,l_items,dimensions): for w in l_items:can.delete(w) cp=dimensions for i in range(0,ligne): for j in range(0,colonne): k=tableau[i][j] if tableau[i][j]>11:tableau[i][j]=tableau[i][j]-11 B=can.create_image(j*(cp+5)+cp/2+5,i*(cp+5)+cp/2+5,image=l_image[k]) l_items.append(B) return l_items,tableau def click_souris(event,fenetre,can,l_nombre,l_image,lp,cp,ligne,colonne,l_items,tableau,plein,ls,score): x,y=event.x,event.y ln=int(y)//lp cn=int(x)//cp can.bind("<Button1-ButtonRelease>", lambda event:click_souris_releve(event,fenetre,can,l_nombre,l_image,lp,cp,ligne,colonne,l_items,tableau,plein,ln,cn,ls,score)) def click_souris_releve(event,fenetre,can,l_nombre,l_image,lp,cp,ligne,colonne,l_items,tableau,plein,ln,cn,ls,score): global dimensions,l_widgets x,y=event.x,event.y lin=int(y)//lp cin=int(x)//cp lplus=ln-lin cplus=cn-cin sens='rien' if cplus==0 : if lplus>1:sens='haut' if lplus<1:sens='bas' if lplus==0:sens='rien' if lplus==0: if cplus>1:sens='droite' if cplus<1:sens='gauche' if cplus==0:sens='rien' l_items,tableau= addition(tableau,ligne, colonne,sens ,dimensions,l_items,l_image) l_items,tableau=affiche_fond(can,l_image,tableau,ligne,colonne,l_items,dimensions) dimensions=150 if sens!='rien': tableau,plein=listetableau0(tableau,ligne,colonne,score) l_items,tableau=affiche_fond(can,l_image,tableau,ligne,colonne,l_items,dimensions) score=score+1 ls.config(text=str(score)) k=0 l_widgets=l_items for i in range(4): for j in range(4): if tableau[i][j]==0:k=k+1 if k!=0 and sens!='rien': can.bind("<Button-1>",lambda event:click_souris(event,fenetre,can,l_nombre,l_image,lp,cp,ligne,colonne,l_items,tableau,plein,ls,score))
Le code des fonctions quitter, jouer et les variables
SCRIPT
def nombre_aleatoire(liste): #remplissage aléatoire d'une liste de nombres entiers numimage=len(liste) nombre=randrange(1,4) numero=randrange(0,numimage) liste[numero]=nombre return liste,nombre def quitter(): fenetre.destroy() def jouer(fenetre,can,l_image,ligne,colonne,largeur,hauteur,l_items,dimensions,ls): global score,l_widgets liste=16*[0] tableau=Tableau(4,4) tableau=remplir(tableau,liste,ligne,colonne) score=0 for w in l_widgets:can.delete(w) can.delete(ALL) ls.config(text="0") lp,cp=int(hauteur/ligne),int(largeur/colonne) l_items,tableau=affiche_fond(can,l_image,tableau,ligne,colonne,l_items,dimensions) l_nombre=ligne*colonne*[0] for i in range(3): tableau,plein=listetableau0(tableau,ligne,colonne,0) l_items,tableau=affiche_fond(can,l_image,tableau,ligne,colonne,l_items,dimensions) can.bind("<Button-1>",lambda event:click_souris(event,fenetre,can,l_nombre,l_image,lp,cp,ligne,colonne,l_items,tableau,plein,ls,score)) ligne,colonne=4,4 l_widgets=[] score=0 k1,k2,k3,k4=0,0,0,0 temp1,temp2,temp3,temp4=4*[0],4*[0],4*[0],4*[0] sortie1,sortie2,sortie3,sortie4=4*[0],4*[0],4*[0],4*[0] photos=11*[0] memoire=[0,0,0,score,-1] fenetre = Tk() larg=fenetre.winfo_screenwidth() long=fenetre.winfo_screenheight() l_image=liste_image("images150",23) dimensions ,dim=taille_photo(l_image[0]) if larg>long: largeur,hauteur=long,long if larg<long: largeur,hauteur=larg,larg lp,cp=int(hauteur/ligne),int(largeur/colonne) lp,lc=4,4 largeur,hauteur=4*(dim+6),4*(6+dim) l_nombre=ligne*colonne*[0] couleur="violet" titre="2048 " taille=str(largeur)+'x'+str(hauteur) creer_fenetre(fenetre,taille,titre,couleur) can=Canvas(fenetre,width=largeur,height=hauteur,bg='violet') can.grid(row=0,column=0,rowspan=ligne,columnspan=colonne) l_items=[] Lab=Button(fenetre,text='rejouer',bg='blue',fg='white',font='verdana 16 bold', command=lambda:jouer(fenetre,can,l_image,ligne,colonne,largeur,hauteur,l_items,dimensions,ls)) Lab.grid(row=4,column=3) ls=Label(fenetre,text='',bg='violet',fg='red',font='verdana 15 bold') ls.grid(row=4,column=2) lb=Label(fenetre,text='2048',bg='violet',fg='black',font='verdana 20 bold') lb.grid(row=4,column=1,) bd=Button(fenetre,text='Quitter',bg='red',fg='white',font='verdana 16 bold',command=quitter) bd.grid(row=4,column=0) jouer(fenetre,can,l_image,ligne,colonne,largeur,hauteur,l_items,dimensions,ls) fenetre.mainloop()