在java中创建随机项生成器,用于libgdx项目
我正试图在libgdx项目中创建随机项,我对Java比较陌生,但下面是我为该方法编写的代码。 我已经做了一个星期了,我想我应该在这里问一个答案。 我一直想先想出一个可行的办法。所以请原谅我的破烂代码。 方法的number参数是将创建的项目数。 项目只需要有一个随机的x位置,它是在容器宽度的约束范围内生成的。 游戏是一个自下而上的滚动程序,可以生成不同的平台在java中创建随机项生成器,用于libgdx项目,java,libgdx,2d-games,Java,Libgdx,2d Games,我正试图在libgdx项目中创建随机项,我对Java比较陌生,但下面是我为该方法编写的代码。 我已经做了一个星期了,我想我应该在这里问一个答案。 我一直想先想出一个可行的办法。所以请原谅我的破烂代码。 方法的number参数是将创建的项目数。 项目只需要有一个随机的x位置,它是在容器宽度的约束范围内生成的。 游戏是一个自下而上的滚动程序,可以生成不同的平台 private Item[] generateRandomItems(int number){ Money[] items=new
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;
}
private Item[]generateRandomItems(整数){
货币[]项目=新货币[数量];
对于(int i=0;i如果发生碰撞,则不应生成新的随机位置,而应故意将其向左或向右移动,直到没有碰撞。为了说明在每次碰撞后重新使用随机生成的问题,如果有10个插槽且9个插槽已填满,则使用随机生成查找打开的插槽可能需要很长时间这是因为你几乎肯定会多次击中同一个物体。但是,如果你跟踪检查的位置,每次都故意移动到一个新的位置,那么最糟糕的情况是,在找到空位之前,你会击中每个物体一次
你可以检查有多少重叠并移动该对象以清除该对象,然后检查以确保它没有与旁边的另一个对象碰撞,如果碰撞了,则继续移动它直到有一个自由点。如果你碰到屏幕边缘,则移动到另一侧并继续移动,直到找到一个自由点
此外,作为良好的编码实践,您应该避免硬编码数字(如120+3)方法调用。由于您在多个位置使用相同的值,如果您决定将容器的宽度更改为500,那么您必须在所有这些位置更改它……如果您忘记更改一个,则会让自己陷入错误搜索的噩梦。相反,您可以设置一个整数,例如containerWidth=120或设置co直接使用container.setWidth(120),然后使用container.getWidth()每次调用random方法获取容器的宽度时,随机值也会受到限制。无论哪种方法都可以,无论哪种方法对您的工作流程更好。我知道您说过,这是快速而草率的代码,只是为了让它运行,所以您可能已经意识到了这一点。谢谢您的回答。我现在知道检查each未保存之前生成的项目而为冲突生成的项目不正确。
但是,在得到一些帮助后,我使以前的代码正常工作,并希望与将来需要它的任何人共享它。
我将检查部分移动到一个新方法中,并添加了一个新标志,以查看在检查之前所有项的冲突后,该项是否正确生成
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;
Money tempitem=generateMoney(x);
if(i>0) {
boolean generated=false;
while (!generated) {
boolean f = checkIfItemOverlapsWithPrevious(items, tempitem);
if (!f) {
items[i] = tempitem;
generated = true;
} else {
Random random = new Random();
int newX = random.nextInt(120) + 3;
System.out.println("Collided");
tempitem = generateMoney(newX);
}
}
}else{
items[i]=tempitem;
}
}
return items;
}
private boolean checkIfItemOverlapsWithPrevious(Money[] items, Money tempitem) {
for(Money item :items){
if(item!=null) {
if (Intersector.overlaps(tempitem.getItem(), item.getItem())) {
return true;
}
}
}
return false;
}
private Item[]generateRandomItems(整数){
货币[]项目=新货币[数量];
对于(int i=0;i0){
布尔生成=假;
而(!生成){
布尔f=checkIfItemOverlapsWithPrevious(items,tempitem);
如果(!f){
项目[i]=临时项目;
生成=真;
}否则{
随机=新随机();
int newX=random.nextInt(120)+3;
System.out.println(“冲突”);
tempitem=generateMoney(newX);
}
}
}否则{
项目[i]=临时项目;
}
}
退货项目;
}
私有布尔checkIfItemOverlapsWithPrevious(Money[]项,Money tempitem){
用于(货币项目:项目){
如果(项!=null){
if(Intersector.overlaps(tempitem.getItem(),item.getItem())){
返回true;
}
}
}
返回false;
}
在所有错误的区域中,这看起来过于复杂。如果您试图生成一个随机项,则应该考虑使用一个静态工厂方法来返回一个新的“随机”。项目。从你的代码中很难说出事情发生的原因和原因。对于一个项目需要什么以及如何实现它的随机性,没有真正的解释。到处都有神奇的数字,我无法解读(120,3,4)。项目“重叠”的情况又如何是否与生成所述项目的随机数据有关?感谢@mwc的评论。我已对问题进行了编辑,以包含大部分省略的细节。我希望生成的项目不会相互碰撞。这肯定会发生,因为生成项目的容器的宽度受到限制。