Un jeu de snake avec Pyxel¶
Énoncé et programme de base
Voici une version PDF de l'énoncé de l'exercice (comportant des trous à compléter), ainsi qu'une structure de base pour votre programme Python.
N'hésitez pas à consulter la documentation de Pyxel si vous recherchez une fonctionnalité particulière de Pyxel qui n'est pas présentée dans l'énoncé.
Quelques explications utiles¶
Pour réaliser ce jeu de snake, vous utilisez la POO (programmation orientée objet).
Voici une structure de base pour votre programme (vous pouvez télécharger le fichier ou copier / coller le code ci-dessous):
import pyxel
from random import randint
class SnakeGame:
def __init__(self):
# AJOUTEZ ICI VOS INSTRUCTIONS
# exécuter le jeu
pyxel.run(self.update, self.draw)
def update(self):
pass
def draw(self):
# on ajoute une instruction permettant d'effacer l'écran
# et de le remplir avec la couleur 0 (= couleur noire) :
pyxel.cls(0)
pass
if __name__ == "__main__":
SnakeGame() # Instanciation de la classe SnakeGame
Explication
Voici une petite explication de ce bout de code :
- les deux premières lignes permettent d'importer le module Pyxel et la fonction randint du module random (qui sera utile pour générer la position de la nourriture),
- on a créé une classe nommée
SnakeGame
(vous pouvez l'appeler comme vous voulez), qui contient un constructeur__init__
, une méthodeupdate
et une méthodedraw
.- la méthode
__init__
permet :- de définir tous les attributs dont vous aurez besoin pour travailler (par exemple un attribut pour représenter le
snake
lui-même, ladirection
de déplacement du snake, lescore
du joueur, etc.), - d'initialiser la fenêtre de jeu avec la fonction
init
du modulepyxel
, - d'exécuter le jeu avec la fonction
run
du modulepyxel
.
C'est ce que l'on fait avec l'instruction :
pyxel.run(self.update, self.draw)
Cette fonctionrun
prend comme entrées votre méthodeupdate
et votre méthodedraw
.
Ces deux méthodes seront exécutées 20 fois par seconde.
- de définir tous les attributs dont vous aurez besoin pour travailler (par exemple un attribut pour représenter le
- la méthode
draw
contiendra toutes les instructions permettant de dessiner ce que vous verrez à l'écran dans la fenêtre de jeu, - la méthode
update
contiendra toutes les instructions permettant de mettre à jour l'état du jeu*.
- la méthode
- Au début de la méthode
draw
, vous pouvez voir l'instruction suivante :
pyxel.cls(0)
On a ici appelé la fonctioncls
depyxel
, qui permet d'effacer l'écran et de le remplir avec la couleur noire (valeur0
). Il y a au total 16 couleurs possibles, de valeurs allant de0
(pour le noir) à15
:
L'instructionpyxel.cls(0)
est nécessaire pour pouvoir modifier notre affichage à chaque appel dedraw
sans conserver les affichages précédents. - Enfin, le bloc d'instructions
if __name__ == "__main__":
en fin de script permet de définir des instructions qui seront exécutées uniquement si l'on exécute directement ce script. Elles ne seront donc pas exécutées si le script est importé dans un autre.
Ici, on se contente d'instancier la classeSnakeGame
, ce qui entraîne automatiquement l'exécution du jeu (puisque l'instructionpyxel.run
est dans le constructeur de la classe). Vous remarquerez que l'on ne stocke pas notre nouvel objet dans une variable, puisqu'on n'a pas besoin de le modifier.
Information - Déplacement du snake
En bas de la page 3 de l'énoncé, on vous donne une partie du code permettant de réagir aux touches du clavier en modifiant la direction de déplacement du snake :
- Bien évidemment, vous devez compléter ce bout de code en ajoutant les instructions pour prendre en compte l'appui sur la touche Up et sur la touche Down.
- Vous pouvez, si vous le souhaitez, remplacer les touches de flèches par les touches Z, Q, S et D.
Une version améliorée¶
Maintenant que vous avez une première version de votre jeu, vous pouvez y apporter des améliorations, comme par exemple :
- agrandir la fenêtre de jeu,
- faire en sorte qu'en sortant de l'écran d'un côté, le snake réapparaisse de l'autre côté,
- ajouter un écran de "Game Over" en cas d'échec,
- accélérer la vitesse de déplacement du snake toutes les \(x\) nourritures mangées,
- créer un système de niveaux de plus en plus durs et en y ajoutant des obstacles,
- etc.