Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.47 KB | None | 0 0
  1. from tkinter import*
  2. from random import randint
  3.  
  4. # Константы для созд. сетки.................
  5. GRADUATION = 40
  6. PIXEL = 10
  7. STEP = 2 * PIXEL
  8. WD = PIXEL * GRADUATION
  9. HT = PIXEL * GRADUATION
  10. # cons для фигур ...........................
  11. OB_SIZE_FACTOR = 1
  12. SN_SIZE_FACTOR = 0.9
  13. OB_SIZE = PIXEL * OB_SIZE_FACTOR
  14. SN_SIZE = PIXEL * SN_SIZE_FACTOR
  15. # Цвета конст.
  16. BG_COLOR = 'black'
  17. OB_COLOR = 'red'
  18. SN_COLOR = 'white'
  19. # Словарь для облегчения доступа к типу фигуры в класе Shape
  20. SN = 'snake'
  21. OB = 'obstacle'
  22. SIZE = {SN: SN_SIZE, OB: OB_SIZE}
  23. # const для ввода с клавиатуры
  24. UP = 'Up'
  25. DOWN = 'Down'
  26. RIGHT = 'Right'
  27. LEFT = 'Left'
  28. # словарь для облегчения доступа к «указаниям»
  29. DIRECTIONS = {UP: [0, -1], DOWN: [0, 1], RIGHT: [1, 0], LEFT: [-1, 0]}
  30. AXES = {UP: 'Vertical', DOWN: 'Vertical', RIGHT: 'Horizontal', LEFT: 'Horizontal'}
  31. # Время обновления для движения
  32. REFRESH_TIME = 150
  33.  
  34.  
  35. class Master(Canvas):
  36.     """создать игровой холст, змею, препятствие, следить за счетом"""
  37.     def __init__(self, boss=None):
  38.         super().__init__(boss)
  39.         self.configure(width=WD, height=HT, bg=BG_COLOR)
  40.         self.running = 0
  41.         self.snake = None
  42.         self.obstacle = None
  43.         self.direction = None
  44.         self.current = None
  45.         self.score = Scores(boss)
  46.  
  47.     def start(self):
  48.         """Начало игры"""
  49.         if self.running == 0:
  50.             self.snake = Snake(self)
  51.             self.obstacle = Obstacle(self)
  52.             self.direction = RIGHT
  53.             self.current = Movement(self, RIGHT)
  54.             self.current.begin()
  55.             self.running = 1
  56.  
  57.     def clean(self):
  58.         """Рестарт"""
  59.         if self.running == 1:
  60.             self.score.reset()
  61.             self.current.stop()
  62.             self.running = 0
  63.             self.obstacle.delete()
  64.             for block in self.snake.blocks:
  65.                 block.delete()
  66.  
  67.     def redirect(self, event):
  68.         """Считывание клавиш и и движение земли соотвественно клавиши"""
  69.         if 1 == self.running and \
  70.                 event.keysym in AXES.keys() and\
  71.                 AXES[event.keysym] != AXES[self.direction]:
  72.             self.current.flag = 0
  73.             self.direction = event.keysym
  74.             self.current = Movement(self, event.keysym)  # новый экземпляр на каждом шагу
  75.             self.current.begin()  # защита от двойного наж
  76.  
  77. class Scores:
  78.     """Отслеживание счёта, и сохранение наилучщего"""
  79.     def __init__(self, boss=None):
  80.         self.counter = StringVar(boss, '0')
  81.         self.maximum = StringVar(boss, '0')
  82.  
  83.     def increment(self):
  84.         score = int(self.counter.get()) + 1
  85.         maximum = max(score, int(self.maximum.get()))
  86.         self.counter.set(str(score))
  87.         self.maximum.set(str(maximum))
  88.  
  89.     def reset(self):
  90.         self.counter.set('0')
  91.  
  92.  
  93. class Shape:
  94.     """Это шаблон для создания препятствий и частей тела змеи"""
  95.     def __init__(self, can, a, b, kind):
  96.         self.can = can
  97.         self.x, self.y = a, b
  98.         self.kind = kind
  99.         if kind == SN:
  100.             self.ref = Canvas.create_rectangle(self.can,
  101.                                                a - SN_SIZE, b - SN_SIZE,
  102.                                                a + SN_SIZE, b + SN_SIZE,
  103.                                                fill=SN_COLOR,
  104.                                                width=2)
  105.         elif kind == OB:
  106.             self.ref = Canvas.create_oval(self.can,
  107.                                           a - OB_SIZE, b - OB_SIZE,
  108.                                           a + SN_SIZE, b + SN_SIZE,
  109.                                           fill=OB_COLOR,
  110.                                           width=2)
  111.  
  112.     def modify(self, a, b):
  113.         self.x, self.y = a, b
  114.         self.can.coords(self.ref,
  115.                         a - SIZE[self.kind], b - SIZE[self.kind],
  116.                         a + SIZE[self.kind], b + SIZE[self.kind])
  117.  
  118.     def delete(self):
  119.         self.can.delete(self.ref)
  120.  
  121.  
  122. class Obstacle(Shape):
  123.     """Еда"""
  124.     def __init__(self, can):
  125.         """создавать еду, там где нету тела змеи"""
  126.         self.can = can
  127.         p = int(GRADUATION/2 - 1)
  128.         n, m = ra
  129. ndint(0, p), randint(0, p)
  130.         a, b = PIXEL * (2 * n + 1), PIXEL * (2 * m + 1)
  131.         while [a, b] in [[block.x, block.y] for block in self.can.snake.blocks]:
  132.             n, m = randint(0, p), randint(0, p)
  133.             a, b = PIXEL * (2 * n + 1), PIXEL * (2 * m + 1)
  134.         super().__init__(can, a, b, OB)
  135.  
  136.  
  137. class Block(Shape):
  138.     """Змеиные части тела"""
  139.     def __init__(self, can, a, y):
  140.         super().__init__(can, a, y, SN)
  141.  
  142.  
  143. class Snake:
  144.     """Слежение за частями тела змеи"""
  145.     def __init__(self, can):
  146.         """Исходная позиция"""
  147.         self.can = can
  148.         a = PIXEL + 2 * int(GRADUATION/4) * PIXEL
  149.         self.blocks = [Block(can, a, a), Block(can, a, a + STEP)]
  150.  
  151.     def move(self, path):
  152.         """элементарный шаг, состоящий из помещения хвоста змеи в первое положение"""
  153.         a = (self.blocks[-1].x + STEP * path[0]) % WD
  154.         b = (self.blocks[-1].y + STEP * path[1]) % HT
  155.         if a == self.can.obstacle.x and b == self.can.obstacle.y:  # Проверка на еду
  156.             self.can.score.increment()
  157.             self.can.obstacle.delete()
  158.             self.blocks.append(Block(self.can, a, b))
  159.             self.can.obstacle = Obstacle(self.can)
  160.         elif [a, b] in [[block.x, block.y] for block in self.blocks]:  # Проверка на врезание в тело
  161.             self.can.clean()
  162.         else:
  163.             self.blocks[0].modify(a, b)
  164.             self.blocks = self.blocks[1:] + [self.blocks[0]]
  165.  
  166.  
  167. class Movement:
  168.     """объект, который вводит змею в постоянное состояние движения в заданном направлении"""
  169.     def __init__(self, can, direction):
  170.         self.flag = 1
  171.         self.can = can
  172.         self.direction = direction
  173.  
  174.     def begin(self):
  175.         """Начать движение "Вечное""""
  176.        if self.flag > 0:
  177.            self.can.snake.move(DIRECTIONS[self.direction])
  178.            self.can.after(REFRESH_TIME, self.begin)
  179.  
  180.    def stop(self):
  181.        """Остановление"""
  182.        self.flag = 0
  183.  
  184.  
  185. root = Tk()
  186. root.title("Змейка ТОП")
  187. game = Master(root)
  188. game.grid(column=1, row=0, rowspan=3)
  189. root.bind("<Key>", game.redirect)
  190. buttons = Frame(root, width=35, height=3*HT/5)
  191. Button(buttons, text='Старт', command=game.start).grid()
  192. Button(buttons, text='Очистка', command=game.clean).grid()
  193. Button(buttons, text='Выход', command=root.destroy).grid()
  194. buttons.grid(column=0, row=0)
  195. scoreboard = Frame(root, width=35, height=2*HT/5)
  196. Label(scoreboard, text='Счёт').grid()
  197. Label(scoreboard, textvariable=game.score.counter).grid()
  198. Label(scoreboard, text='Лучший счёт').grid()
  199. Label(scoreboard, textvariable=game.score.maximum).grid()
  200. scoreboard.grid(column=0, row=2)
  201. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement