【问题标题】:Comparing two Int variables with room/margin for error比较两个 Int 变量与空间/边距的错误
【发布时间】:2012-11-04 16:10:42
【问题描述】:
public void checkForCollision () {
          
  int headX = cells[0].x; 
  int headY = cells[0].y;
  int noOfParts = nPoints;
  
  for(int i = 1; i <noOfParts;i++)
  {
     int tempX = cells[i].x;
     int tempY = cells[i].y;
     
     
      if(tempX == headX && tempY == headY){
          JOptionPane.showMessageDialog(null,"Head hit body");
          //EndGameCollectScore etc.
        }
  }
       
} 

编辑:'Cells[]' 是 Point 类型的数组,noOfParts 是蛇有多少段

主要问题

使用上面的代码,我试图将 tempX 与 headX 进行比较,但我希望有一些错误余量,例如+-5 但我不确定如何做到这一点,我背后的原因是我在想也许 x 和 Y 变量可能相差几位数,所以如果我有蛇的一段的半径(解释'蛇'在下面的备用)然后如果我是对的并且值有点偏离它应该仍然是积极的。

另类

是否有人可以提出更好的方法来做到这一点?基本上它是针对蛇游戏的,headX 和 headY 是蛇的头部,而 Cells 中剩余的 X 和 Y 变量是身体,我正在尝试比较头部是否撞到身体。

我对其进行了测试,它似乎可以工作,但是在我再次对其进行测试之后,它似乎只会在我让蛇在自己身上翻倍几个方格时才会发生碰撞。例如如果我垂直穿过身体,它不会检测到碰撞。

我也相当肯定这个方法在蛇每移动一个方块后被调用。

干杯, 肖恩。

P.S 睡眠很少,血液中的糖分过多,如果您需要进一步澄清,因为上述内容没有多大意义,请告诉我。

【问题讨论】:

    标签: c# java int compare


    【解决方案1】:
    int eps = 5;
    if (Math.abs(tempX - headX) <= eps && Math.abs(tempY - headY) <= eps) { 
        // ...
    }
    

    【讨论】:

    • 简单但有效,谢谢。我仍然遇到蛇有时能够通过自己的问题,但我认为这可能是另一个问题。
    【解决方案2】:

    要检查两个点是否在彼此之间的delta 内,请计算它们之间的距离。您可以通过使用正方形来避免进入平方根领域,如下所示:

    int distSq = (tempX-headX)*(tempX-headX) + (tempY-headY)*(tempY-headY);
    int minDist = 5;
    if (distSq < minDist*minDist) {
        // too close
    }
    

    【讨论】:

    • 我相信这也行得通,我很高兴你写了这个答案,但是由于简单,我将投票 2kay 的答案作为接受。
    【解决方案3】:

    我不知道你的蛇长什么样,但如果它的形状很复杂,就速度而言,寻找命中可能会很昂贵。如果可以进行快速测试,则可以加快碰撞检测速度,看看是否可能发生碰撞。您可以通过使用边界框来做到这一点。您必须跟踪蛇体的最小和最大 x 和 y 位置。只有当坐标位于这些边界内时,您才会考虑蛇的确切形状。如何做到这一点取决于蛇的表现方式。检查构成蛇的每个图块或每个像素,或者检查坐标是否在多边形内,如果蛇的轮廓是由多边形定义的。 (我不打算在这里解释它是如何工作的,但是如果你谷歌一下你会发现算法。)

    如果您需要计算到另一个点(蛇头)的距离,您可以为此使用不同的指标。如果游戏中只能进行水平和垂直移动,则可以使用所谓的曼哈顿或滑行距离:d = |x1-x0| + |y1-y0|。它包括添加 x 和 y 距离,或者您可以使用两个距离中的最大值:d = Max(|x1-x0|, |y1-y0|)(对应于 2kay 的方法)。

    如果您需要准确的距离,请应用毕达哥拉斯公式。为了将距离与误差幅度进行比较,您不需要计算平方根。而是将距离的平方与误差幅度的平方进行比较。这样可以节省时间。 (x1-x0)^2 + (y1-y0)^2 &lt; error_margin^2.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多