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

 

 

     


educationdunumerique.fr. Tous  droits réservés. D Pérarnaud Limoges.