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

C#开发猫追老鼠小游戏:PictureBox距离触发躲避功能求助

解决猫追老鼠游戏的距离触发移动问题

嘿,我明白你现在的困扰——已经让老鼠能反向跑了,但就是加不上“距离够近才触发”的条件对吧?别着急,咱们一步步来搞定它:

第一步:正确计算两个PictureBox的距离

首先要注意,咱们得用控件中心坐标来计算距离,而不是左上角的Location,不然判断会不准(比如猫的边缘碰到老鼠中心才触发,这显然不符合直觉)。

计算距离的时候,用欧几里得距离的平方就足够了(不用开根号,能省不少性能)。比如你想把阈值设为10像素,那对应的平方值就是100;要是调整成15像素,平方值就是225。代码示例如下:

// 获取猫和老鼠的中心坐标
Point catCenter = new Point(pictureBoxCat.Location.X + pictureBoxCat.Width / 2, pictureBoxCat.Location.Y + pictureBoxCat.Height / 2);
Point mouseCenter = new Point(pictureBoxMouse.Location.X + pictureBoxMouse.Width / 2, pictureBoxMouse.Location.Y + pictureBoxMouse.Height / 2);

// 计算横纵坐标的差值
int deltaX = catCenter.X - mouseCenter.X;
int deltaY = catCenter.Y - mouseCenter.Y;

// 计算距离的平方(避免开根号,提升运行效率)
int distanceSquared = deltaX * deltaX + deltaY * deltaY;

// 设定触发移动的阈值平方(这里以10像素为例)
int triggerThresholdSquared = 10 * 10;

第二步:把移动逻辑套进条件判断里

你之前已经实现了“老鼠向猫的反方向移动”的代码,现在只需要把这段代码放到距离小于阈值的判断分支里,否则就让老鼠保持静止:

if (distanceSquared < triggerThresholdSquared)
{
    // 这里放你原来的老鼠反向移动代码,比如:
    // 计算反方向的移动向量
    int moveDirX = -deltaX; // 猫在老鼠右边,老鼠就向左跑,反之亦然
    int moveDirY = -deltaY;

    // 给移动速度加个系数,控制老鼠跑的快慢
    int moveSpeed = 5;
    // 按比例分配X/Y方向的移动距离,保证移动方向正确
    int moveX = (moveDirX * moveSpeed) / (int)Math.Sqrt(distanceSquared);
    int moveY = (moveDirY * moveSpeed) / (int)Math.Sqrt(distanceSquared);

    pictureBoxMouse.Location = new Point(
        pictureBoxMouse.Location.X + moveX,
        pictureBoxMouse.Location.Y + moveY
    );
}
else
{
    // 距离没达到阈值,老鼠保持静止,这里不需要额外代码
}

小提醒

  • 如果觉得计算根号麻烦,也可以直接用距离平方和阈值平方比较,移动时用deltaX和deltaY的比例分配速度(不用开根号也能保证方向正确)。
  • 记得把这段判断逻辑放到游戏的更新循环里(比如Timer控件的Tick事件中),这样每帧都会检查猫和老鼠的距离,及时触发移动逻辑。

这样调整之后,应该就能实现“猫靠近到设定距离时,老鼠才反向逃跑,否则保持静止”的效果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:27:28