text: #snake tutorial python
  
  import math
  import random
  import pygame
  import tkinter as tk
  from tkinter import messagebox
  
  class cube(object):
      rows = 20
      w = 500
      def __init__(self, start, dirnx=1, dirny=0, color = (255,0,0)):
          self.pos = start
          self.dirnx = 1
          self.dirny = 0
          self.color = color
  
      def move(self, dirnx, dirny):
          self.dirnx = dirnx
          self.dirny = dirny
          self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny)
  
      def draw(self, surface, eyes= False):
          dis = self.w // self.rows
          i = self.pos[0]
          j = self.pos[1]
  
          pygame.draw.rect(surface, self.color, (i*dis+1, j*dis+1, dis-2, dis-2))
          if eyes:
              centre = dis//2
              radius = 3
              circleMidlle = (i*dis + centre - radius, j*dis + 8)
              circleMidlle2 = (i * dis + dis - radius * 2, j * dis + 8)
              pygame.draw.circle(surface, (0,0,0), circleMidlle, radius)
              pygame.draw.circle(surface, (0,0,0), circleMidlle2, radius)
      
  class snake(object):
      body = []
      turns = {}
      def __init__(self, color, pos):
          self.color = color
          self.head = cube(pos)
          self.body.append(self.head)
          self.dirnx = 0
          self.dirny = 1
  
  
      def move(self):
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  pygame.quit()
  
              keys = pygame.key.get_pressed()
  
              for key in keys:
                  if keys[pygame.K_LEFT]:
                      self.dirnx = -1
                      self.dirny = 0
                      self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
                  
                  elif keys[pygame.K_RIGHT]:
                      self.dirnx = 1
                      self.dirny = 0
                      self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
  
                  elif keys[pygame.K_UP]:       #PAY ATTENTION !!!!
                      self.dirnx = 0          #L ORIGINE DU REPERE EST LE COIN SUP GAUCHE 
                      self.dirny = -1         #DE LA FENETRE
                      self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
                                              #ET L AXE DES ORDONNEES ORIENTÉ VERS LE BAS
                  elif keys[pygame.K_DOWN]:
                      self.dirnx = 0
                      self.dirny = 1
                      self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
  
          for i, c in enumerate(self.body):
              p = c.pos[:]
              if p in self.turns:
                  turn = self.turns[p]
                  c.move(turn[0], turn[1])
                  if i == len(self.body)-1:
                      self.turns.pop(p)
                  else:
                      if c.dirnx == -1 and c.pos[0] <= 0: c.pos = (c.rows-1, c.pos[1])
                      elif c.dirnx ==1 and c.pos[0] >= c.rows-1: c.pos = (0, c.pos[1])
                      elif c.dirnx ==1 and c.pos[0] >= c.rows-1: c.pos = (c.pos[0], 0)
                      elif c.dirny == -1 and c.pos[1] <= 0 : c.pos = (c.pos[0], c.rows - 1)
                      else: c.move(c.dirnx, c.dirny)
  
  
  
      def reset(self, pos):
          pass
  
      def addCube(self):
          tail = self.body[-1]
          dx, dy = tail.dirnx, tail.dirny
          if dx == 1 and dy == 0:
          	self.body.append(cube((tail.pos[0]-1, tail.pos[1])))
          elif dx == -1 and dy == 0:
          	self.body.append(cube((tail.pos[0]+1, tail.pos[1])))
          elif dx == 0 and dy == 1:
          	self.body.append(cube((tail.pos[0]-1, tail.pos[1])))
      
      def draw(self, surface):
          for i, c in enumerate(self.body):
              if i==0:
                  c.draw(surface, True)
              else:
                  c.draw(surface)
  
  def drawGrid(w, rows, surface):
      sizeBtwn = w // rows
  
      x=0
      y=0
      for l in range(rows):
          x = x + sizeBtwn
          y = y + sizeBtwn
  
          pygame.draw.line(surface, (255,255,255), (x,0), (x,w))
          pygame.draw.line(surface, (255,255,255), (0,y), (w,y))
  
  def redrawWindow(surface):
      global rows, width, s
      surface.fill((0,0,0))
      s.draw(surface)
      drawGrid(width, rows, surface)
      pygame.display.update()
  
  def randomSnack(rows, items):
      positions = item.body
  
      while True:
      	x = random.randrange(rows)
      	y = random.randrange(rows)
      	if len(list(filter(lambda z:z.pos == (x,y), positions))) > 0:
      		continue
      	else:
      		break
      	return (x,y)
  
      	
  
  def message_box(subject, content):
      pass
  
  def main():
      global width, rows, s
      width = 500
      rows = 20
      #pygame.init()
      win = pygame.display.set_mode((width, width))
      s = snake((255,0,0), (10,10))
      snack = cube(randomSnack(rows, s), color=(0,255,0))
      flag = True
  
      clock = pygame.time.Clock()
  
      while flag:
          pygame.time.delay(50)
          clock.tick(10)
          s.move()
          if s.body[0].pos == snack.pos:
          	s.addCube()
          	snack = cube(randomSnack(rows, s), color=(0,255,0))
          redrawWindow(win)
          
  
      pass
  
  
  
  main()
  
  
  