将两个Int变量与房间/边距进行比较以获得错误

时间:2012-11-04 16:10:43

标签: c# java int compare

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变量可能是几位数,所以如果我有蛇的一段的半径(解释'蛇'在下面替代)然后,如果我是正确的,价值是一点点,它应该仍然回来积极。

替代

如果有人能提出更好的方法吗?基本上它是一个Snake游戏,headX和headY是蛇的头部,细胞中剩下的X和Y变量是身体,我试图比较头部是否撞击身体。

我测试了它似乎工作但是在我再次测试它之后,它似乎只会拾取碰撞,如果我让蛇双回来自己的几个方格。例如如果我穿过身体垂直,它将无法检测到碰撞。

此外,我相当确定在蛇移动的每个块之后调用此方法。

干杯, 沙恩。

P.S在我的血液中运行很少的睡眠和太多的糖,如果你需要进一步的澄清,因为上面没有多少意义让我知道。

3 个答案:

答案 0 :(得分:7)

int eps = 5;
if (Math.abs(tempX - headX) <= eps && Math.abs(tempY - headY) <= eps) { 
    // ...
}

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

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

如果您需要确切的距离,请使用毕达哥拉斯公式。为了将距离与误差范围进行比较,您不需要计算平方根。而是将距离的平方与误差范围的平方进行比较。这节省了时间。 (x1-x0)^2 + (y1-y0)^2 < error_margin^2