我正在为一个类制作游戏,游戏的一个元素是显示一些存储在ArrayList中的卷心菜。此ArrayList必须是固定数量的20,10 Goodfolbage和10 of Bad Cabbage。
在创建卷心菜时,我想确保它们在显示时不重叠。我遇到麻烦的地方是,当我发现一个重叠的卷心菜时,我不知道如何回去并在它的位置创造一个新的卷心菜。到目前为止,当代码找到重叠时,它只是停止循环。我想我无法正确地摆脱循环并重新启动未填充的索引。
这是我到目前为止所拥有的。任何建议都会非常感激。
// Initialize the elements of the ArrayList = cabbages
// (they should not overlap and be in the garden) ....
int minX = 170 ;
int maxX = 480;
int minY = 15;
int maxY = 480;
boolean r = false;
Cabbage cabbage;
for (int i = 0; i < N_GOOD_CABBAGES + N_BAD_CABBAGES; i++){
if (i % 2 == 0){
cabbage = new GoodCabbage((int)(Math.random()* (maxX-minX + 1))+ minX,
(int)(Math.random()*(maxY-minY + 1))+ minY,window);
}
else {
cabbage = new BadCabbage((int)(Math.random()* (maxX-minX + 1))+ minX,
(int)(Math.random()*(maxY-minY + 1))+ minY,window);
}
if (i >= cabbages.size()){
// compares the distance between two cabbages
for (int j = 0; j < cabbages.size(); j++){
Point c1 = cabbage.getLocation();
Cabbage y = (Cabbage) cabbages.get(j);
Point c2 = y.getLocation();
int distance = (int) Math.sqrt((Math.pow((c1.x - c2.x), 2) + Math.pow((c1.y - c2.y),2)));
if (distance <= (CABBAGE_RADIUS*2) && !(i == j)){
r = true;
}
}
if (r){
break;
}
cabbage.draw();
cabbages.add(i, cabbage);
}
}
答案 0 :(得分:1)
最简单的方法是添加另一个循环。
do ... while循环适用于总是需要至少一次迭代的情况。类似的东西:
boolean overlapped;
do {
// create your new cabbage here
overlapped = /* check whether it overlaps another cabbage here */;
} while (overlapped);
cabbage.draw();
cabbages.add(i, cabbage);
答案 1 :(得分:0)
看起来你正在制作白菜对象,然后扔掉它们,这是一种(微不足道的)浪费。
为什么不随机选择X和Y,检查那个地方是否有空间,然后在你有一个好地方的时候做白菜?你只需要翻阅数字,而不是制作和丢弃整个对象。另外,您不必为优质和坏的卷心菜重复随机位置代码。
int x,y 做{ //选择x和y } while(cabbageOverlaps(x,y,list)
//在x,y处创建一个白菜,并将其添加到列表
boolean cabbageOverlaps(int x,int y,ArrayList existingCabbages)