2012-08-08 34 views
1

我想我一直在盯着这段代码太久,而我没有看到它。我正在写一个小游戏,其中的一部分会生成一些对象(当前的形状)。随着形状的创建,它们被添加到ArrayList中作为由类定义的对象。我注意到,随着形状数量的增加,重叠形状的机会增加,这是我想解决的。我试图通过检查Y坐标对阵ArrayList中每个现有对象的Y坐标来实现。但是对于我的生活,我记不起如何继续迭代检查函数,直到生成唯一的Y值。在检查ArrayList时继续生成值

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

我简化了我的代码,只是保留了对我的问题至关重要的部分。我错过了什么?预先感谢您的帮助。

编辑:另外请记住,随着游戏进行,对象会不断地从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; 
} 
+0

OY!那些是你得到的一些描述性变量名称 – 2012-08-08 20:39:49

+0

如何使用[TreeSet](http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html)与y坐标? – 2012-08-08 20:42:45

+0

你的身高值可能太低。其余的“缩短”代码对我来说看起来很好。 – 2012-08-08 20:54:57

回答

0

因为我基本上想通了这个问题我自己,我张贴它作为一个答案。

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

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

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; 
} 
+0

感谢您的输入。当我专注于功能时,我一直忘记观看结构。我通常会在稍后回去清理一些东西,但是我应该先开始做,这样我以后就不用担心了。 – jb11 2012-08-08 21:45:02