[Python] I wrote the code for the snake game for my phone, but the snake has no color

Discussão em 'Python' iniciado por Stack, Junho 16, 2025.

  1. Stack

    Stack Membro Participativo

    I used a script for the game "Snake" on a website in the Internet. When I debugged and ran the script, it became clear that it was working: the snake collects apples, counts the number of apples eaten, but it is not visible on the playing field. The code uses the kivy library, in which you need to set the colors of fields and objects in a structured way. But I don't understand how it's done. Please provide a specific example of writing the parameter structure of an object in Kivy and how to connect it to an object in a Python script.

    If you need the script, here he is.

    from kivy.properties import NumericProperty, ListProperty
    from kivy.core.window import Window
    from kivy.uix.widget import Widget
    from kivy.clock import Clock
    from random import randint
    from kivy.app import App

    blue=0,0,255,0
    yellow=255,255,0,0

    class SnakePart(Widget):
    pass

    class Food(Widget):
    pass


    def add_widget(SnakePart):
    pass


    class SnakeGame(Widget):
    # цвет окна
    Window.clearcolor = (.9, .9, .9, 0)
    # Размер клетки
    cell_size = NumericProperty(20)
    # Направление змейки (по умолчанию вправо)
    direction = ListProperty([1, 0])
    # Следующее направление (чтобы избежать мгновенного разворота)
    next_direction = ListProperty([1, 0])
    # Змейка (список частей тела)
    snake = ListProperty([])
    # Еда
    food_pos = ListProperty([0, 0])
    # Игровое поле (кол-во клеток)
    grid_size = NumericProperty(20)
    # Скорость змейки
    speed = NumericProperty(10)
    # Счет
    score = NumericProperty(0)
    # Игра активна?
    game_active = False

    def __init__(self, **kwargs):
    super().__init__(**kwargs)
    # Размер окна = размер сетки * размер клетки
    Window.size = (self.grid_size * self.cell_size, self.grid_size * self.cell_size)
    # Создаем змейку
    self.reset_game()

    def reset_game(self):
    """Сброс игры"""
    # Удаляем все виджеты змейки
    for part in self.snake:
    self.remove_widget(part)

    self.snake = []
    self.direction = [1, 0]
    self.next_direction = [1, 0]
    self.score = 0
    self.game_active = True

    # Начальная змейка (3 клетки)
    for i in range(3):
    part = SnakePart()
    part.pos = (10 - i) * self.cell_size, 10 * self.cell_size
    self.snake.append(part)
    self.add_widget(part)

    # Создаем еду
    self.spawn_food()

    # Запускаем игровой цикл
    Clock.schedule_interval(self.update, 1 / self.speed)

    def spawn_food(self):
    """Создает еду в случайном месте"""
    while True:
    x = randint(0, self.grid_size - 1)
    y = randint(0, self.grid_size - 1)
    # Проверяем, чтобы еда не появилась на змейке
    food_pos_valid = True
    for part in self.snake:
    if part.pos == (x * self.cell_size, y * self.cell_size):
    food_pos_valid = False
    break
    if food_pos_valid:
    break
    self.food_pos = [x, y]

    def update(self, dt):
    """Игровой цикл"""
    if not self.game_active:
    return

    # Обновляем направление
    self.direction = self.next_direction[:]

    # Получаем голову змейки
    head_x, head_y = self.snake[0].pos
    head_x = head_x / self.cell_size + self.direction[0]
    head_y = head_y / self.cell_size + self.direction[1]

    # Проверяем столкновение с границами
    if head_x < 0 or head_x >= self.grid_size or head_y < 0 or head_y >= self.grid_size:
    self.game_over()
    return

    # Проверяем столкновение с собой
    for part in self.snake[1:]:
    if part.pos == (head_x * self.cell_size, head_y * self.cell_size):
    self.game_over()
    return

    # Создаем новую голову
    new_head = SnakePart()
    new_head.pos = (head_x * self.cell_size, head_y * self.cell_size)
    self.snake.insert(0, new_head)
    self.add_widget(new_head)

    # Проверяем, съели ли еду
    if (head_x == self.food_pos[0] and head_y == self.food_pos[1]):
    self.score += 1
    self.spawn_food()
    else:
    # Удаляем хвост, если не съели еду
    tail = self.snake.pop()
    self.remove_widget(tail)

    def game_over(self):
    """Конец игры"""
    self.game_active = False
    Clock.unschedule(self.update)
    print("Игра окончена! Счет:", self.score)

    def on_touch_down(self, touch):
    """Обработка касаний (управление)"""
    if not self.game_active:
    self.reset_game()
    return

    # Определяем направление свайпа
    dx = touch.x - self.snake[0].pos[0]
    dy = touch.y - self.snake[0].pos[1]

    if abs(dx) > abs(dy):
    self.next_direction = [1 if dx > 0 else -1, 0]
    else:
    self.next_direction = [0, 1 if dy > 0 else -1]

    # Запрещаем разворот на 180 градусов
    if (self.next_direction[0] != -self.direction[0] or
    self.next_direction[1] != -self.direction[1]):
    self.direction = self.next_direction[:]

    class SnakeApp(App):
    def build(self):
    game = SnakeGame()
    return game

    if __name__ == "__main__":
    SnakeApp().run()

    Continue reading...

Compartilhe esta Página