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éthodeupdateet 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 
snakelui-même, ladirectionde déplacement du snake, lescoredu joueur, etc.), - d'initialiser la fenêtre de jeu avec la fonction 
initdu modulepyxel, - d'exécuter le jeu avec la fonction 
rundu modulepyxel.
C'est ce que l'on fait avec l'instruction :
pyxel.run(self.update, self.draw)
Cette fonctionrunprend comme entrées votre méthodeupdateet 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 
drawcontiendra toutes les instructions permettant de dessiner ce que vous verrez à l'écran dans la fenêtre de jeu, - la méthode 
updatecontiendra 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 fonctionclsdepyxel, 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 dedrawsans 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.runest 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.