почему столкновение между двумя движущимися объектами в pygame не работает?

#python #pygame #collision-detection #collision

#python #pygame #обнаружение столкновений #столкновение

Вопрос:

Я играю в игру со змеями (в игре есть две змеи) с pygame, и я хочу определить, когда голова змеи сталкивается с другим телом змеи, сделайте это для обоих и для особого случая, когда обе головы сталкиваются, в настоящее время я делаю столкновение между головой змеи и другой змеейтело, оно отлично работает, если одна из змей заморожена, а другая движется, но если оба движутся, столкновение просто не работает, вот код, который перемещает змей:

 new_pos = None
        if direction == 'DOWN':
            new_pos = (snake[0][0], snake[0][1]   size)
        if direction == 'UP':
            new_pos = (snake[0][0], snake[0][1] - size)
        if direction == 'LEFT':
            new_pos = (snake[0][0] - size, snake[0][1])
        if direction == 'RIGHT':
            new_pos = (snake[0][0]   size, snake[0][1])
        if new_pos:
            snake = [new_pos]   snake
            del snake[-1]
  

имейте в виду, что код, который перемещает другую змею, тот же, но snake превращается в snake2, new_pos в new_pos2 и т. Д

код столкновения:

 if snake2[0] in snake[1:]:
            gameOverBlue()

if snake2[0] in snake[1:]:
            gameOverRed()
  

редактировать: я решил, что мне следует добавить код, который тоже создает змею:

 #snake
    size = 15
    s_pos = 60
    snake = [(s_pos   size * 2, s_pos),(s_pos   size, s_pos),(s_pos, s_pos)]
    s_skin = pygame.Surface((size, size))
    s_skin.fill((82,128,208))
#snake2
    size2 = 15
    s2_pos = 195
    snake2 = [(s2_pos   size2 * 2, s2_pos),(s2_pos   size2, s2_pos),(s2_pos, s2_pos)]
    s2_skin = pygame.Surface((size2, size2))
    s2_skin.fill((208,128,82))
  

Комментарии:

1. Вторая проверка столкновения должна быть snake [0] в snake2 [1:]: ?

2. Также вы не проверяете наличие столкновений между головами.

3. о, хорошо, позвольте мне посмотреть, работает ли это, изменив это редактирование: тоже не работает, и я знаю, что я не проверяю столкновения лицом к лицу

Ответ №1:

Вам нужно оценить, есть ли заголовок snake в списке snake2 , включая заголовок snake2 :

 if snake[0] in snake2:
    gameOverBlue()
  

и если глава snake2 находится в snake :

 if snake2[0] in snake:
    gameOverRed() 
  

Если вы хотите определить, сталкиваются ли головы змей, вам нужно сравнить snake[0] и snake2[0] отдельно:

 if snake[0] == snake2[0]:
    print("heads are colliding")

if snake[0] in snake2[1:]:
    gameOverBlue()
if snake2[0] in snake[1:]:
    gameOverRed() 
  

Комментарии:

1. это работает, но как я могу добавить случай, когда голова сталкивается с головой?

2. @zac Я расширил ответ.