为什么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]

请记住,移动另一条蛇的代码是相同的,但是蛇变成了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_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_skin = pygame.Surface((size2,size2))
    s2_skin.fill((208,82))

解决方法

您需要评估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()