1
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 を返す理由がわかりません。誰でも助けることができますか?

4

1 に答える 1

5

ロールオーバーとオーバーの両方で 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 インスタンスは、同時に実装された複数のサイコロが同じシードを取得するのを防ぎ (それらはすべて 1 つのランダムを共有するため)、結果の一貫性を保つのに役立ちます。これも標準の C# 規則に移行し、次のように使用されます。

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

compDice = new Dice();
int compDiceNo = compDice.FaceOfDie;
MessageBox.Show("Computers roll:" + compDiceNo);
于 2013-05-02T15:55:09.193 に答える