如何在Python Turtle中实现碰撞检测?新手游戏移动触发碰撞问题
解决Turtle游戏中玩家移动触发碰撞的问题
嘿,作为Python Turtle新手能写出游戏框架已经超棒啦!你的问题核心在于碰撞检测只执行了一次——程序启动时检查了一次玩家和敌人的距离,但之后玩家移动或者敌人移动时,代码不会再主动去检测碰撞。咱们一步步来修复这个问题:
第一步:添加玩家移动控制
首先得让玩家能通过键盘移动对吧?我们给上下左右键绑定移动函数,每次移动后立刻检查碰撞:
# 定义玩家移动函数,每次移动后调用碰撞检测 def move_up(): player.sety(player.ycor() + 10) check_collision() def move_down(): player.sety(player.ycor() - 10) check_collision() def move_left(): player.setx(player.xcor() - 10) check_collision() def move_right(): player.setx(player.xcor() + 10) check_collision()
第二步:封装碰撞检测逻辑
把碰撞检测写成一个单独的函数,这样每次移动后都能调用,代码更清晰,也方便后续修改阈值:
def check_collision(): # 敌人是圆形海龟,默认半径约10,把距离阈值设为15会更准确 if player.distance(enemy) < 15: player.hideturtle() player.setposition(260, 260) player.showturtle()
第三步:让敌人动起来(可选但更有趣)
如果敌人一直不动,游戏会有点无聊,我们可以让敌人随机移动,用ontimer实现定时移动的效果:
import random def move_enemy(): # 随机生成移动的x、y增量 dx = random.randint(-20, 20) dy = random.randint(-20, 20) # 限制敌人在你画的正方形边界内,避免跑出视野 new_x = enemy.xcor() + dx new_y = enemy.ycor() + dy if -280 < new_x < 280 and -280 < new_y < 280: enemy.setposition(new_x, new_y) # 每隔1秒(1000毫秒)调用一次自己,实现持续移动 wn.ontimer(move_enemy, 1000)
第四步:绑定键盘事件&启动游戏循环
最后要让屏幕监听键盘输入,启动敌人移动和Turtle的主事件循环:
# 让屏幕监听键盘按键 wn.listen() wn.onkey(move_up, "Up") wn.onkey(move_down, "Down") wn.onkey(move_left, "Left") wn.onkey(move_right, "Right") # 启动敌人的随机移动 move_enemy() # 启动Turtle的主事件循环,保持窗口打开并响应事件 wn.mainloop()
完整可运行代码
把所有部分整合起来,就是这样:
from turtle import Turtle, Screen import random wn = Screen() wn.bgcolor("black") # 绘制游戏边界 artist = Turtle() artist.color('white') artist.speed(0) artist.penup() artist.setposition(-300, -300) artist.pendown() artist.pensize(4) for side in range(4): artist.fd(600) artist.lt(90) artist.hideturtle() # 创建玩家海龟 player = Turtle() player.color("white") player.penup() player.setposition(260, 260) player.speed(10) # 创建敌人海龟 enemy = Turtle('circle') enemy.color('red') enemy.penup() enemy.speed(9) # 碰撞检测函数 def check_collision(): if player.distance(enemy) < 15: player.hideturtle() player.setposition(260, 260) player.showturtle() # 玩家移动函数 def move_up(): player.sety(player.ycor() + 10) check_collision() def move_down(): player.sety(player.ycor() - 10) check_collision() def move_left(): player.setx(player.xcor() - 10) check_collision() def move_right(): player.setx(player.xcor() + 10) check_collision() # 敌人随机移动函数 def move_enemy(): dx = random.randint(-20, 20) dy = random.randint(-20, 20) new_x = enemy.xcor() + dx new_y = enemy.ycor() + dy if -280 < new_x < 280 and -280 < new_y < 280: enemy.setposition(new_x, new_y) wn.ontimer(move_enemy, 1000) # 绑定键盘事件 wn.listen() wn.onkey(move_up, "Up") wn.onkey(move_down, "Down") wn.onkey(move_left, "Left") wn.onkey(move_right, "Right") # 启动游戏 move_enemy() wn.mainloop()
现在你运行代码,用方向键控制白色海龟移动,碰到红色圆形敌人就会立刻回到起点啦!
内容的提问来源于stack exchange,提问作者The Weird
相关产品推荐
相关产品推荐

