Jeu jetpack joyride en python

leou - Modifié le 19 févr. 2025 à 14:20
 fluo - 18 févr. 2025 à 06:30

Bonjour,

Je souhaite refaire le jeu jetpack joyride en python. Je le fais sur le site pyxel studio. Je ne suis pas très bon en python, mais j'ai réussi à avoir une bonne base sur mon jeu.

Toutefois, je rencontre plusieurs problèmes comme pour faire apparaître des missiles qui arrivent de droite à gauche. Sur mon code je ne trouve aucun problème mais quand je lance, il n'y a aucun missile qui apparaît. 

Voici mon code : 

import pyxel
import random

# Initialisation de la fenêtre
pyxel.init(128, 128, title="Nuit du c0de")
pyxel.load("res.pyxres")

# Position initiale du vaisseau
vaisseau_x = 30
vaisseau_y = 60

# Variables pour la gravité et le déplacement vertical
gravite = 0.55
saut_force = -4.5
vitesse_y = 0

# Position et taille du bloc
bloc_x = 128
bloc_y = random.randint(0, 120)
bloc_couleur = 9

# Nombre de vies du vaisseau
vies = 3

# État du jeu
game_over = False

# Animation
sprite_index = 0
animation_frame_count = 0

# Variables pour la taille et orientation des blocs
bloc_largeur = 8
bloc_hauteur = random.randint(32, 64)
bloc_orientation = random.choice(["horizontal", "vertical"])

# Carburant
carburant_max = 100
carburant = carburant_max
carburant_consommation = 1
carburant_recharge = 1

# Pièces
pieces = []  # Liste pour stocker les pièces
piece_spawn_delay = 30  # Délai entre l'apparition des pièces

# Score
score = 0

# Missiles
missiles = []  # Liste pour stocker les missiles
missile_spawn_delay = 60  # Délai entre l'apparition des missiles

def vaisseau_deplacement(y, vitesse_y):
    """Déplacement vertical du vaisseau avec gestion du carburant"""
    global carburant

    vitesse_y += gravite

    if pyxel.btn(pyxel.KEY_UP) and carburant > 0:
        vitesse_y = saut_force
        carburant -= carburant_consommation

    if y >= 112:  # Rechargement lorsque le vaisseau est au sol
        carburant = min(carburant + carburant_recharge, carburant_max)

    y += vitesse_y
    if y > 112:
        y = 112
        vitesse_y = 0
    if y < 0:
        y = 0
        vitesse_y = 0

    return y, vitesse_y
def update_animation():
    """Met à jour l'animation du vaisseau."""
    global sprite_index, animation_frame_count

    if pyxel.btn(pyxel.KEY_UP) and carburant > 0:  # Si le vaisseau monte
        animation_frame_count += 1
        if animation_frame_count % 5 == 0:  # Change d'image toutes les 5 frames
            sprite_index = 4 + (sprite_index % 3)  # Nouveaux sprites pour la montée (indices 4, 5 et 6)
    elif vaisseau_y == 112:  # Si le vaisseau est au sol
        if pyxel.frame_count % 5 == 0:
            sprite_index = (sprite_index + 1) % 3  # Images normales au sol (indices 0, 1, 2)
    else:
        sprite_index = 0  # Image de base sinon


def collision_bloc(vaisseau_x, vaisseau_y, bloc_x, bloc_y, bloc_largeur, bloc_hauteur, bloc_orientation):
    """Vérifie si le vaisseau touche le bloc"""
    if bloc_orientation == "horizontal":
        return (
            vaisseau_x < bloc_x + bloc_hauteur and
            vaisseau_x + 16 > bloc_x and
            vaisseau_y < bloc_y + bloc_largeur and
            vaisseau_y + 16 > bloc_y
        )
    else:
        return (
            vaisseau_x < bloc_x + bloc_largeur and
            vaisseau_x + 16 > bloc_x and
            vaisseau_y < bloc_y + bloc_hauteur and
            vaisseau_y + 16 > bloc_y
        )

def spawn_missile():
    """Génère un missile à une position aléatoire"""
    missile_x = 128  # Apparaît à droite de l'écran
    missile_y = random.randint(0, 120)  # Position verticale aléatoire
    missiles.append((missile_x, missile_y))
    
    
def update():
    """Mise à jour des variables (30 fois par seconde)"""
    global vaisseau_y, vitesse_y, bloc_x, bloc_y, vies, game_over, bloc_hauteur, bloc_largeur, bloc_orientation, score, piece_spawn_delay, missile_spawn_delay

    if game_over:
        if pyxel.btnp(pyxel.KEY_R):
            reset_game()
        return

    # Déplacement vertical du vaisseau
    vaisseau_y, vitesse_y = vaisseau_deplacement(vaisseau_y, vitesse_y)
    update_animation()

    # Défilement des obstacles
    bloc_x -= 2
    if bloc_x < -bloc_largeur:
        bloc_x = 128
        bloc_y = random.randint(0, 120)
        bloc_hauteur = random.randint(32, 64)
        bloc_orientation = random.choice(["horizontal", "vertical"])

    # Gestion des collisions avec les obstacles
    if collision_bloc(vaisseau_x, vaisseau_y, bloc_x, bloc_y, bloc_largeur, bloc_hauteur, bloc_orientation):
        vies -= 1
        if vies <= 0:
            game_over = True
        else:
            bloc_x = 128
            bloc_y = random.randint(0, 120)
            bloc_hauteur = random.randint(32, 64)
            bloc_orientation = random.choice(["horizontal", "vertical"])

    # Générer des missiles
    missile_spawn_delay -= 1
    if missile_spawn_delay <= 0:
        spawn_missile()
        missile_spawn_delay = random.randint(30, 60)  # Délai aléatoire entre 1 et 2 secondes

    # Déplacer les missiles et vérifier les collisions
    for missile in missiles[:]:
        missile_x, missile_y = missile
        missile_x -= 4  # Déplacer le missile vers la gauche
        if missile_x < -8:  # Supprimer le missile s'il sort de l'écran
            missiles.remove(missile)
        elif collision_missile(vaisseau_x, vaisseau_y, missile_x, missile_y):
            missiles.remove(missile)
            vies -= 1  # Perdre une vie en cas de collision
            if vies <= 0:
                game_over = True
def collision_missile(vaisseau_x, vaisseau_y, missile_x, missile_y):
    """Vérifie si le vaisseau touche un missile"""
    return (
        vaisseau_x < missile_x + 8 and
        vaisseau_x + 16 > missile_x and
        vaisseau_y < missile_y + 8 and
        vaisseau_y + 16 > missile_y
    )

def reset_game():
    """Réinitialise le jeu pour recommencer"""
    global vaisseau_y, vitesse_y, bloc_x, bloc_y, vies, game_over, bloc_hauteur, bloc_largeur, bloc_orientation, carburant, pieces, score
    vaisseau_y = 60
    vitesse_y = 0
    bloc_x = 128
    bloc_y = random.randint(0, 120)
    vies = 3
    game_over = False
    bloc_largeur = 8
    bloc_hauteur = random.randint(32, 64)
    bloc_orientation = random.choice(["horizontal", "vertical"])
    carburant = carburant_max
    pieces = []  # Réinitialiser la liste des pièces
    score = 0  # Réinitialiser le score

def draw_carburant():
    """Dessine uniquement le texte indiquant le carburant en haut à gauche, sous les vies"""
    pyxel.text(5, 15, f"Carburant: {carburant}%", pyxel.COLOR_WHITE)

def update():
    """Mise à jour des variables (30 fois par seconde)"""
    global vaisseau_y, vitesse_y, bloc_x, bloc_y, vies, game_over, bloc_hauteur, bloc_largeur, bloc_orientation, score, piece_spawn_delay

    if game_over:
        if pyxel.btnp(pyxel.KEY_R):
            reset_game()
        return

    # Déplacement vertical du vaisseau
    vaisseau_y, vitesse_y = vaisseau_deplacement(vaisseau_y, vitesse_y)
    update_animation()

    # Défilement des obstacles
    bloc_x -= 2
    if bloc_x < -bloc_largeur:
        bloc_x = 128
        bloc_y = random.randint(0, 120)
        bloc_hauteur = random.randint(32, 64)
        bloc_orientation = random.choice(["horizontal", "vertical"])

    # Gestion des collisions avec les obstacles
    if collision_bloc(vaisseau_x, vaisseau_y, bloc_x, bloc_y, bloc_largeur, bloc_hauteur, bloc_orientation):
        vies -= 1
        if vies <= 0:
            game_over = True
        else:
            bloc_x = 128
            bloc_y = random.randint(0, 120)
            bloc_hauteur = random.randint(32, 64)
            bloc_orientation = random.choice(["horizontal", "vertical"])

def draw():
    """Dessine les éléments du jeu"""
    pyxel.cls(0)

    if game_over:
        pyxel.text(40, 60, "GAME OVER", pyxel.COLOR_RED)
        pyxel.text(20, 80, "Appuyez sur R pour rejouer", pyxel.COLOR_WHITE)
    else:
        # Dessiner l'arrière-plan
        pyxel.rect(0, 0, 128, 128, 3)
        # Dessiner le vaisseau
        u = sprite_index * 16
        pyxel.blt(vaisseau_x, vaisseau_y, 0, u, 0, 16, 16, 0)
        # Dessiner les obstacles
        if bloc_orientation == "horizontal":
            pyxel.rect(bloc_x, bloc_y, bloc_hauteur, bloc_largeur, bloc_couleur)
        else:
            pyxel.rect(bloc_x, bloc_y, bloc_largeur, bloc_hauteur, bloc_couleur)
        # Dessiner les missiles
        for missile_x, missile_y in missiles:
            pyxel.blt(missile_x, missile_y, 0, 0, 32, 16, 16, 0)  # Assure-toi que la texture du missile est correctement positionnée


        # Dessiner le HUD
        pyxel.text(5, 5, f"Vies: {vies}", pyxel.COLOR_WHITE)
        pyxel.text(100, 5, f"Score: {score}", pyxel.COLOR_WHITE)
        draw_carburant()
        
        
        pyxel.text(5, 5, f"Vies: {vies}", pyxel.COLOR_WHITE)
        pyxel.text(100, 5, f"Score: {score}", pyxel.COLOR_WHITE)
        draw_carburant()


pyxel.run(update, draw)
A voir également:

2 réponses

Bonjour,

on y verrait plus clair si tu affichais ton code avec les balises de code

cliquer ici: 


Visuellement, ça doit ressembler à ça:

#Test
for k in range(10):
    print(k)
0

Salut,

Je suppose que ton script est inspiré de https://nuit-du-code.forge.apps.education.fr/DOCUMENTATION/PYTHON/TUTORIELS/1-premiers-pas-avec-pyxel-premiere/

Le problème de ton code est que tu as deux fonctions update, la seconde doit, je pense, être supprimée.

0