Java:多次设置int的值

Java:多次设置int的值,java,math,integer,int,Java,Math,Integer,Int,我使用这种方法在屏幕外随机设置一个位置,以便在屏幕上繁殖所有僵尸 public void initZombie(){ for(int i = 0; i < 100; i++){ int randomXSpawn = (int) Math.random() * -300 + -50; int randomYSpawn = (int) Math.random() * -100 + 800;

我使用这种方法在屏幕外随机设置一个位置,以便在屏幕上繁殖所有僵尸

public void initZombie(){ 
            for(int i = 0; i < 100; i++){
                int randomXSpawn = (int) Math.random() * -300 + -50;
                int randomYSpawn = (int) Math.random() * -100 + 800;
                int[][] spawn = {{randomXSpawn,randomYSpawn}};
                for(int j = 0; j < spawn.length; j++){
                    zombie.add(new Zombie(spawn[j][0],spawn[j][1]));
                }
            }
        }
public void initZombie(){
对于(int i=0;i<100;i++){
int randomXSpawn=(int)Math.random()*-300+-50;
int randomYSpawn=(int)Math.random()*-100+800;
int[][]spawn={{randomXSpawn,randomYSpawn};
对于(int j=0;j

我遇到的问题是,获取随机位置的两个int只运行一次,因此每个僵尸都在彼此内部的完全相同的位置繁殖。我如何才能让ints运行多次,以便僵尸在不同的位置产卵?我尝试将它们放在run()方法中,然后它们运行两次,以便第一个僵尸在一个位置产卵,然后99个其他僵尸在彼此内部的另一个位置产卵。

如果我是你,我会使用对象,并调用
nextInt
函数

Random rnd = new Random();

for(...)
{
    int randInt = rnd.nextInt(300) //300 is the maximum
}

如果我是你,我会使用对象,然后调用
nextInt
函数

Random rnd = new Random();

for(...)
{
    int randInt = rnd.nextInt(300) //300 is the maximum
}

您正在将
Math.random()
强制转换为一个整数,该整数将使值最小化。由于
Math.random()
生成一个双精度值,即
0,因此您正在将
Math.random()
强制转换为一个整数,该整数将值降到最低。由于
Math.random()
生成了一个双精度数组,即
0,因此您不需要为
spawn
数组编制索引。事实上我觉得你根本不需要。试试这个

public void initZombie(int maxZombies){
        Random r=new Random();
        for(int i = 0; i < maxZombies; i++){
                zombie.add(new Zombie(r.nextInt(MAX_X), r.nextInt(MAX_Y));
        }
    }
public void initZombie(int-maxZombies){
随机r=新随机();
for(int i=0;i
如果以后需要调用僵尸的繁殖位置,可以在僵尸实例中将其保存为私有int


另外,原始代码会给你负坐标,因为你用一个负常数相乘。即使它起作用,你最终也会得到比你想要的更多的僵尸,因为
newzombie()
代码在一个内部循环中运行。

您不需要为
生成数组编制索引。实际上,我认为您甚至不需要一个。试试这个

public void initZombie(int maxZombies){
        Random r=new Random();
        for(int i = 0; i < maxZombies; i++){
                zombie.add(new Zombie(r.nextInt(MAX_X), r.nextInt(MAX_Y));
        }
    }
public void initZombie(int-maxZombies){
随机r=新随机();
for(int i=0;i
如果以后需要调用僵尸的繁殖位置,可以在僵尸实例中将其保存为私有int


另外,原始代码会给你负坐标,因为你用一个负常数相乘。即使它起作用,你最终也会得到比你想要的更多的僵尸,因为
newzombie()
代码在一个内部循环中运行。

有几件事会导致代码出现问题。正如Supericy所说,您意外地过早地抛出了所有随机数,截断了它们的值,正如SJuan76在一篇评论中提到的,您的for循环设置得不太正确。(它可以工作,但可以更干净。)


首先,施法问题:当您将双精度转换为整数时,小数部分向下舍入

int num = (int) 0.999; //num == 0
Math.random()
总是返回一个介于0和1之间的double,因此当转换为int时,它也总是被截断为零

那就是你的台词

int randomXSpawn = (int) Math.random() * -300 + -50;
评估如下:

int randomXSpawn = (int) Math.random() * -300 + -50;
int randomXSpawn = (int) 0.xxxx * -300 + -50;
int randomXSpawn = 0 * -300 + -50;
int randomXSpawn = -50;
要解决这个问题,只需添加括号,强制在施法之前进行乘法和加法,如Supericy所说:

int randomXSpawn = (int) (Math.random() * -300 + -50);
int randomYSpawn = (int) (Math.random() * -100 + 800);

其次,for循环:这是您现在拥有的。它工作正常,但可以写得更清楚

for(int i = 0; i < 100; i++) {
    int randomXSpawn = (int) Math.random() * -300 + -50;
    int randomYSpawn = (int) Math.random() * -100 + 800;
    int[][] spawn = {{randomXSpawn,randomYSpawn}};
    for(int j = 0; j < spawn.length; j++){
        zombie.add(new Zombie(spawn[j][0],spawn[j][1]));
    }
}
然后,您可以存储这些号码,以便以后可以访问:

    int[][] spawn = {{randomXSpawn,randomYSpawn}};
最后,进入最终for循环:

    for(int j = 0; j < spawn.length; j++){
        zombie.add(new Zombie(spawn[j][0],spawn[j][1]));
    }
这建议了一种使代码更清晰的方法:您可以删除
spawn
数组和内部for循环,以便直接使用
randomXSpawn
randomYSpawn
调用
Zombie
构造函数

这就是变化的样子:

for(int i = 0; i < 100; i++) {
    int randomXSpawn = (int) Math.random() * -300 + -50;
    int randomYSpawn = (int) Math.random() * -100 + 800;
    zombie.add(new Zombie(randomXSpawn,randomYSpawn));
}
for(int i=0;i<100;i++){
int randomXSpawn=(int)Math.random()*-300+-50;
int randomYSpawn=(int)Math.random()*-100+800;
添加(新僵尸(randomXSpawn,randomYSpawn));
}

将这两项更改放在一起,我们得到以下结果:

for(int i = 0; i < 100; i++) {
    int randomXSpawn = (int) (Math.random() * -300 + -50);
    int randomYSpawn = (int) (Math.random() * -100 + 800);
    zombie.add(new Zombie(randomXSpawn,randomYSpawn));
}
for(int i=0;i<100;i++){
int randomXSpawn=(int)(Math.random()*-300+-50);
int randomYSpawn=(int)(Math.random()*-100+800);
添加(新僵尸(randomXSpawn,randomYSpawn));
}

如果您不喜欢我建议的for循环的重新构造,您不必更改。我认为您现在使用for循环的方式是正确的。我认为这很难阅读,如果您不同意,这是允许的=)。使用括号控制强制转换的第一个变化是导致您在问题中提到的问题的原因,需要注意。

有几件事会导致代码出现问题。正如Supericy所说,您意外地过早地强制转换了所有随机数,截断了它们的值,以及SJuan76在一篇评论中提到,您的for循环设置不太正确。(它可以工作,但可以更干净。)


首先,施法问题:当您将双精度转换为整数时,小数部分向下舍入

int num = (int) 0.999; //num == 0
Math.random()
总是返回一个介于0和1之间的double,因此当转换为int时,它也总是被截断为零

那就是你的台词

int randomXSpawn = (int) Math.random() * -300 + -50;
评估如下:

int randomXSpawn = (int) Math.random() * -300 + -50;
int randomXSpawn = (int) 0.xxxx * -300 + -50;
int randomXSpawn = 0 * -300 + -50;
int randomXSpawn = -50;
要解决这个问题,只需添加括号,强制在施法之前进行乘法和加法,如Supericy所说:

int randomXSpawn = (int) (Math.random() * -300 + -50);
int randomYSpawn = (int) (Math.random() * -100 + 800);

第二,for循环:这就是y