Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problèmes avec pygame et turtle

    21 mai 2018 à 12:09:28

    Bonjour à tous,

    Je tente de faire avec des amis un clone de Python, cependant plusieurs soucis se posent à moi. Tout d'abord, les sons ne se lancent pas sur mon pc (Win10) et la console m'annonce que "pygame.error:unable to open file 'son_laser.wav'"

    Ce qui est tout à fait étonnant car un collègue est capable de lancer ce programme sans soucis.
    De plus, des fonctions turtles, je souhaiterai que quand je clique à un endroit particulier de mon écran, que ma fenêtre se ferme et se realnce (pour dans le futur avoir un fichier high score). J'ai esséyé : "os.execl(sys.executable, sys.executable, *sys.argv)" ca n'a pas relancé ma fenêtre,

    Auriez vous des conseils ou des remarques à faire en premier lieu sur mon code, puis sur mes soucis ?

    Merci d'avance

    Un zero

    #French History Invaders
    ##########################################
    #                                        #
    #  Programme : Space Invaders History    #
    #  Auteurs : Julien L., Philip K, Hugo S.#
    #  Date de creation : 19.05.2018         #
    #                                        #
    ##########################################
    
    ###########################################
    #                                         #
    #  Importations des fonctions nécessaires #
    #                                         #
    ###########################################
    
    import turtle
    import os
    import math
    import random
    import time
    import sys
    import pygame.mixer
    
    from pygame.locals import *
    pygame.init()
    
    
    ############################
    #                          #
    # Définition des variables #
    #                          #
    ############################
    #Definition des différents sond que l'on va utiliser
    son1 = pygame.mixer.Sound("son_laser.wav")
    son2 = pygame.mixer.Sound("son_explosion.wav")
    son3 = pygame.mixer.Sound("son_over.wav")
    
    
    #Mis en place d'un fond
    wn = turtle.Screen() #Definition de WN (Window-> fenetre) comme terrain de jeu
    wn.bgcolor("black") #Choix de la couleur du fond d'ecran : noir
    wn.title("Space Invaders") #Définition d'un nom pour cette fenetre
    wn.bgpic("space_invaders_background.gif") #Definition d'une image en fond "space_invaders_background.gif" qui se situe dans le meme fichier que le progrramme
    
    #Recupere les images des ennemis
    turtle.register_shape("invader.gif") #Definit la forme de l'ennemi selon une image dans le dossier contenant notre programme
    
    #On dessine les bordures dans lesquelles le jeu va se joue
    border_pen = turtle.Turtle() #Creation d'une tortue (qqc de fixe)
    border_pen.speed(0) #Creation de ces frontieres le plus rapidement que possible
    border_pen.color("white") #On regle la couleur du stylo en blanc
    border_pen.penup()#On leve le crayon pour ne pas laisser de marquer sur son passage
    border_pen.setposition(-400,-300) #Definition des nouvelles coordonees du crayon
    border_pen.pendown() #On pose le crayon pour garder une trace de ses déplacements
    border_pen.pensize(3) #On choisit la taile d'epaisseur du crayon
    for side in range(4): #On dessine une forme qui a quatre cotes
        border_pen.fd(600) #On definit la taille/distance des cotes
        border_pen.lt(90) #On definit l'angle entre deux cotes
    border_pen.hideturtle() #On cache la tortue
    
    #Definit le score du début de la partie à 0 en creant une nouvelle variable
    score = 0
    
    #On dessine le score
    score_pen = turtle.Turtle() #Creation d'une autre tortue
    score_pen.speed(0)  #Creation du score quasi instantannee
    score_pen.color("white") #On choisit la couleur avec laquelle le crayon va ecrire le score
    score_pen.penup() #On leve le crayon pour ne pas laisser de marquer sur son passage
    score_pen.setposition(-390, 275) #Definition des nouvelles coordonees du crayon (la ou l'on souhaite voir le score)
    scorestring = "Score: %s" %score # On cree une corde qui sera remplace lorsqu'on y introduit comme valeur
    score_pen.write(scorestring, False, align="left", font=("Arial", 15, "bold")) #On ecrit ce score qu'on aligne a gauche des coordonnees avec une police particuliere
    score_pen.hideturtle() #On cache la tortue
    
    #Creation de la turtle du joueur
    player = turtle.Turtle() #On definit une tortue pour le joueur
    player.color("blue") #On donne la couleur bleu au joueur
    player.penup() #On leve le crayon pour ne pas avoir de "trace"
    player.speed(0) #On dessine le joueur le plus rapidement que possible
    player.shapesize(2.5, 2.5) #On multiplie sa taille par 2,5 en x et en y
    player.setposition(-200, -250) #Coordonnees du joueur
    player.setheading(90) #On reoriente le triangle pour avoir la "tete" vers le haut
    
    playerspeed = 15 #On definit le pas du joueur
    
    #Choisit le nombre d'ennemi que l'on pourra faire varier par la suite
    number_of_enemies = 5
    
    #Cree une liste vide des ennemis denote par ces crochets
    enemies = []
    
    #Ajoute des enemis à la liste
    for i in range(number_of_enemies): #Boucle allant de 1 au nombre d'enemis
        enemies.append(turtle.Turtle()) #Créer un enemi
    
    for enemy in enemies: #Attribution des characteres à chaque enemi de la liste enemies
        enemy.shape("invader.gif") #Attribution de la forme de l'aspect visuel de chaque enemi
        enemy.shapesize(3, 3) #On multiplie sa taille par 2 en x et en y
        enemy.penup()
        enemy.speed(0) #Attribution par default de la vitesse de chaque enemi
        x = random.randint(-350, 0) #On definit au hasard l'abscisse d'apparition de l'enemi VALEUR D'origine -200 200
        y = random.randint(200, 260) #On definit au hasard l'ordonnée d'apparition de l'enemi VALEUR D'origine 100 250
        enemy.setposition(x, y) #On fait apparaitre l'enemi a partir des coordonés tirés aux hasard
    
    
    enemyspeed = 10 #On definit un pas pour l'ennemi inferieur à celui du joueur pour pouvoir etre ratrappe par ce dernier
    
    
    #Creation du missile lance par le joueur
    bullet = turtle.Turtle() #On cree une nouvelle tortue
    bullet.color("yellow") #on définit la couleur du missile
    bullet.shape("circle") #on definit la forme du missile
    bullet.penup() #On leve le crayon pour ne pas avoir de "trace"
    bullet.speed(0)  #Attribution par default de la vitesse du missile
    bullet.shapesize(0.7, 0.7) #On multiplie sa taille par 0,7 en x et en y
    bullet.hideturtle() #Cache la tortue
    
    bulletspeed = 20 #Definition du passe de cette tortue bien plus rapide que le joueur et l'ennemi
    
    #On definit l'etat du missile
    #ready - pret a etre tirer
    #fire - missile tire
    bulletstate = "ready"
    #wait attends d'être débloquer
    
    #####################################
    #                                   #
    # Définition de nouvelles fonctions #
    #                                   #
    #####################################
    
    #Mouvement du joueur de droite et gauche
    def move_left(): #création d'une fonction pour aller a gauche
        x = player.xcor()  #On recupere les coordonnees du joueur sur ici l'axe x
        x -= playerspeed #On soustraitl'abscisse du joueur par le pas defini
        if x < -380: #On definit les limites du joueurs, si il depasse l'absicisse -280
            x = - 480 #Alors x ne varie pas
        player.setx(x)  #On definit les coordonnees de x en fonction de ce nouveau x
    
    def move_right(): #création d'une fonction pour aller a droite
        x = player.xcor() #On recupere les coordonnees du joueur sur ici l'axe x
        x += playerspeed #On soustraitl'abscisse du joueur par le pas defini
        if x > 180: #On definit les limites du joueurs, si il depasse l'absicisse 280
            x = 20 #Alors x ne varie pas
        player.setx(x) #On definit les coordonnees de x en fonction de ce nouveau x
    
    def left_click(x_click, y_click):
        if 250<=x_click <= 454 and 239<=y_click<=376:
              for enemy in enemies : # on traite les enemies 1 par 1
                    enemy.hideturtle() # on cache le turtle de l'enemi
        if 250<=x_click <= 454 and -239>=y_click>=-376:
            turtle.exitonclick()
    
    
    
    
    #On definit une fonction pour tirer le missile
    #On declare la variable missile comme global en cas on a besoin de la modifier hors de la fonction
    def fire_bullet():
        global bulletstate #on declare la fonction "globale", c'est à dire que les changements fais sur cette fonction  auront aussi lieu en dehors de la fonction "fire_bullet"
        if bulletstate == "ready": #La condition permet d'obliger le joueur a attendre que le missile lancé ai disparu pour en lancer un autre
            son1.play() #joue le son de missile
            bulletstate = "fire" #change l'etat du missile s'il est pres a etre envoyé
            #Deplace le "missile" juste au dessus du joueur", donc on definit les coordonnees du missile en fonction de notre joueur
            x = player.xcor() #Donner au missile la meme abscisse que le joueur
            y = player.ycor() + 15 #Ajouter 15 à l'ordonnee du joueur pour avoir le missile "au dessus" du joueur
            bullet.setposition(x, y) #On definit les coordonees du missile en fonction de ces nouvelles variables
            bullet.showturtle() #on fait apparaitre le turtle
    
    
    def isCollision(t1, t2): #Cette fonction permet de definir quand un enemi est touché par le missile
        distance = math.sqrt(math.pow(t1.xcor()-t2.xcor(),2)+math.pow(t1.ycor()-t2.ycor(),2)) #on calcule la distance entre le missile et l'enemi, distance = racine carre(((difference des abscisses)^2)+((difference des ordonnees)^2))
        if distance < 15: #si la distance entre le missile et l'enemi est inferieure a 15 :
            return True #la fonction retourne vrai
        else:
            return False #sinon la fonction retourne Faux
    
    
    
    #On "enregistre" et transmet les informtiaons provenant du clavier des endroits précis
    turtle.listen()
    turtle.onkey(move_left, "Left") #Par exemple, lorsqu'on appuie le touche du clavier "left" la fonction move_left est activee
    turtle.onkey(move_right, "Right")
    turtle.onkey(fire_bullet, "space")
    wn.onclick(left_click,btn=1, add=None)
    
    #################################
    #                               #
    # Boucle principal du programme #
    #                               #
    #################################
    while True:
    
        for enemy in enemies:
             #On deplace l'ennemi (pareillement que la fonction move_)
            x = enemy.xcor()
            x += enemyspeed
            enemy.setx(x)
    
        #Une fois que l'ennemi atteint une frontiere a droite ou a gauche, on veut que l'ennemi aille dans le sens inverse et un etage plus bas
            if enemy.xcor() > 180: #Frontiere a droite
                for e in enemies:
                    y = e.ycor()
                    y -= 40  #On soustrait 40 à y et assigne comme le resultat à y
                    e.sety(y) #On redefinit l'ordonnee de l'ennemi par le nouveau y
                enemyspeed *= -1 #On multiplie le pas de l'ennnemi par -1 pour que l'ennemi aille du sens inverse
    
            if enemy.xcor() < -380: #Frontière à gauche
                for e in enemies:
                    y = e.ycor()
                    y -= 40 #On soustrait 40 à y et assigne comme le resultat à y
                    e.sety(y) #On redefinit l'ordonnee de l'ennemi par le nouveau y
                enemyspeed *= -1 #On multiplie le pas de l'ennnemi par -1 pour que l'ennemi aille du sens inverse
    
    
    
    
            #Verifier une collision entre la balle et l'ennemi
            if isCollision(bullet, enemy):
                son2.play()
                #Reinitialiser le tir
                bullet.hideturtle() #Si collision, la balle disparait.
                bulletstate = "ready" #Nouvelle balle se reprépare
                bullet.setposition(0, -400)
                #Reinitialiser l'ennemi
                x = random.randint(-200, 200) #nouvelle position de l'ennemi aléatoire sur les abscisses
                y = random.randint(100, 250) #nouvelle position de l'ennemi aléatoire sur les ordonnées
                enemy.setposition(x, y)
                #Mettre a jour le score
                score += 10 #quand je touche un joueur, je gagne 10 points"
                scorestring = "Score: %s" %score
                score_pen.clear()
                score_pen.write(scorestring, False, align="left", font=("Arial", 14, "bold"))
    
            if enemy.ycor() < -245: #Si un enemy descend en dessous de -245
                son3.play() #on joue le son game over
                player.hideturtle() # on cache le turtle du joueur
                bullet.hideturtle() # on cache le turtle du de la balle pour qu'il ne puisse plus tirer
                for enemy in enemies : # on traite les enemies 1 par 1
                    enemy.hideturtle() # on cache le turtle de l'enemi
                wn.bgpic("gameover.gif")  #Fin de lapartie et recommencer
                bulletstate = "fire"
                break
    
    
        #Deplacer la balle
        if bulletstate == "fire":
            y = bullet.ycor()
            y += bulletspeed
            bullet.sety(y)
    
        #Deplacer la balle
        if bulletstate == "wait":
            y = bullet.ycor()
            y = 0
            bullet.sety(y)
    
        #Verifier si la balle est aller jusqu'en haut
        if bullet.ycor() > 290: #Si la balle atteint le haut de l'écran
            bullet.hideturtle() #Alors elle disparait
            bulletstate = "ready" #Une autre balle se prepare alors à être lancer
    

    -
    Edité par HugoSérié 21 mai 2018 à 12:12:16

    • Partager sur Facebook
    • Partager sur Twitter

    Problèmes avec pygame et turtle

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown