как перестать получать одно и то же число при генерации 2 чисел из другого класса - PullRequest
1 голос
/ 01 сентября 2011

Когда я запускаю этот код, я получаю 2 числа (что хорошо), но сгенерированные числа одинаковы (что плохо), и я не хочу, чтобы числа были одинаковыми.Я сделал это в качестве эксперимента для RPG, который я собирался сделать, поэтому я подумал, что было бы лучше, если бы у каждого оружия был свой класс.

Основной класс:

package battlesimMK2;
public class Main {

    public static void main(String Arg[]) {
        String WeponEquiped = "BasicAxe";
        System.out.print(BasicAxe.Str);
        System.out.print(BasicAxe.Str);
    }
}

Базовый класс топоров:

package battlesimMK2;
import java.util.Random;

public class BasicAxe {
    static Random rnd = new Random();
    static int Str = rnd.nextInt(4)+5;
}

Ответы [ 4 ]

8 голосов
/ 01 сентября 2011

Эта строка:

static int Str = rnd.nextInt(4)+5;

объявляет статическую переменную и инициализирует ее один раз . Если вы хотите, чтобы код запускал каждый доступ к вам Str, вы должны сделать его методом:

public static int getStrength() {
    return rnd.nextInt(4)+5;
}

Затем позвоните с этим кодом в Main.main:

System.out.print(BasicAxe.getStrength());
System.out.print(BasicAxe.getStrength());

Альтернатива, которая, вероятно, была бы более объектно-ориентированной, состояла бы в том, чтобы сделать напряженность полем экземпляр , чтобы каждый созданный топор имел возможно различную (но постоянную) силу:

public class BasicAxe {
    private static final Random rnd = new Random();

    private final int strength;

    public BasicAxe() {
        strength = rnd.nextInt(4)+5;
    }

    public int getStrength() {
        return strength;
    }
}

Затем в Main.main:

BasicAxe axe1 = new BasicAxe();
BasicAxe axe2 = new BasicAxe();
System.out.println(axe1.getStrength());
System.out.println(axe2.getStrength());
System.out.println(axe1.getStrength());

Здесь первая и третья строки вывода будут одинаковыми, но вторая (вероятно) будет отличаться.

2 голосов
/ 01 сентября 2011

Вы генерируете одно случайное число и печатаете его дважды.Попробуйте что-то вроде этого:

package battlesimMK2;
public class Main {

    public static void main(String Arg[]) {
        String WeponEquiped = "BasicAxe";
        System.out.print(BasicAxe.Str());
        System.out.print(BasicAxe.Str());
    }
}

package battlesimMK2;
import java.util.Random;

public class BasicAxe {
    static Random rnd = new Random();
    static int Str() { return rnd.nextInt(4)+5; }
}
2 голосов
/ 01 сентября 2011

Это потому что эта строка

static int Str = rnd.nextInt(4)+5;

запускается всего один раз за весь жизненный цикл вашего приложения. Это статическое значение, вы должны использовать статический метод.

1 голос
/ 01 сентября 2011

Поскольку вы определяете переменную Str как статическую, только одна копия этой переменной совместно используется всеми вашими классами BasicAxe.

Способ получить новый ответ каждый раз, когда вы запрашиваете значение int, состоит в следующем:использовать пример, опубликованный предыдущим постером,

String WeponEquiped = "BasicAxe";
System.out.print(BasicAxe.getStrength());
System.out.print(BasicAxe.getStrength());

Но, если вы хотите создать фактический экземпляр класса BasicAxe, который сохраняет его значение, чтобы каждый раз, когда вы запрашиваете силу, вы получаететого же значения, вам нужно что-то другое.

...