Un snake

Voici une première approche d'un jeu très connu :

snake.py

In [ ]:
from kivy.app import App
from kivy.graphics import Line, Color, Rectangle, Ellipse
from kivy.uix.widget import Widget
from kivy.clock import Clock
import random

class Anneau(Widget):
    def __init__(self,canvas,pos_x,pos_y):
        self.pos=(pos_x,pos_y)
        self.canvas=canvas
        self.size=(9,9)
        #On dessine un anneau:
        with self.canvas:
            Color(0,1,0,0.5)
            self.objid=Ellipse(pos=self.pos, size=self.size)

class Snake(Widget):
    def __init__(self,canvas,pos_x,pos_y):
        #On definit un deplacement initial:
        self.dx = 10
        self.dy = 0
        self.pos=[pos_x,pos_y]
        #On definit une position pour la tete:
        self.canvas=canvas
        #On cree une liste de d'anneaux pour le corps:
        self.corps=[]
        #On dessine le corps en commencant par le tete:
        for k in range(0,10):
            self.corps.append(Anneau(self.canvas,150-k*10,400))
  
    def move(self):
        #On enleve la queue:
        self.canvas.remove(self.corps[-1].objid)
        self.corps=self.corps[:len(self.corps)-1]
        #On calcule la position de la tete:
        self.pos = (self.dx + self.pos[0],self.dy +self.pos[1])
        #On dessine la nouvelle tete et on l'ajoute au corps a l'index 0:
        with self.canvas:
            
            Color(0,1,0,0.5)
            
            self.corps.insert(0,Anneau(self.canvas,self.pos[0],self.pos[1]))

class Jeu(Widget):

    def debut(self):
        self.snake=Snake(self.canvas,150,400)
    
    def update(self, dt):
        self.snake.move()

    def on_touch_down(self, touch):
        #On calcule les differences 
        diff_x=touch.x-self.snake.pos[0]
        diff_y=touch.y-self.snake.pos[1]
        #On calcule le sens:
        dx,dy=10,10
        if diff_x<0:
            diff_x=-1*diff_x
            dx=-10
        if diff_y<0:
            diff_y=-1*diff_y   
            dy=-10
        #On definit le deplacement en fonction des differences:
        if diff_x > diff_y:
            self.snake.dx=dx
            self.snake.dy=0
        else:
            self.snake.dx=0
            self.snake.dy=dy



class MyApp(App):

    def build(self):
        Jeu1=Jeu()
        Jeu1.debut()
        Clock.schedule_interval(Jeu1.update, 3.0/10.0)
        return Jeu1


if __name__ == '__main__':
    MyApp().run()
  • Comment fonctionne le déplacement du serpent ?

  • Augmentez un peu la vitesse du serpent.

  • Gérez les bords de l'écran (on revient de l'autre côté ou on perd...).

  • Ajoutez une pomme à une position aléatoire.

  • Ajoutez une méthode qui permet de tester si la tête du serpent mange la pomme.

  • Ajoutez un anneau au serpent si la tête mange la pomme.

  • Plus dur ! : Ajoutez une méthode qui teste la collision de la tête du serpent avec le reste du corps.