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)