text: import pygame
  from tkinter import *
  from tkinter import messagebox
  
  import math
  import random
  
  
  class cube(object):
      rows = 20
      w = 500
  
      def __init__(self, start, dirx=1, diry=0, color=(255, 0, 0)):
          self.pos = start
          self.dirx = 1
          self.diry = 0
          self.color = color
  
      def move(self, dirx, diry):
          self.dirx = dirx
          self.diry = diry
          self.pos = (self.pos[0] + self.dirx, self.pos[1] + self.diry)
  
      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))
  
          # Eyes
          if eyes:
              center = dis // 2
              radius = 3
              circle_middle = (i * dis + center - radius, j * dis + 8)
              circle_middle_2 = (i * dis + dis - radius * 2, j * dis + 8)
              pygame.draw.circle(surface, (0, 0, 0), circle_middle, radius)
              pygame.draw.circle(surface, (0, 0, 0), circle_middle_2, radius)
  
  
  class snake(object):
      body = []
      turns = {}
  
      def __init__(self, color, pos):
          self.color = color
          self.head = cube(pos)
          self.body.append(self.head)
          self.dirx = 0
          self.diry = 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.dirx = -1
                      self.diry = 0
                      self.turns[self.head.pos[:]] = [self.dirx, self.diry]
  
                  elif keys[pygame.K_RIGHT]:
                      self.dirx = 1
                      self.diry = 0
                      self.turns[self.head.pos[:]] = [self.dirx, self.diry]
  
                  elif keys[pygame.K_UP]:
                      self.dirx = 0
                      self.diry = -1
                      self.turns[self.head.pos[:]] = [self.dirx, self.diry]
  
                  elif keys[pygame.K_DOWN]:
                      self.dirx = 0
                      self.diry = 1
                      self.turns[self.head.pos[:]] = [self.dirx, self.diry]
  
          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.dirx == -1 and c.pos[0] <= 0:
                      c.pos = (c.rows - 1, c.pos[1])
                  elif c.dirx == 1 and c.pos[0] >= c.rows - 1:
                      c.pos = (0, c.pos[1])
                  elif c.diry == 1 and c.pos[1] >= c.rows - 1:
                      c.pos = (c.pos[0], 0)
                  elif c.diry == -1 and c.pos[1] <= 0:
                      c.pos = (c.pos[0], c.rows - 1)
                  else:
                      c.move(c.dirx, c.diry)
  
      def reset(self, pos):
          self.head = cube(pos)
          self.body = []
          self.body.append(self.head)
          self.turns = {}
          self.dirx = 0
          self.diry = 1
  
      def add_cube(self):
          tail = self.body[-1]
          dx, dy = tail.dirx, tail.diry
  
          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], tail.pos[1] - 1)))
          elif dx == 0 and dy == -1:
              self.body.append(cube((tail.pos[0], tail.pos[1] + 1)))
  
          self.body[-1].dirx = dx
          self.body[-1].diry = dy
  
      def draw(self, surface):
          for i, c in enumerate(self.body):
              if i == 0:
                  c.draw(surface, True)
              else:
                  c.draw(surface)
  
  
  def draw_grid(w, rows, surface):
      # Size of grid
      sizebtwn = w // rows
  
      x = 0
      y = 0
      for i in range(rows):
          x = x + sizebtwn
          y = y + sizebtwn
  
          # drawing a line
          pygame.draw.line(surface, (255, 255, 255), (x, 0), (x, w))
          pygame.draw.line(surface, (255, 255, 255), (0, y), (w, y))
  
  
  def redraw_window(surface):
      global width, rows, s, snack
      surface.fill((0, 0, 0))
      s.draw(surface)
      snack.draw(surface)
      draw_grid(width, rows, surface)
  
      # Update the Board
      pygame.display.update()
  
  
  def random_snack(rows, items):
      positions = items.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):
      obj = Tk()
      obj.attributes("-topmost", True)
      obj.withdraw()
      messagebox.showinfo(subject, content)
  
      try:
          obj.destroy()
      except:
          pass
  
  
  def main():
      global width, rows, s, snack
      width = 500
      rows = 20
      board = pygame.display.set_mode((width, width))
      s = snake((255, 0, 0), (10, 10))
      snack = cube(random_snack(rows, s), color=(0, 255, 0))
  
      clock = pygame.time.Clock()
  
      while True:
          pygame.time.delay(50)
          clock.tick(10)
          s.move()
  
          if s.body[0].pos == snack.pos:
              s.add_cube()
              snack = cube(random_snack(rows, s), color=(0, 255, 0))
  
          for x in range(len(s.body)):
              if s.body[x].pos in list(map(lambda z: z.pos, s.body[x + 1:])):
                  print(f" Your Score = {len(s.body)}")
                  message_box("You Lost!!", f"Your Score : {len(s.body)} \n Play Again..")
                  s.reset((10, 10))
                  break
  
          redraw_window(board)
  
      pass
  
  
  main()
  