Advertisement
boris-vlasenko

змейка

Feb 26th, 2024
1,074
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.90 KB | None | 0 0
  1. from random import choice, randint
  2.  
  3. import pygame
  4.  
  5. # Инициализация PyGame:
  6. pygame.init()
  7.  
  8. # Константы для размеров поля и сетки:
  9. SCREEN_WIDTH, SCREEN_HEIGHT = 640, 480
  10. GRID_SIZE = 20
  11. GRID_WIDTH = SCREEN_WIDTH // GRID_SIZE
  12. GRID_HEIGHT = SCREEN_HEIGHT // GRID_SIZE
  13.  
  14. # Направления движения:
  15. UP = (0, -1)
  16. DOWN = (0, 1)
  17. LEFT = (-1, 0)
  18. RIGHT = (1, 0)
  19.  
  20. # Цвет фона - черный:
  21. BOARD_BACKGROUND_COLOR = (0, 0, 0)
  22.  
  23. # Цвет границы ячейки
  24. BORDER_COLOR = (93, 216, 228)
  25.  
  26. # Цвет яблока
  27. APPLE_COLOR = (255, 0, 0)
  28.  
  29. # Цвет змейки
  30. SNAKE_COLOR = (0, 255, 0)
  31.  
  32. # Скорость движения змейки:
  33. SPEED = 15
  34.  
  35. # Настройка игрового окна:
  36. screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), 0, 32)
  37.  
  38. # Заголовок окна игрового поля:
  39. pygame.display.set_caption('Змейка')
  40.  
  41. # Настройка времени:
  42. clock = pygame.time.Clock()
  43.  
  44.  
  45. class GameObject:
  46.     """Это базовый класс."""
  47.  
  48.     def __init__(self, bg_color=None):
  49.         self.position = (SCREEN_WIDTH // 2), (SCREEN_HEIGHT // 2)
  50.         self.body_color = bg_color
  51.  
  52.     def draw_cell(self, surface, position):
  53.         """Создание ячейки."""
  54.         rect = pygame.Rect(position, (GRID_SIZE, GRID_SIZE, ))
  55.         pygame.draw.rect(surface, self.body_color, rect)
  56.         #pygame.draw.rect(surface, BORDER_COLOR, rect, 1)
  57.         #pygame.draw.rect(surface, self.body_color, rect)
  58.  
  59.     def draw(self, surface):
  60.         """Отрисовка объекта. По умолчанию pass."""
  61.         pass
  62.  
  63.  
  64. class Apple(GameObject):
  65.     """Класс для яблока, наследуется от GameObject."""
  66.  
  67.     def __init__(self, bg_color=APPLE_COLOR):
  68.         super().__init__(bg_color)
  69.         self.randomize_position()
  70.  
  71.     def randomize_position(self):
  72.         """Реализация рандомного появления яблока."""
  73.         self.position = (
  74.             randint(0, GRID_WIDTH - 1) * GRID_SIZE,
  75.             randint(0, GRID_HEIGHT - 1) * GRID_SIZE
  76.         )
  77.  
  78.     def draw(self, surface):
  79.         """Метод draw класса Apple."""
  80.         self.draw_cell(surface, self.position)
  81.  
  82.  
  83. class Snake(GameObject):
  84.     """Класс для змейки, наследуется от GameObject."""
  85.  
  86.     def __init__(self, body_color=SNAKE_COLOR):
  87.         """Инициализация змейки с заданными позицией и цветом."""
  88.         super().__init__(body_color)
  89.         self.reset()
  90.         self.positions = [self.position]
  91.         self.direction = RIGHT
  92.         self.next_direction = None
  93.         self.last = None
  94.  
  95.     def update_direction(self):
  96.         """Метод обновления направления после нажатия на кнопку."""
  97.         if self.next_direction:
  98.             self.direction = self.next_direction
  99.             self.next_direction = None
  100.  
  101.     def move(self):
  102.         """
  103.        Обновляем позицию змейки.
  104.        Управление её движением по игровому полю.
  105.        """
  106.         head_x, head_y = self.get_head_position()
  107.         xd, yd = self.direction
  108.         x_new = (GRID_SIZE * xd + head_x) % SCREEN_WIDTH
  109.         y_new = (GRID_SIZE * yd + head_y) % SCREEN_HEIGHT
  110.  
  111.         self.positions.insert(0, (x_new, y_new))
  112.         if len(self.positions) > self.length:
  113.             self.last = self.positions.pop()
  114.  
  115.     def get_head_position(self):
  116.         """Возвращает позицию головы змейки."""
  117.         return self.positions[0]
  118.  
  119.     def reset(self):
  120.         """Сбрасывает змейку в начальное состояние."""
  121.         self.length = 1
  122.         self.positions = [self.position]
  123.         self.direction = choice([UP, DOWN, LEFT, RIGHT])
  124.         self.last = None
  125.  
  126.     def draw(self, surface):
  127.         """Метод draw класса Snake. Отрисовывает змейку."""
  128.         for position in self.positions[:-1]:
  129.             self.draw_cell(surface, position)
  130.  
  131.         self.draw_cell(surface, self.positions[0])
  132.  
  133.         if self.last:
  134.             last_rect = pygame.Rect(
  135.                 self.last,
  136.                 (GRID_SIZE, GRID_SIZE)
  137.             )
  138.             pygame.draw.rect(surface, BOARD_BACKGROUND_COLOR, last_rect)
  139.  
  140.  
  141. def handle_keys(game_object):
  142.     """Функция обработки действий пользователя."""
  143.     for event in pygame.event.get():
  144.         if event.type == pygame.QUIT:
  145.             pygame.quit()
  146.             raise SystemExit
  147.         elif event.type == pygame.KEYDOWN:
  148.             if event.key == pygame.K_UP and game_object.direction != DOWN:
  149.                 game_object.next_direction = UP
  150.             elif event.key == pygame.K_DOWN and game_object.direction != UP:
  151.                 game_object.next_direction = DOWN
  152.             elif event.key == pygame.K_LEFT and game_object.direction != RIGHT:
  153.                 game_object.next_direction = LEFT
  154.             elif event.key == pygame.K_RIGHT and game_object.direction != LEFT:
  155.                 game_object.next_direction = RIGHT
  156.  
  157.  
  158. def main():
  159.     """Создаем экземпляры классов"""
  160.     apple = Apple()
  161.     snake = Snake()
  162.  
  163.     while True:
  164.         clock.tick(SPEED)
  165.         apple.draw(screen)
  166.         snake.draw(screen)
  167.         handle_keys(snake)
  168.         snake.update_direction()
  169.         snake.move()
  170.  
  171.         if snake.get_head_position() in snake.positions[2:]:
  172.             snake.reset()
  173.             screen.fill(BOARD_BACKGROUND_COLOR)
  174.  
  175.         if snake.get_head_position() == apple.position:
  176.             snake.length += 1
  177.             apple.randomize_position()
  178.             apple.draw(screen)
  179.  
  180.         pygame.display.update()
  181.  
  182.  
  183. if __name__ == '__main__':
  184.     main()
  185.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement