Кости возвращают 0 и нет бросков

playerDice = new Dice();
int playerDiceNo = playerDice.getfaceofDie();
MessageBox.Show("Your roll" + playerDiceNo);

compDice = new Dice();
int compDiceNo = compDice.getfaceofDie();
MessageBox.Show("Computers roll:" + compDiceNo);

выше мой метод, когда нажимается кнопка прокрутки. Ниже мой класс игральных костей:

class Dice
{
    private int faceofDie;
    public void rollDice()
    {
        Random rollDice = new Random();
        faceofDie = rollDice.Next(1, 7);          
    }
    public int getfaceofDie()
    {
        return faceofDie;
    }
}

Я указал свои переменные для compDice и playerDice как:

Dice compDice;
Dice playerDice;

Я не могу понять, почему он возвращает 0 для обоих бросков снова и снова. кто-нибудь может помочь?


person user2326995    schedule 02.05.2013    source источник
comment
потому что ты не бросаешь кости   -  person musefan    schedule 02.05.2013
comment
Может потому, что ты никогда не бросаешь кости?   -  person Howard    schedule 02.05.2013
comment
Я добавил playerDice.RollDice(); и все равно показывает 0   -  person user2326995    schedule 02.05.2013
comment
возможный дубликат Генератор случайных чисел, генерирующий только одно случайное число   -  person Alexei Levenkov    schedule 02.05.2013
comment
В вашем образце кода показано неправильное использование Random - см. Дублированный вопрос - если вы все еще видите проблему, обновите свой образец и предоставьте более подробную информацию.   -  person Alexei Levenkov    schedule 02.05.2013


Ответы (1)


Я не могу понять, почему он возвращает 0 для обоих бросков снова и снова. кто-нибудь может помочь?

Вы никогда не вызываете rollDice(), поэтому переменная faceofDie никогда не устанавливается и имеет значение по умолчанию 0.

playerDice = new Dice();
playerDice.rollDice(); // Add this
int playerDiceNo = playerDice.getfaceofDie();
MessageBox.Show("Your roll" + playerDiceNo);

Лучшим подходом было бы бросить кости в первый раз в конструкторе и не создавать новые экземпляры Random:

class Dice
{
    private static Random diceRoller = new Random();

    private int faceofDie;

    public Dice()
    {
        this.RollDice(); // Roll once on construction
    }

    public void RollDice()
    {   
        lock(diceRoller) 
            faceofDie = diceRoller.Next(1, 7);          
    }

    public int FaceOfDie
    {
        get { return faceofDie; }
    }
}

Статический экземпляр Random предотвратит получение одним и тем же начальным числом нескольких кубиков, реализованных одновременно (поскольку все они будут использовать одно случайное число), что поможет сохранить ваши результаты более последовательными. Это также переходит к стандартным соглашениям С# и будет использоваться следующим образом:

playerDice = new Dice();
int playerDiceNo = playerDice.FaceOfDie;
MessageBox.Show("Your roll" + playerDiceNo);

compDice = new Dice();
int compDiceNo = compDice.FaceOfDie;
MessageBox.Show("Computers roll:" + compDiceNo);
person Reed Copsey    schedule 02.05.2013
comment
@user2326995 user2326995 Мой код, как написано выше, вернет 2 разных числа от 1 до 6 (включительно) - только что проверил для проверки. - person Reed Copsey; 02.05.2013
comment
Извините, моя ошибка, мой компьютер не показывал вторую часть кода. Большое спасибо за вашу помощь, это работает отлично. - person user2326995; 02.05.2013