基于Python Turtle的Pong游戏:碰撞检测实现求助(结束游戏+墙体碰撞)
解决方案
针对你的两个需求,以下是修改后的完整代码及关键改动说明:
修改后的代码
# Game creation # Pong game test import time import turtle wn = turtle.Screen() wn.title("Pong") wn.bgcolor("Black") wn.setup(width=800, height=800) wn.tracer(0) # paddle a paddle_a = turtle.Turtle() paddle_a.speed(0) paddle_a.shape("square") paddle_a.color("white") paddle_a.penup() paddle_a.goto(0, -300) # 存储所有红色方块的列表 red_blocks = [] # 创建红色方块并加入列表 def create_red_block(x, y): block = turtle.Turtle() block.speed(0) block.shape("square") block.color("red") block.penup() block.goto(x, y) red_blocks.append(block) # 创建所有红色方块 create_red_block(0, 0) create_red_block(0, 100) create_red_block(0, 300) create_red_block(0, -200) create_red_block(0, -100) create_red_block(0, 200) create_red_block(0, 100) # 重复位置的方块 create_red_block(0, 1) # 检查是否与红色方块碰撞 def is_colliding(turtle_obj): for block in red_blocks: if turtle_obj.distance(block) < 20: return True return False # Functions def paddle_a_up(): # 记录当前位置 prev_y = paddle_a.ycor() y = prev_y + 30 paddle_a.sety(y) # 碰撞则回退 if is_colliding(paddle_a): paddle_a.sety(prev_y) def paddle_a_down(): prev_y = paddle_a.ycor() y = prev_y - 30 paddle_a.sety(y) if is_colliding(paddle_a): paddle_a.sety(prev_y) def paddle_a_fun(): prev_x = paddle_a.xcor() x = prev_x + 20 paddle_a.setx(x) if is_colliding(paddle_a): paddle_a.setx(prev_x) def paddle_a_dow(): prev_x = paddle_a.xcor() x = prev_x - 20 paddle_a.setx(x) if is_colliding(paddle_a): paddle_a.setx(prev_x) # Keyboard binding wn.listen() wn.onkeypress(paddle_a_up, "w") wn.onkeypress(paddle_a_down, "s") wn.onkeypress(paddle_a_fun, "d") wn.onkeypress(paddle_a_dow, "a") # 主循环 while True: wn.update() # Border checking if paddle_a.ycor() > 380: turtle.bye() # 检测是否碰到任意红色方块,碰到则结束游戏 if is_colliding(paddle_a): turtle.bye()
关键改动说明
批量管理红色方块:
把所有红色方块存入red_blocks列表,避免单个变量的冗余,方便统一做碰撞检测。新增create_red_block函数简化方块创建流程。碰撞检测函数:
新增is_colliding函数,遍历所有红色方块,通过turtle.distance()判断是否发生碰撞(方块默认尺寸20x20,距离小于20即为碰撞)。墙体效果实现:
修改每个移动函数:先记录paddle移动前的位置,执行移动后检测是否碰撞,若碰撞则将paddle移回原位置,实现无法穿过方块的墙体效果。碰到方块结束游戏:
在主循环中调用is_colliding函数,一旦检测到碰撞,立即调用turtle.bye()关闭游戏窗口。
内容的提问来源于stack exchange,提问作者NewPycoder
相关产品推荐
相关产品推荐

