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
× 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.