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

Python Turtle碰撞检测失效:如何实现海龟接触时结束游戏?

解决海龟碰撞检测失效的问题

你的代码里完全没添加碰撞检测逻辑,而且直接用distance()判断时没考虑海龟的缩放尺寸,导致敌方海龟会从玩家身上滑过。以下是修复方案:

1. 确定碰撞阈值

海龟默认大小为20像素,shapesize()参数是缩放倍数:

  • 玩家海龟shapesize(2):实际尺寸为 2*20=40px,半径20px
  • 敌方海龟shapesize(3):实际尺寸为 3*20=60px,半径30px
    触发碰撞的阈值应为两者半径之和,即20+30=50px——当两者距离≤50时判定碰撞。

2. 添加检测逻辑

在每次移动玩家或敌方海龟后,立即检查碰撞状态,同时可补充玩家到达目标的胜利判定:

修改后的完整代码:

import turtle
from random import randint

# 游戏初始化
print("Welcome to Turtle Chase!")
player_name = input("What would you like to be called? ")
print("What color do you want your diver to be?")
player_color = input("Choose from red, blue, yellow, or purple: ")
print("Let's Begin!")

# 玩家海龟
turtle_h = turtle.Turtle()
turtle_h.penup()
turtle_h.shapesize(2)
turtle_h.setx(-75)
turtle_h.fillcolor(player_color)

# 敌方海龟
turtle_en = turtle.Turtle()
turtle_en.penup()
turtle_en.shape("turtle")
turtle_en.setx(-200)
turtle_en.shapesize(3)
turtle_en.fillcolor("green")

# 目标区域
turtle_goals = turtle.Turtle()
turtle_goals.penup()
turtle_goals.setx(200)
turtle_goals.sety(-10)
turtle_goals.pendown()
turtle_goals.circle(25)

# 碰撞阈值(玩家半径+敌方半径)
COLLISION_DISTANCE = 50
# 目标判定距离(目标圆半径)
GOAL_DISTANCE = 25

while True:
    num1 = randint(2, 9)
    num2 = randint(2, 9)
    product = num1 * num2
    response = input(f'What is {num1} * {num2}? (Type "exit" to quit): ')

    if response.lower() == "exit":
        print(f"Goodbye, {player_name}!")
        break

    if response.isdigit():
        if int(response) == product:
            print("Correct!")
            turtle_h.forward(35)
            # 检查是否到达目标
            if turtle_h.distance(turtle_goals) <= GOAL_DISTANCE:
                print(f"Congratulations {player_name}! You won!")
                break
        else:
            print("Incorrect!")
            turtle_en.forward(35)
            # 检查是否碰撞
            if turtle_h.distance(turtle_en) <= COLLISION_DISTANCE:
                print(f"Game Over {player_name}! The enemy caught you!")
                break
    else:
        print("Please enter a valid integer answer.")

关键说明

  • 每次移动海龟后立刻执行检测,确保状态更新后马上判断
  • 目标判定用玩家到目标海龟的距离≤目标圆半径(25px),符合视觉逻辑
  • 碰撞阈值根据海龟实际缩放后的大小计算,避免误判或漏判

内容的提问来源于stack exchange,提问作者KennzTrysToLearn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:13:19