我试图在libgdx项目中创建随机项。我对Java比较新,但这里是我为该方法提出的代码。 我已经在这一个星期待了一个星期,并且我想在这里问一个答案。 我一直试图想出一些先行的东西。所以请原谅破旧的代码。 方法的number参数是将要创建的项目数。 该项只需要一个随机的x位置,它是在容器宽度的约束内生成的。 游戏是自下而上的滚动条,生成不同的平台。
private Item[] generateRandomItems(int number){
Money[] items=new Money[number];
for(int i=0;i<number;i++){
Random r=new Random();
int x =r.nextInt(120)+3;//136 is the width of the container to which the item is to be generated
Money tempitem=generateMoney(x);//generateMoney() just returns a new instance of the Money class with the created x passed in as a param.
if(i!=0) {
for (int j=0;j<i;j++) {
boolean failed=true;
while (failed) {
//getItem() returns the bounding rectangle/circle f the item
if (!Intersector.overlaps(tempitem.getItem(), items[j].getItem())) {
failed = false;
items[i] = tempitem;
}else{
Random random= new Random();
int newX=random.nextInt(120)+3;
tempitem=generateMoney(newX);
}
}
}
}else{
items[i]=tempitem;
}
}
return items;
}
我不知道这是否是一种正确的方法,但是创建的项目有时会发生冲突。我一直试图找出代码有什么问题now.Any建议改进代码也很感激。
编辑::我知道代码是不必要的复杂。这是我第一次尝试程序生成。所以请原谅我。
答案 0 :(得分:0)
如果发生碰撞,不应生成新的随机位置,而是应该向左或向右移动它,直到没有碰撞。为了说明在每次碰撞后重复使用随机生成的问题,如果你有10个插槽并且已经填充了9个插槽,则可能需要很长时间才能使用随机生成找到该插槽,因为您几乎肯定会多次击中同一个对象。但是,如果你每次跟踪你检查的位置并故意移动到一个新的位置,那么最坏的情况是你在找到空位之前你会击中每个对象一次。
您可以检查有多少重叠并移动该数量以清除对象,然后检查以确保它不会与其旁边的另一个对象发生碰撞,如果确实没有碰撞它直到有一个免费的地方。如果你碰到屏幕的边缘,移动到另一边并继续移动,直到你找到一个自由点。
此外,作为良好的编码实践,您应该避免将数字(如120 + 3)硬编码到方法调用中。由于您在多个地方使用相同的值,如果您决定将容器的宽度更改为500,那么您必须在所有这些位置更改它...如果您忘记更改一个,那么您将打开自己的位置寻找虫子的噩梦。相反,您可以设置一个整数,如containerWidth = 120或直接使用container.setWidth(120)设置容器宽度,然后每次调用随机方法时使用container.getWidth()以获取容器的宽度随机值也受到限制。无论哪种方式都可以正常工作,以适合您的工作流程为准。我知道你说这是快速而邋code的代码只是为了让它继续下去,所以你可能已经意识到了这一点。
答案 1 :(得分:0)
感谢您的回答。我现在知道检查每个生成的项目是否有冲突而不保存以前生成的项目是不好的。 但是我在之前的代码中得到了一些帮助,并希望与将来需要它的人分享。 我将检查部分移动到一个新方法中,并在检查了之前所有项目的碰撞后添加了一个新标记,以查看该项目是否正确生成。
attributes :id, :title, :text, :created_at, :updated_at, :users
def users
object.authors
end