HomeTortue graphiqueGPanelRobotique WebTigerPython
 Python - Online
snakeGame
Deutsch   English   Français   

JEU DU SERPENT (SNAKE GAME)

 

 

DESCRIPTION DU JEU

 

Snake est un jeu vidéo bien connu dans lequel tu diriges un serpent à travers un terrain de jeu pour lui permettre de trouver de la nourriture. Le serpent s'allonge chaque fois qu'il mange.

Notre version du jeu respecte les règles suivantes :

  • Le serpent peut être dirigé à l'aide des touches fléchées du clavier.

  • Une souris apparaît automatiquement à une position aléatoire dans la grille.

  • Chaque fois que le serpent mange une souris, sa queue s'allonge d'un segment et une nouvelle souris apparaît.

  • Si le serpent entre en collision avec le bord du terrain ou avec sa propre queue, la partie est terminée (Game Over).

  • Le but du jeu est d'obtenir un serpent aussi long que possible.

 

Tu peux modifier la vitesse de déplacement du serpent en changeant la période de simulation (400).

Le serpent se compose d'une tête et d'une queue constituée de plusieurs segments (TailSegment). Les touches fléchées permettent de diriger uniquement la tête, tandis que les autres segments la suivent.
La programmation de ce mouvement de suivi constitue la partie la plus difficile de cet exercice. Les segments de la queue (TailSegment) sont enregistrés dans une liste appelée tail. Cette liste permet de représenter élégamment le serpent qui grandit. Grâce à la possibilité d'accéder aux différents éléments de la liste à l'aide de leur indice, les segments de la queue peuvent être déplacés individuellement.

 

Programme:

# SnakeGame.py

from gamegrid import *

# ---------------- class Snake ----------------
class Snake(Actor):
    def __init__(self):
         Actor.__init__(self, True, "sprites/snakehead.gif")
         self.tail = [] 

    def reset(self):
        for i in range(2):
           segment = TailSegment()
           addActor(segment, Location(snake.getX(), snake.getY() + i + 1))
           self.tail.append(segment)      

    def tryToEat(self, lastLocation):
        actor = getOneActorAt(self.getLocation(), Food)
        if actor != None:
            newSegment = TailSegment()
            addActor(newSegment, lastLocation)
            self.tail.append(newSegment)
            actor.removeSelf()
            addActor(Food(), getRandomEmptyLocation())
  
    def act(self): 
        lastIndex = len(self.tail) - 1
        if lastIndex > -1:
            lastLocation = self.tail[lastIndex].getLocation()
            for i in range (lastIndex, 0, -1):
                self.tail[i].setLocation(self.tail[i-1].getLocation())
            self.tail[0].setLocation(self.getLocation())
        
        self.move() 

        a = getOneActorAt(self.getLocation(), TailSegment)
        if not self.isInGrid() or a != None:
             removeAllActors()
             addActor(Actor("sprites/gameover.gif"), Location(9, 9))
             return   

        self.tryToEat(lastLocation)  

# ---------------- class Tailsegment----------------
class TailSegment(Actor):
    def __init__(self):
        Actor.__init__(self, "sprites/snaketail.gif")
 
# ---------------- class Food ----------------
class Food(Actor):
    def __init__(self):
        Actor.__init__(self, "sprites/mouse.gif")
 
def keyCallback(keyCode):
        if keyCode == 38: # UP
            snake.setDirection(270)
        if keyCode == 40: # DOWN
            snake.setDirection(90)
        if keyCode == 39: # RIGHT
            snake.setDirection(0)
        if keyCode == 37: # LEFT
            snake.setDirection(180)  
 
makeGameGrid(20, 20, 20, Color.gray, False, keyRepeated = keyCallback)
snake = Snake()
addActor(snake, Location(10,10))
snake.setDirection(Location.NORTH)
food = Food()
addActor(Food(), getRandomEmptyLocation())
show()
setSimulationPeriod(400)
doRun()
► Copy to clipboard

 

 

Explications du code

 
1. Liste des segments de la queue
self.tail = []: Cette instruction crée une liste vide destinée à contenir les segments de la queue (TailSegment). tail est une variable d'instance de la classe Snake. C'est pourquoi elle doit être précédée de self..

2. Ajout d'un segment à la liste
tail.append(segment): Cette instruction ajoute un segment à la liste tail.

3.
Méthode reset(self)
reset(self): La méthode reset() est appelée automatiquement lorsqu'un Actor est ajouté au GameGrid.
4. Ajout d'un segment au terrain de jeu
addActor(segment, Location(snake.getX(), snake.getY() + i + 1)): Cette instruction ajoute un segment de la queue dans la fenêtre de jeu, à une position située sous la tête du serpent.

5. Déplacement des segments de la queue
lastIndex = len(tail) - 1: Le serpent se déplace de la manière suivante : le dernier segment prend la position du segment précédent, celui-ci prend à son tour la position du segment qui le précède, et ainsi de suite. Le premier segment prend la position de la tête du serpent.Comme les indices d'une liste commencent toujours à 0, l'indice du dernier élément est inférieur de 1 au nombre total d'éléments de la liste.

6. Position du dernier segment
lastLocation = tail[lastIndex].getLocation(): Cette instruction fournit la position du dernier segment de la queue. Cette position est utilisée pour placer un nouveau segment lorsque le serpent mange une souris.

7. Déplacement des segments
for i in range(lastIndex, 0, -1): Les segments de la queue sont déplacés les uns après les autres, en commençant par le dernier segment.

8. Déplacement du premier segment
tail[0].setLocation(self.getLocation()): Le segment d'indice 0 prend la position actuelle de la tête du serpent.

9. Collision avec le bord du terrain
not self.isInGrid() : Cette condition vérifie si le serpent a quitté le terrain de jeu. Si c'est le cas, la partie est terminée (Game Over).

10. Collision avec la queue
a = getOneActorAt(self.getLocation(), TailSegment): Si un Actor de type TailSegment se trouve à la position de la tête du serpent, cela signifie que le serpent est entré en collision avec sa propre queue. Dans ce cas, la partie est également terminée (Game Over).