Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 09.03.2017
Сообщений: 57

Столкновение с объектом в игре змейка

03.09.2018, 12:27. Показов 4645. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, пишу игру змейка и столкнулся с проблемой реализации столкновения змеи с барьерами. Подскажите в чем у меня ошибка, все работает,пока не добавляю в метод pick() проверку циклом не попала ли змея в барьер. Хотя такая же реализация столкновения головы змеи с хвостом прекрасно работает
класс интерфейса
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
    import pygame
 
class GUI():
    def __init__(self):
        """Данный список это игровое поле где 0 это квадрат,а 1 это пустое место"""
        self.level = [
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        ]
        self.indicator = [[12,12]] #Список для заполнения индикатора длины змеи
        self.image_win = pygame.image.load("image/win.jpg") #Заставка победы
        self.image_game_over = pygame.image.load("image/game over.jpg") #Заставка проигрыша
        self.barrier = [[]] #Хранит координаты препятствий
 
    def draw_level(self,window,color):
        """Здесь мы отрисовываем элементы игрового поля"""
        x = 1
        y = 1
        for i in self.level:
            if i == 0:
                pygame.draw.rect(window,color,pygame.Rect(x,y,10,10))
                self.barrier.append([x,y])
            x += 11
            if x == 441:
                y += 11
                x = 1
 
    def draw_interface(self,window,color,snake):
        """Рисует интерфейс игры"""
 
        for i in self.indicator:
            pygame.draw.rect(window,color,pygame.Rect(i[0],i[1],10,10))
 
        if len(self.indicator) - 1 == 36: #Если заполнили индикатор то запускаем победный экран
            self.draw_win(snake)
        elif len(self.indicator) == 0: #Если длина змеи меньше начальной,запускаем экран проигрыша
            self.draw_game_over(snake)
 
    def draw_win(self,snake):
        """Создает победный экран"""
        window = pygame.display.set_mode((480, 360))
        pygame.display.set_caption("Змейка")
        while True:
            snake.route = snake.control(snake.route) #Это для того чтобы экран можно было закрыть
            window.blit(self.image_win,(0,0))
            pygame.display.flip()
 
    def draw_game_over(self,snake):
        """Создает экран проигрыша"""
        window = pygame.display.set_mode((1200, 675))
        pygame.display.set_caption("Змейка")
        while True:
            snake.route = snake.control(snake.route)  # Это для того чтобы экран можно было закрыть
            window.blit(self.image_game_over, (0, 0))
            pygame.display.flip()
класс змеи
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import pygame
import sys
 
class Snake():
    def __init__(self,color):
 
        self.color = color # Цвет змеи
        self.route = "RIGHT"
        self.head = [45,45] #Позиция головы змеи,для управления ею
        self.body = [[45,45],[34,45],[23,45]] # Тело змеи
        self.speed = 10 # Чем выше значение тем ниже скорость
 
    def draw_snake(self,window):
        """Отрисовывает тело змеи"""
        for segment in self.body:
            pygame.draw.rect(window,self.color,pygame.Rect(segment[0],segment[1],10,10))
 
    def move(self,indicator):
        """Движение змеи, route это флаг направления. Мы удаляем с конца списка змеи сегмент,
        затем прибавляем в начало элемент головы. Мы тут также проверяем на столкновение с краем экрана"""
 
        if self.route == "RIGHT":
            self.head[0] += 11
            if self.head[0] == 419:
                self.head[0] = 23
                self.body.pop()
                indicator.pop()
        elif self.route == "LEFT":
            self.head[0] -= 11
            if self.head[0] == 12:
                self.head[0] = 419
                self.body.pop()
                indicator.pop()
        elif self.route == "UP":
            self.head[1] -= 11
            if self.head[1] == 23:
                self.head[1] = 419
                self.body.pop()
                indicator.pop()
        elif self.route == "DOWN":
            self.head[1] += 11
            if self.head[1] == 419:
                self.head[1] = 34
                self.body.pop()
                indicator.pop()
 
    def control(self,route):
        """Функция управления змеей,также делаем,чтобы
        если змея едет вправо,нельзя было поехать влево и так далее"""
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT and route != "LEFT":
                    route = "RIGHT"
                elif event.key == pygame.K_LEFT and route != "RIGHT":
                    route = "LEFT"
                elif event.key == pygame.K_UP and route != "DOWN":
                    route = "UP"
                elif event.key == pygame.K_DOWN and route != "UP":
                    route = "DOWN"
                elif event.key == pygame.K_ESCAPE:
                    sys.exit()
            elif event.type == pygame.QUIT:
                sys.exit()
        return route
 
    def pick(self,food,gui):
        """Метод который реализует сбор еды змеей. Постоянно добавляем к списку тела змеи сегмент головы.
        Если еда съедена, то к телу прибавляется новый сегмент иначе мы с конца списка тела удаляем сегмент,
        предотвращая рост тела змеи"""
        self.body.insert(0, list(self.head))
        for segment in self.body[1:]: #Проверяем,если голова врезалась в сегмент тела,то удаляем сегмент и естественно из индикатора
            if self.head == segment:
                self.body.pop()
                gui.indicator.pop()
 
        for barrier in gui.barrier: #Проверяем не попала ли змея в барьер
            if self.head == barrier:
                self.body.pop()
                gui.indicator.pop()
 
        if self.head == food.food_position:
            food.get_food_positon() #Если съели еду,то получаем новые координаты еды
            gui.indicator.append([gui.indicator[-1][0] + 11,12]) #Добавляем к списку индикатора координаты для следующего квадрата
        else:
            self.body.pop()
основной цикл игры
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import pygame
from snake import Snake
from color import Color
from food import Food
from  gui import GUI
 
screen_width = 441
screen_height = 441
clock = pygame.time.Clock()
 
def main():
    pygame.init() #Инициализируем pygame
    window = pygame.display.set_mode((screen_width, screen_height))
    pygame.display.set_caption("Змейка")
    color = Color()
    gui = GUI()
    snake = Snake(color.green)
    food = Food(color.red)
    food.get_food_positions()
    food.get_food_positon()
    var = 0 #Переменная для изменеия скорости змеи
 
    while True:
        var += 1
        snake.route = snake.control(snake.route)
        window.fill(color.black)
        food.draw_food(window)
        snake.draw_snake(window)
        gui.draw_interface(window,color.green,snake)
        gui.draw_level(window,color.grey)
        if var % snake.speed == 0:
            snake.move(gui.indicator)
            snake.pick(food,gui)
        pygame.display.flip()
        clock.tick(90) # Данный метод задает сколько раз в секунду будет прогонятся цикл
main()
ошибка которую выдает
Миниатюры
Столкновение с объектом в игре змейка  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.09.2018, 12:27
Ответы с готовыми решениями:

Столкновение с объектом
Добрый вечер! может кто мне объяснить что к чему? Я пишу 2Д игру, где персонаж двигается как бы по сетке. он двигается командой:...

Столкновение с объектом
Подскажите пожалуйста как правильно настроить столкновение с объектом. Есть игра, объекты двигают, но при столкновении ничего не...

Столкновение RayCast с объектом
Здравствуйте! Я не очень опытный программист и у меня есть вопрос. Я создал Line и настроил его так, чтобы между врагом и игроком была...

5
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
03.09.2018, 14:18
Написано ошибка pop из пустого листа, проверяй что там в self.body
0
1 / 1 / 0
Регистрация: 09.03.2017
Сообщений: 57
03.09.2018, 14:26  [ТС]
В self.body 3 ячейки, как он может быть пустым?
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
03.09.2018, 15:36
Цитата Сообщение от lopatuxin Посмотреть сообщение
В self.body 3 ячейки, как он может быть пустым?
Ну как-то же может раз ошибка вылезла, поставь брейк и отдебаж
0
1 / 1 / 0
Регистрация: 09.03.2017
Сообщений: 57
03.09.2018, 18:40  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
 if 331 > self.head[0] > 111 and (self.head[1] == 166 or self.head[1] == 309):
            self.body.pop()
            gui.indicator.pop()
        elif (self.head[0] == 122 and (self.head[1] == 144 or self.head[1] == 155 or
              self.head[1] == 320 or self.head[1] == 332)):
            self.body.pop()
            gui.indicator.pop()
        elif (self.head[0] == 320 and (self.head[1] == 144 or self.head[1] == 155 or
              self.head[1] == 320 or self.head[1] == 332)):
            self.body.pop()
            gui.indicator.pop()
так все работает, почему не работает в цикле я не пойму, и хотелось бы понять
0
165 / 114 / 59
Регистрация: 12.07.2018
Сообщений: 277
03.09.2018, 19:27
Лучший ответ Сообщение было отмечено lopatuxin как решение

Решение

Цитата Сообщение от lopatuxin Посмотреть сообщение
так все работает, почему не работает в цикле я не пойму
Не работает потому, что координаты в barrier заносятся при каждом вызове draw_level, т.е. в нём каждая координата будет присутствовать многократно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.09.2018, 19:27
Помогаю со студенческими работами здесь

Не срабатывает столкновение с объектом
Не срабатывает столкновение с объектом. При столкновении объект "Персонаж" должен телепортироваться в начальную точку (точка указывается в...

Столкновение объектов и следование камеры за объектом
Привет:) Столкнулся с такой проблемой: Ранее во всех приложениях фон был размером с рабочую область, а сейчас игровое пространство...

Змейка - продумать столкновение со стеной
Как я уже писал, дошло дело до изучения рисования. И вот решил велосипед змейку изобрести. Тема такая, имеем отступ сверху, чтоб всякие...

Столкновение объекта с другим объектом. Его поведение
Доброго времени суток. Как сделать так, чтобы объект при соприкосновении с каким - то другим объектом (например с поверхностью, парящей в...

Как проверить столкновение объекта с другим объектом проверяя тег (я новичок)
Проблема такая. У меня есть шар и шип, при столкновении шара с шипом должно происходить какое либо событие. Но шип должен быть с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru