Programme girafe.py


# coding: latin-1
import pygame
import time

def attendre_touche () :
    """cette fonction retourne différente valeur selon la touche pressée :
       - right : pour la flèche droite
       - gauche : pour la flèche gauche
       - up : pour la flèche haut
       - down : pour la flèche bas
       - quit : pour la touche ESC ou ECHAP
       - '' : chaîne vide pour aucune touche pressée
    """
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONUP : return "clic"
        elif event.type == pygame.KEYDOWN : 
            if event.key == 275 : return "right"
            elif event.key == 276 : return "left"
            elif event.key == 273 : return "up"
            elif event.key == 274 : return "down"
            elif event.key == 27 : return "quit"
            else :
                pass
                #print "key ", event.key
        else :
            #print event
            pass
    return ""
       
       
class ImagePosition :
    """chaque image présente sur le disque dur doit être chargée en
    mémoire (self.image), cette image est affichée à l'écran (self.screen),
    à une position donnée (self.pos),
    si cette image est en fait un motif sur fond blanc, on peut préciser
    à l'ordinateur que ce fond blanc doit laisser apparaître le fond de l'écran
    """
    def __init__ (self, image, pos, screen, transparent = False) :
        """initialisation
           - image : nom d'image
           - pos : position ou afficher l'image
           - screen : variable modélisant l'écran
           - transparent : l'image est-elle un motif dont le fond blanc
                           doit être transparent ?
        """
        self.image  = pygame.image.load (image)
        self.x      = pos [0]
        self.y      = pos [1]
        self.screen = screen
        if transparent : 
            # on précise ici que la couleur blanche (255,255,255)
            # doit être transparent
            self.image.set_colorkey ((255,255,255))
        
    def display (self, transparent = False) :
        """affiche l'image à une position donnée sur l'écran"""
        screen.blit (self.image, (self.x, self.y))
        
def affiche (images) :
    """affiche une liste d'image dans l'ordre dans lequel elles
    apparaissent dans la liste"""
    white  = (255,255,255)
    images [0].screen.fill (white) # met tout en blanc avant de dessiner les images
    for i in images :
        i.display ()
        
def deplacer_avion (images, avion, explosion, sounds, limitx) :
    """jeu, sans pression d'aucun touche, l'avion se déplace 
    vers les deux girafes et fait tout exploser, on peut ralentir
    l'approche de l'avion en :
        - pressant les touches de directions
        - en frappant sans s'arrêter et alternativement les touches gauche droite
    """
    pair = 0   # pair : il faut presser la flèche gauche, impair, flèche droite
    tour = 0   # compte le nombre de tour d'attente, sert à réduire 
               # l'impact des touches pressées par le joueur
    
    # séquence de trois instructions affichant le jeu
    affiche (images)    # on affiche le ciel et les girafes
    avion.display ()    # on affiche l'avion
    pygame.display.flip ()  # on rafraîchit l'écran
    
    # on regarde si une touche a été pressée
    t = attendre_touche ()  
    
    # pour afficher le score
    font = pygame.font.Font ("freesansbold.ttf", 15)    
    
    # le jeu s'arrête lorsqu'on presse la touche ECHAP ou si l'avion
    # touche les girafes
    while t != "quit" and avion.x < limitx :
    
        # on compte le nombre de tours
        tour += 1    
        # en fonction de ce nombre de tour, on détermine l'impact d'une 
        # séquence gauche droite
        dx    = max ((400 - tour) / 100, 1)
        
        # si une touche a été pressée, alors :
        if t == "left" : # flèche gauche
            avion.x -= 1
            if pair % 2 == 0 : 
                avion.x -= dx
                pair += 1
                
        elif t == "right" :  # flèche droite
            avion.x += 1
            if pair % 2 == 1 :
                avion.x -= dx
                pair += 1
                
        elif t == "up" :   # flèche haut
            avion.y -= 1
            
        elif t == "down" : # flèche bas
            avion.y += 1
            
            
        # quelque soit la touche pressée, on actualise le jeu
        # c'est la même séquence de trois touches qu'au début de la fonction
        affiche (images)
        avion.display ()
        
        # on affiche le score également à l'écran
        text = font.render ("score " + str (avion.y), True,(255,255,255))
    
        screen.blit(text, (100,100)) 
            
        pygame.display.flip ()
        
        # le programme attend 50 millisecondes avant de continuer
        time.sleep (0.05)
        
        # on déplace l'avion de force
        avion.x += 2
        avion.y += 1
        
        # on regarde si une touche a été pressée
        t = attendre_touche ()
        
    # on est sorti de la boucle : c'est l'explosion
    # on affiche l'image et on rafraîchit l'écran
    explosion.display ()
    pygame.display.flip ()
    
    # on joue quelques sons
    for i in range (0, len (sounds)) :
        sounds [i].play ()
        time.sleep (1.0*i)  # on attend un peu avant de passer au son suivant
                            # il est possible de ne pas attendre et de tous les 
                            # lancer en même temps
                            
    # on rejoue les sons d'explosion 2 fois séparées de 2 secondes
    for i in range (0, 2) :
        sounds [0].play ()
        sounds [1].play ()
        time.sleep (2.0)

    # on affiche le score : plus l'avion descend, meilleur on est
    print "score ", avion.y
    
    # on affiche le score également à l'écran
    text = font.render ("score " + str (avion.y), True,(255,255,255))
    
    screen.blit(text, (100,100)) 
    pygame.display.flip ()
        
    # on attend la pression de la touche ECHAP avant de quitter le programme
    while t != "quit" :
        t = attendre_touche ()
        

if __name__ == "__main__" :
    
    # initialisation du module pygame
    pygame.init ()

    # on récupère la taille de l'image de la girafe
    sizeim = pygame.image.load("girafe.jpg").get_size ()
    
    # on définit la taille de l'écran comme 3 fois plus large que celle de la girafe
    size   = ( sizeim [0] * 3, sizeim [1])
    screen = pygame.display.set_mode (size)
    
    # on définit l'image de l'avion
    avion       = ImagePosition ("avion.PNG", (0,0), screen, True)
    
    # on définit l'image de l'explosion
    explosion   = ImagePosition ("explosion.jpg", (0,0), screen)
    
    # on estime la limite au delà de laquelle l'avion explose
    limitx      = size [0] - sizeim [0] + sizeim [0] / 3 - avion.image.get_size () [0]
        
    # on définit les sons qui doivent être joués à la fin du jeu
    soundname   = ["bomb.wav", "explosion.wav", "explosion2.wav", "missile.wav", "sheep.wav"]
    sounds = []
    for s in soundname :
        try :
            # exception au cas où le son ne pourrait pas être lu
            sounds.append ( pygame.mixer.Sound (s) )
        except Exception, e :
            print "impossible de charger ", s
            print e

    # on construit la liste des images qui doivent être affichées à chaque fois
    images = []
    images.append ( ImagePosition ("ciel.jpg", (0,0), screen) )
    images.append ( ImagePosition ("girafe.jpg", (size [0] - sizeim [0], 0), screen) )
    
    # on joue
    deplacer_avion (images, avion, explosion, sounds, limitx)
    

créé avec py2html version:0.62