检查ArrayList时保持生成值

时间:2012-08-08 20:34:50

标签: java loops arraylist

我想我一直在盯着这段代码而且我没有看到它。我正在写一个小游戏,其中一部分生成了许多对象(目前是形状)。在创建形状时,它们将作为类定义的对象添加到ArrayList中。我注意到随着形状数量的增加,形状重叠的可能性增加,我想修复。我试图通过检查Array坐标中每个现有对象的Y坐标的Y坐标来实现。但对于我的生活,我不记得继续迭代检查功能的方法,直到我生成唯一的Y值。

我的初始解决方案是do ... while循环,但由于某种原因它会一直返回true。

我简化了我的代码,只是保留了我的问题所必需的部分。我错过了什么?提前感谢您的帮助。

编辑:还要记住,随着游戏的进行,对象会不断添加到ArrayList中或从ArrayList中删除。每次在游戏过程中移除一个物体(形状)时,它都会被重新生成。这意味着对于游戏中创建的每个对象,都需要根据现有对象进行检查。

int x, y;
int numShapes = 10;
ArrayList<ShapeObject> soArray = new ArrayList<ShapeObject>();


private boolean checkY(int yy) {
  for(int i = 0; i < soArray.size(); i++) {
    if(soArray.get(i).oY == yy) {
      return true;
    }
  }
  return false;
}


public void makeShapes() {
  for(int i = 0; i < numShapes; i++) {
    if(soArray.size() < numShapes) {
      x = rand.nextInt(width - 45) + 45;

      do {
        y = rand.nextInt(height - 4) + 2;
      } while(checkY(y));

      soArray.add(new ShapeObject());
    }
  }
}

class ShapeObject {
  int oX = x;
  int oY = y;
}

2 个答案:

答案 0 :(得分:1)

尝试将班级结构更改为

class ShapeObject {
   int oY = 0;
   int oX = 0;

   public ShapeObject(int x, int y)
   {
     oX = x;
     oY = y;
   }
}

然后你有

soArray.add(new ShapeObject(x, y));

如果我能指出一些有用的东西,我仍在查看你的代码。

也可以尝试

if(soArray.get(i).oY == yy) {
    println(soArray.get(i).oY +' = '+ yy); //to debug
    return true;
}

答案 1 :(得分:0)

由于我基本上自己解决了这个问题,所以我将其作为答案发布。

事实证明,我忘了我被画布的界限限制了。我的单元格大小为12px,网格为600px。我注意到它会在我的ArrayList中的46个对象之后失败。所以基本上所有可用的Y坐标都被采用了。我正在测试100个对象,所以它一直在运行。

我还将checkY()修改为checkXY(),这样我就可以完全控制对象可用的行数和列数(x和y坐标)。