Pacman

.

Objectif du tutoriel :

C’est obtenir une application qui utilise:

  • Une fenêtre.
  • Un canevas.
  • Créer des graphiques, du texte, des composants graphiques.
  • Créer des modules : image,fenetre et tableau. Pour introduire les boucles, les listes, les booléens et rendre le profil du jeu de façon originale.
  • fenetre.py est un module qui gère les fenêtres : nettoyage, construction..
  • tableau.py est un module qui permet de stocker des données en utilisant les boucles et les listes.
  • image.py est un module qui permet de stocker des images en utilisant les boucles et les listes.

Cette application va se faire en plusieurs étapes

Voici la première étape

.

html5 video support by EasyHtml5Video.com v3.9.1

Voici la deuxième étape

.

Vidéo

.

Chacun d'entre vous doit faire une version personnelle de cette application

html5 video test by EasyHtml5Video.com v3.9.1

Voici la troisième étape

.

Chacun d'entre vous doit faire une création numérique originale

html5 video test by EasyHtml5Video.com v3.9.1

.

pacman dans un Canevas :

_images/image119.png

# pacman.py

from tkinter import *

fenetre = Tk()

fenetre.title('pacman')

can=Canvas(fenetre,height=180,width=180,bg="ivory")

can.create_arc(20,20,160,160,fill="yellow",outline="black",start=25,extent=305)

can.create_oval(110,50,125,65,fill="black",outline="black")

# Placement du caneavs dans la fenetre

can.grid(row=0, column=0, sticky="nsew")

fenetre.mainloop()


.

Module fenetre :

.

programme Résultat

#fenetre.py

#module de construction de fenetres

#et de nettoyage de la fenetre

from tkinter import *

 

def creer_fenetre(fenetre,titre,taille):

      "modifie une fenêtre"

      fenetre.title(titre)

      fenetre.geometry(taille)

      return fenetre

 

def nettoie_fenetre(fenetre,can,liste_widgets):

      can.delete(ALL)  

      for w in liste_widgets:w.destroy()

      return fenetre,can     

# redimensionne la fenetre
fenetre.geometry(taille)
# affiche le titre dans la fenetre
fenetre.title(titre)


.

Le deplacement :

Pour des informations sur les arcs cliquez ici

.

_images/pacimg1.PNG
Déplacement n°1

#deplacement pacman1.py

from tkinter import *

from fenetre import*

 

def avancer(b1,b2,objet):

     #procédure d'avancement"""

     global x1,y1,x2,y2,largeur,hauteur

     futurx,futury=x2+b1,y2+b2

     if futurx>largeur-distance or futurx<distance:

             b1=-b1

             futurx=b1+x2

     if futury>hauteur-distance or futury<distance:

            b2=-b2

            futury=b2+y2      

     x2,y2=futurx,futury

     can.move(objet[0],b1,b2)

     can.move(objet[1],b1,b2)

 

def touche(event,distance,objet):

    """code reçoit  le n° de la touche"""

    code=event.keycode

    if code==38:   # Up

        avancer(0,-distance,objet)

    elif code==40: # Down

        avancer(0,distance,objet)

    elif code==37:  #Left

        avancer(-distance,0,objet)

    elif code==39:  #Right

        avancer(distance,0,objet)

       

#----------variables--------------#

largeur,hauteur=640,640

x1, y1 = 40, 40

x2,y2=x1,y1

distance=10

titre="Déplacement Pacman"

taille=str(largeur)+"x"+str(hauteur)

 

#------ Programme principal -------#

fenetre=Tk()

fenetre=creer_fenetre(fenetre,titre,taille)

regle=" Appuyer sur les flèches du clavier pour faire bouger Pacman "

texte0=Label(fenetre, text=regle,font="arial 16 bold",fg="blue",bg='white')

can = Canvas(fenetre,bg='light blue',width=largeur,height=hauteur-30)

objet1=can.create_arc(5,5,40,40,fill="yellow",outline="black",start=25,extent=305)

objet2=can.create_oval(27,12,30,16,fill="black",outline="black")

objet=[objet1,objet2]

can.grid(row=1,column=0,columnspan=2)

texte0.grid(row=0,column=0,columnspan=2)

fenetre.bind_all('<Key>',lambda event:touche(event,distance,objet))

fenetre.mainloop()

.

Configurer le pacman :

On vas modifier le code du pacman pour qu’il se retourne , et se mette à manger en se déplaçant.

html5 player by EasyHtml5Video.com v3.9.1

Pour avoir des informations complémentaires sur la configuration des items cliquez

.

Déplacement 02

#deplacement pacman2.py

from tkinter import *

from fenetre import*

 

def avancer(b1,b2,objet):

     #procédure d'avnacement

     global x1,y1,x2,y2,largeur,hauteur,ouvre

     ouvre=ouvre+1

     futurx,futury=x2+b1,y2+b2

     if futurx>largeur-1 or futurx<1:

             b1=-b1

             futurx=b1+x2    

     if futury>hauteur-1 or futury<1:

            b2=-b2

            futury=b2+y2      

     x2,y2=futurx,futury

     if b1<0:can.itemconfigure(objet[0],start=195)   

     if b1>0:can.itemconfigure(objet[0],start=25)

     if ouvre%2==0 :can.itemconfigure(objet[0],extent=305)

     if ouvre%2==1 :can.itemconfigure(objet[0],extent=355)              

     can.move(objet[0],b1,b2)

     can.move(objet[1],b1,b2)

def touche(event,distance,objet):

    #code reçoit  le n° de la touche

    code=event.keycode

    if code==38:   # Up

        avancer(0,-distance,objet)

    elif code==40: # Down

        avancer(0,distance,objet)

    elif code==37:  #Left

        avancer(-distance,0,objet)

    elif code==39:  #Right

        avancer(distance,0,objet)      

#----------variables--------------#

largeur,hauteur=640,640

x1, y1 = 40, 40

x2,y2=x1,y1

distance=10

titre="Déplacement Pacman"

taille=str(largeur)+"x"+str(hauteur)

ouvre=0

#--------------- Programme principal ---------------------#

fenetre = Tk()

titre="Déplacement Pacman"

taille=str(largeur)+"x"+str(hauteur)

fenetre=creer_fenetre(fenetre,titre,taille)

regle="Appuyer sur les flèches \ndu clavier \npour faire bouger \nPacman "

can = Canvas(fenetre,bg='light blue',width=largeur,height=hauteur)

can.create_text(largeur/2,hauteur/2,text=regle,fill='red',font="arial 30 bold")

objet1=can.create_arc(5,5,40,40,fill="yellow",outline="black",start=25,extent=305)

objet2=can.create_oval(27,12,30,16,fill="black",outline="black")

objet=[objet1,objet2]

can.grid(row=1,column=0,columnspan=2)

fenetre.bind_all('<Key>',lambda event:touche(event,distance,objet))

fenetre.mainloop()

.

Le module tableau  :

Pour avoir des informations complémentaire sur la configuration des tableaux cliquez ici

  • Module qui permet de fabriquer des listes et des tableaux.
  • On stocke les données : item , nombres, lettres ….

.

Tableau

#tableau_liste.py

#module de fonctions ,construction

#remplissage, affichage, tri

#de tableaux et de listes

from random import *

from tkinter import *

from math import *

 

def Tableau(ligne,colonne):  

      #fabrication du tableau lignes colonnes

      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

      #qui contient     une  quantité de nombres entiers"

      quantite=len(liste)

      for i in range(quantite):liste[i]=2

      k=0

      while k<quantite-1:

            remelange=False

            numero=randrange(1,quantite+1)

            for j in range(0,quantite):

                  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 fabrique_liste(taille,nombre):

      #construit une liste de taille

      #contenant le même nombre

      liste=[]

      for i in range(taille):liste.append(nombre)

      return liste

 

def cherche(tableau,ligne,colonne,nombre):

      #recherche l'emplacement du nombre dans le tableau"

      #nombre=8 pacman ; nombre = 12 snake

      for ln in range(0,ligne):

                  for cn in range(0,colonne):

                              if tableau[ln][cn]==nombre:

                                         x,y=cn,ln

      # retourne la colonne x et la ligne y

      return x,y

.

Utilisation du module tableau :

.

Pour afficher terminer:

#deplacement pacman3.py

from tkinter import *

from fenetre import*

from tableau import*

def avancer(b1,b2,objet,tableau1):

     #procédure d'avancement

     global x2,y2,largeur,hauteur,ouvre,liste_oeuf

     ouvre=ouvre+1

     futurx,futury=(x2+b1),(y2+b2)

     if futurx>largeur or futurx<0:

             b1=-b1

             futurx=b1+x2    

     if futury>hauteur  or futury<0:

            b2=-b2

            futury=b2+y2  

     if b1<0:

            can.itemconfigure(objet[0],start=195) 

            can.itemconfigure(objet[1],fill='yellow')

            can.itemconfigure(objet[1],outline='yellow')

            can.itemconfigure(objet[2],fill='black')

            can.itemconfigure(objet[2],outline='black')

     if b1>0:

           can.itemconfigure(objet[0],start=25)

           can.itemconfigure(objet[2],fill='yellow')

           can.itemconfigure(objet[2],outline='yellow')

           can.itemconfigure(objet[1],fill='black')

           can.itemconfigure(objet[1],outline='black')    

     if ouvre%2==0 :can.itemconfigure(objet[0],extent=305)

     if ouvre%2==1 :can.itemconfigure(objet[0],extent=355)  

     ln=(int(futury))//distance-1   

     cn=(int(futurx))//distance-1    

     if tableau1[ln][cn]==11:

          can.move(objet[0],0,0)

          can.move(objet[1],0,0)

          can.move(objet[2],0,0)

          x2,y2=x2,y2

     if tableau1[ln][cn]==13:can.delete(liste_oeuf[ln*colonne+cn])

     if tableau1[ln][cn]!=11:

          can.move(objet[0],b1,b2)

          can.move(objet[1],b1,b2)

          can.move(objet[2],b1,b2)

          x2,y2=x2+b1,y2+b2

     can.bind_all('<Key>',lambda event:touche(event,distance,objet,tableau1))

   

 

def touche(event,distance,objet,tableau1):

    #code reçoit  le n° de la touche

    code=event.keycode

    if code==38:   # Up

        avancer(0,-distance,objet,tableau1)

    elif code==40: # Down

        avancer(0,distance,objet,tableau1)

    elif code==37:  #Left

        avancer(-distance,0,objet,tableau1)

    elif code==39:  #Right

        avancer(distance,0,objet,tableau1)

 

def dessine_fond(fenetre,ligne,colonne,distance):

   #Dessine les oeufs et les objets sur le canvas

   global objet ,liste_oeuf

   liste=ligne*colonne*[0]

   liste_oeuf=ligne*colonne*['']

   dix=distance*1/10

   dix1=distance*2/10

   liste=melange(liste)

   tableau1=Tableau(ligne,colonne)

   tableau1[1][1]=5

   liste[0]=5

   liste[1]=0

   for ln in range(ligne):

           for cn in range(colonne):

                   cx,cy,=cn*distance,ln*distance

                   cx1,cy1=(cn+1)*distance,(ln+1)*distance

                 

                   if liste[ln*colonne+cn]%9==0:

                           tableau1[ln][cn]=13

                           item=can.create_oval(cx+dix1,cy+dix,cx1-dix1,cy1-dix,\

                            fill='orange',outline='white',width=8)

                           liste_oeuf[ln*colonne+cn]=item

                   if  liste[ln*colonne+cn]%9==4:

                           tableau1[ln][cn]=11

                           can.create_rectangle(cx,cy,cx1,cy1,fill='blue',outline='red')

                   if liste[ln*colonne+cn]%9!=4 and liste[ln*colonne+cn]%9!=0 :

                        tableau1[ln][cn]=0

                      

   tableau1[0][0]=5

   return tableau1

 

 

def jouer(fenetre,ligne,colonne,distance,):

     #fonction qui fait débuter le jeu

     tableau1=dessine_fond(fenetre,ligne,colonne,distance)

     objet1=can.create_arc(5,5,distance,distance,fill="yellow",outline="black",start=25,extent=305)

     objet2=can.create_oval(int(7/11*distance),3/11*distance,distance*8/11,4/11*distance,fill="black",outline="black")

     objet3=can.create_oval(int(5/11*distance),3/11*distance,distance*6/11,4/11*distance,fill="yellow",outline="yellow")

     objet=[objet1,objet2,objet3]

     can.bind_all('<Key>',lambda event:touche(event,distance,objet,tableau1))

 

#----------variables--------------#

ligne,colonne=16,35

largeur,hauteur=1500,1000

distance=int(largeur/colonne)

hauteur=ligne*distance

x1, y1 = distance, distance

x2,y2=x1,y1

titre="Déplacement Pacman"

taille=str(largeur)+"x"+str(hauteur)

ouvre=0

#--------------- Programme principal ---------------------#

fenetre = Tk()

taille=str(largeur)+"x"+str(hauteur)

fenetre=creer_fenetre(fenetre,titre,taille)

regle="Appuyer sur les flèches \ndu clavier \npour faire bouger \nPacman "

can = Canvas(fenetre,bg='light blue',width=largeur,height=hauteur)

can.create_text(largeur/2,hauteur/2,text=regle,fill='red',font="arial 30 bold")

can.grid(row=1,column=0,columnspan=2)

jouer(fenetre,ligne,colonne,distance)

fenetre.mainloop()