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

Adafruit TFT 1.8屏幕贪吃蛇:如何检测两等大圆形是否接触?

解决Adafruit TFT 1.8屏贪吃蛇的圆形碰撞检测问题

嘿,我来帮你搞定这个碰撞检测的bug!你说用了√(dx² + dy²)的公式但一直输出“NOT TOUCHING”,大概率是这几个地方出了问题,咱们一步步排查修复:

首先,优化碰撞检测逻辑(避免浮点误差+提升效率)

你用的开根号计算其实没必要,而且容易引入浮点精度问题——比如当距离刚好等于6(两个半径之和)时,浮点数的舍入误差可能会让结果略大于6,导致误判。更可靠的做法是直接比较距离的平方和半径和的平方:

因为两个圆半径都是3,所以半径之和是6,平方就是36。只要两个圆心的距离平方 ≤36,就说明它们接触或重叠了。

替换成这样的代码试试:

bool isColliding(int snakeHeadCenterX, int snakeHeadCenterY, int foodCenterX, int foodCenterY) {
    int dx = snakeHeadCenterX - foodCenterX;
    int dy = snakeHeadCenterY - foodCenterY;
    int distanceSquared = dx * dx + dy * dy;
    // 两个半径都是3,总和6,平方为36
    return distanceSquared <= 36;
}

然后,检查圆心坐标的计算是否正确

你提到“圆的中心坐标由屏幕位置x计算得到”,这里很可能是出错的核心:

  • 如果你用Adafruit库的drawCircle(x, y, 3, color)函数,那(x,y)就是圆心坐标,没问题。
  • 但如果是你自己绘制的图形(比如用方块模拟圆),或者把蛇头的左上角位置当成了圆心,那就要调整:比如蛇头的左上角是(x,y),直径是6(半径3),那圆心应该是x+3和y+3。

最后,用调试输出排查数值问题

如果还是不行,加个串口打印看看具体的坐标和计算值,就能直观找到问题:

bool isColliding(int snakeHeadCenterX, int snakeHeadCenterY, int foodCenterX, int foodCenterY) {
    int dx = snakeHeadCenterX - foodCenterX;
    int dy = snakeHeadCenterY - foodCenterY;
    int distanceSquared = dx * dx + dy * dy;
    
    // 串口打印调试信息
    Serial.print("蛇头圆心: (");
    Serial.print(snakeHeadCenterX);
    Serial.print(", ");
    Serial.print(snakeHeadCenterY);
    Serial.print(") | 食物圆心: (");
    Serial.print(foodCenterX);
    Serial.print(", ");
    Serial.print(foodCenterY);
    Serial.print(") | 距离平方: ");
    Serial.println(distanceSquared);
    
    return distanceSquared <= 36;
}

打开Arduino的串口监视器,看看当蛇头靠近食物时,距离平方是不是真的大于36——如果是,说明坐标计算错了;如果小于等于36但函数返回false,那就是逻辑写错了。

另外别忘了确认屏幕坐标范围:Adafruit TFT 1.8屏的分辨率是160x128,x范围0-159,y范围0-127,确保你的坐标没有超出这个范围,不然会出现异常数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:50:58