PyGame开发蛇游戏时碰撞检测误触发问题求助
解决Pygame蛇游戏碰撞检测误触发问题
我一眼就看出问题所在了——你的碰撞检测用的snake_rect和jablko_rect根本没有和蛇、苹果的实际绘制位置同步!
问题根源
当你用snake.get_rect()和jablko.get_rect()获取矩形时,这些矩形默认的位置是(0, 0)(屏幕左上角)。但实际绘制蛇的时候你用的是(x1 - 25, y1 - 25),绘制苹果用的是(jablko_x, jablko_y),但你从来没更新过这两个rect的坐标。这就导致不管蛇和苹果在屏幕上怎么动,检测碰撞的两个矩形一直停在左上角重叠着,colliderect自然会一直返回True,无限打印"Mniam!"。
修复步骤
同步蛇的矩形位置
在每次更新蛇的坐标x1和y1之后,更新snake_rect的位置,让它和实际绘制的蛇对齐:x1 += x1_zmiana y1 += y1_zmiana # 添加这行代码同步蛇的rect位置 snake_rect.topleft = (x1 - 25, y1 - 25)同步苹果的矩形位置
在生成苹果坐标之后,立刻设置jablko_rect的位置,确保它和绘制的苹果位置一致:jablko_x = round(random.randrange(0, SZEROKOSC - 25) / 25.0) * 25.0 jablko_y = round(random.randrange(0, WYSOKOSC - 25) / 25.0) * 25.0 # 添加这行代码设置苹果的rect位置 jablko_rect.topleft = (jablko_x, jablko_y)另外,如果之后蛇吃掉苹果需要重新生成苹果,别忘了也要同步更新
jablko_rect的位置哦。修复未定义的
white变量
你的代码里游戏结束界面用到了white但没定义,会导致报错,记得在初始化部分添加:white = (255, 255, 255)
修复后的关键代码片段
这里是调整后的核心部分,方便你参考:
# 初始化颜色变量 white = (255, 255, 255) def petla_gry(): # ... 其他代码 ... jablko_x = round(random.randrange(0, SZEROKOSC - 25) / 25.0) * 25.0 jablko_y = round(random.randrange(0, WYSOKOSC - 25) / 25.0) * 25.0 # 设置苹果rect位置 jablko_rect.topleft = (jablko_x, jablko_y) while not przegrana: # ... 事件处理代码 ... x1 += x1_zmiana y1 += y1_zmiana # 同步蛇的rect位置 snake_rect.topleft = (x1 - 25, y1 - 25) plansza.fill(white) plansza.blit(snake, (x1 - 25, y1 - 25)) plansza.blit(jablko, (jablko_x, jablko_y)) pygame.display.update() if snake_rect.colliderect(jablko_rect): print("Mniam!") # 如果要重新生成苹果,记得这里也要更新jablko_rect的位置 jablko_x = round(random.randrange(0, SZEROKOSC - 25) / 25.0) * 25.0 jablko_y = round(random.randrange(0, WYSOKOSC - 25) / 25.0) * 25.0 jablko_rect.topleft = (jablko_x, jablko_y) # ... 其他代码 ...
这样修改后,碰撞检测就会基于蛇和苹果的实际位置进行,不会再出现误触发的情况了。
内容的提问来源于stack exchange,提问作者Kiren78
相关产品推荐
相关产品推荐

