.

.

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()

icone="icone.ico"

couleur="violet"

titre="2048 "

taille=str(largeur)+'x'+str(hauteur+50)

creer_fenetre(fenetre,taille,titre,icone,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

#deux48.py

from tkinter import *

from random import randrange

def creer_fenetre(fenetre,taille,titre,icone,couleur):

       #fonction qui redimensionne, donne le titre

       #et l'icône de la fenêtre ainsi que la couleur

       fenetre.geometry(taille) # redimensionne la fenêtre

       fenetre.title(titre)  # affiche le titre dans la fenêtre

       fenetre.configure(bg=couleur)# change la couleur du fond

def nettoie_fenetre(fenetre,can,liste_widgets):

       #nettoie la fenetre

       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"

       #fabrication du tableau

       tableau=ligne*[0]

       for ln in range(ligne):tableau[ln]=colonne*[0]

       return tableau                                

def remplir(liste,ligne,colonne):

       #remplissage du tableau par une liste

       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"

       #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 liste_image(dossier,nombre):

       # Fonction qui permet de creer un liste qui

       #comporte un nombre de photos déposés dans un dossier

       items=nombre*['']

       for i in range(nombre):

             # le symbole / permet d'aller

             #chercher les images

             # dans le dossier images/

             tim=dossier+'/i'+str(i)

             items[i]=creer_item(tim)

       return items

def taille_photo(photo):

       #Détermine la taille de la 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"""

       #remplissage d'une liste+

       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"""

       #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):

       #remplissage du tableau par une liste

       #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 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"""

       #print('sortie',liste)

       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):

       #affiche le fond de la première fenêtre

    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])

                # B=can.create_image(j*(cp+5)+cp/2+5,i*(cp+5)+cp/2+5,image=l_image[0])

                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#calcul de la ligne

       cn=int(x)//cp#calcul de

       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

    #donne les coordonnées du click de la souris

    x,y=event.x,event.y

    lin=int(y)//lp#calcul de la ligne

    cin=int(x)//cp#calcul de

    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

    #tableau=addition_tableau(tableau,ligne,colonne,sens)

    ls.config(text=str(score))

    #l_items,tableau=affiche_fond(can,l_image,tableau,ligne,colonne,l_items,dimensions)

    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':

        #tableau,plein=listetableau0(tableau,ligne,colonne)

        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))

       

 #--------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------------#