You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:28:24