Samuel Arthur Paul (Notre-Dame 2026, Terminale)

UNIVERS / THÈME CHOISI:

Univers 3 MODE D'EMPLOI

Appuyez sur "espace" pour sauter

PRÉSENTATION / EXPLICATIONS

Pour jouer à notre jeu "KiriRun" :

Appuyez sur "espace" pour sauter au dessus des caisses.

Si une caisse vous touche : "Game Over".

Si la musique vous rend fou, c'est normal.

Code Python
import pyxel
import random

LARGEUR, HAUTEUR, POSITION_SOL = 128, 128, 112
nuage1, nuage2, nuage3 = (70, 117, 7, 4), (81, 115, 13, 8), (98, 116, 11, 5)
obstacle1, obstacle2 = (80, 16, 16, 16), (96, 16, 16, 16)
sol = (3, 0, 40, 16)

MOUV1 = (48, 128, 16, 16)
MOUV2 = (48, 144, 16, 16)
MOUV3 = (48, 112, 16, 16)

def initialiser_jeu():
    pyxel.playm(0,sec=0,loop=True)
    return {
        "position_x": 20,
        "position_y": POSITION_SOL - 16,
        "vitesse_verticale": 0,
        "en_saut": False,
        "direction": "r",
        "obstacles": [],
        "nuages": [],
        "score": 0,
        "game_over": False,
        "temps_ecoule": 0
    }

def mettre_a_jour_jeu(etat):
    if etat["game_over"]:
        return initialiser_jeu() if pyxel.btnp(pyxel.KEY_SPACE) else etat

    nouvel_etat = dict(etat)
    nouvel_etat["temps_ecoule"] += 1
    nouvel_etat["score"] += 1

    # Physique
    if pyxel.btnp(pyxel.KEY_SPACE) and not nouvel_etat["en_saut"]:
        pyxel.play(2, 1, sec=0, loop=False, resume=False)
        nouvel_etat["vitesse_verticale"] = -5.5
        nouvel_etat["en_saut"] = True

    nouvel_etat["vitesse_verticale"] += 0.35
    nouvel_etat["position_y"] += nouvel_etat["vitesse_verticale"]

    if nouvel_etat["position_y"] >= POSITION_SOL - 16:
        nouvel_etat["position_y"] = POSITION_SOL - 16
        nouvel_etat["vitesse_verticale"] = 0
        nouvel_etat["en_saut"] = False

    nouvel_etat = gestion_nuage(nouvel_etat)
    nouvel_etat = gestion_obstacles(nouvel_etat)

    return nouvel_etat

def dessiner_jeu(etat):
    pyxel.cls(1)

    # Dessin des nuages
    for nuage in etat["nuages"]:
        pyxel.blt(
            nuage["position_x"], nuage["position_y"], 0, 
            nuage["forme"][0], nuage["forme"][1], nuage["forme"][2], nuage["forme"][3], 
            1, rotate=0, scale=nuage["taille"]
        )

    # Dessin du sol
    for i in range(5):
        pyxel.blt(40 * i, HAUTEUR - 16, 0, sol[0], sol[1], sol[2], sol[3], 1)

    pyxel.text(5, 5, f"Score : {etat['score']}", 7)

    # Animation du personnage
    if etat["en_saut"]:
        sprite_courant = MOUV1
    else:
        etape_animation = (etat["temps_ecoule"] // 6) % 4
        if etape_animation == 0:
            sprite_courant = MOUV1
        elif etape_animation == 1:
            sprite_courant = MOUV3  
        elif etape_animation == 2:
            sprite_courant = MOUV2
        else:
            sprite_courant = MOUV3  

    pyxel.blt(etat["position_x"], etat["position_y"] + 1, 0, sprite_courant[0], sprite_courant[1], 16, 16, 1)

    for obstacle in etat["obstacles"]:
        taille_bloc_x = obstacle["forme"][2]
        taille_bloc_y = obstacle["forme"][3]

        for lg in range(obstacle["longueur"]):
            for larg in range(obstacle["largeur"]):
                pyxel.blt(
                    obstacle["position_x"] + (lg * taille_bloc_x), 
                    obstacle["position_y"] + (larg * taille_bloc_y), 
                    0, 
                    obstacle["forme"][0],
                    obstacle["forme"][1],
                    taille_bloc_x,
                    taille_bloc_y,
                    0
                )

    if etat["game_over"]:
        pyxel.stop()
        pyxel.text(50, 55, "GAME OVER", 8)
        pyxel.text(30, 65, "ESPACE POUR REJOUER", 7)

def gestion_nuage(etat):
    nouvel_etat = dict(etat)
    liste_nuages = [dict(nuage) for nuage in nouvel_etat["nuages"]]

    if nouvel_etat["temps_ecoule"] % 60 == 0 and random.random() > 0.4:
        liste_nuages.append({
            "position_x": LARGEUR,
            "position_y": random.randint(10, 60),
            "vitesse": random.uniform(0.5, 1.2),
            "forme": random.choice([nuage1, nuage2, nuage3]),
            "taille": random.choice([1.5, 2, 2.5, 3])
        })

    prochains_nuages = []
    for nuage in liste_nuages:
        nuage["position_x"] -= nuage["vitesse"]
        if nuage["position_x"] > -50:  
            prochains_nuages.append(nuage)

    nouvel_etat["nuages"] = prochains_nuages
    return nouvel_etat

def gestion_obstacles(etat):
    nouvel_etat = dict(etat)
    liste_obstacles = [dict(obs) for obs in nouvel_etat["obstacles"]]

    if nouvel_etat["temps_ecoule"] % 70 == 0 and random.random() > 0.3:
        forme_choisie = random.choice([obstacle1, obstacle2])
        mult_longueur = random.choice([1, 2])
        mult_largeur = random.choice([1, 2])

        hauteur_totale = forme_choisie[3] * mult_largeur

        liste_obstacles.append({
            "position_x": LARGEUR,
            "position_y": POSITION_SOL - hauteur_totale + 1,
            "forme": forme_choisie,
            "longueur": mult_longueur, 
            "largeur": mult_largeur
        })

    prochains_obstacles = []
    vitesse_defilement = 3 + (nouvel_etat["score"] // 600)

    for obs in liste_obstacles:
        obs["position_x"] -= vitesse_defilement

        largeur_obs = obs["forme"][2] * obs["longueur"]
        hauteur_obs = obs["forme"][3] * obs["largeur"]

        if (obs["position_x"] < nouvel_etat["position_x"] + 14 and 
            obs["position_x"] + largeur_obs > nouvel_etat["position_x"] + 2 and 
            obs["position_y"] < nouvel_etat["position_y"] + 16 and 
            obs["position_y"] + hauteur_obs > nouvel_etat["position_y"]):
            nouvel_etat["game_over"] = True

        if obs["position_x"] > -largeur_obs:
            prochains_obstacles.append(obs)

    nouvel_etat["obstacles"] = prochains_obstacles
    return nouvel_etat

pyxel.init(LARGEUR, HAUTEUR, title="Runner")
pyxel.load("U3.pyxres")
etat_actuel = initialiser_jeu()

def update():
    global etat_actuel
    etat_actuel = mettre_a_jour_jeu(etat_actuel)

def draw():
    dessiner_jeu(etat_actuel)

pyxel.run(update, draw)