掷骰子游戏

时间:2014-05-05 14:31:05

标签: c# arrays dice

它掷骰子应用程序。我想总结一下骰子的结果并将它们呈现给用户。目前,点击按钮后,骰子图像将发生变化"点击滚动骰子"。

但是,当我掷骰子1时,结果将不会添加(+0)而当我掷骰子2时,结果将只有(+1)。我不知道我的代码有什么问题:

public partial class PigForm : Form
{
    Image[] diceImages;
    int[] dice;
    Random roll;

    private void rollDieBotton_Click(object sender, EventArgs e)
    {
        RollDice();
    }

    private void RollDice()
    {
        for (int i = 0; i < dice.Length; i++)
        {
            var currentRoll = roll.Next(0, 6);
            dice[i] += currentRoll;
            dicePictureBox.Image = diceImages[currentRoll];
            playersTotal.Text = String.Format("{0}", dice[i]);
        }
    }

    private void PigForm_Load(object sender, EventArgs e)
    {
        diceImages = new Image[6];
        diceImages[0] = Properties.Resources.Alea_1;
        diceImages[1] = Properties.Resources.Alea_2;
        diceImages[2] = Properties.Resources.Alea_3;
        diceImages[3] = Properties.Resources.Alea_4;
        diceImages[4] = Properties.Resources.Alea_5;
        diceImages[5] = Properties.Resources.Alea_6;

        dice = new int[1] { 0 };
        roll = new Random();
    }
}

7 个答案:

答案 0 :(得分:4)

var currentRoll = roll.Next(0, 6)

这将生成0到5之间的随机数,包括0和5。您可能希望生成1到6:

var currentRoll = roll.Next(1, 7)

参考:Random.Next Method (Int32, Int32)

修改

dicePictureBox.Image = diceImages[currentRoll - 1]

答案 1 :(得分:4)

对您的代码进行一些评论:

  • 为什么要使用数组,如果它总是包含一个整数?这也使得for循环毫无用处。使用普通整数并删除循环。
  • Next()类的Random方法有两个参数。第一个是包容性下限,第二个是独占上限。在你的情况下意味着0将是一个可能的数字,而6将永远不会发生。 (MSDN页面:Random.Next Method (Int32, Int32)

以下是对代码的轻微修改:

public partial class PigForm : Form
{
    Image[] diceImages;
    int dice;
    Random roll;

    private void rollDieBotton_Click(object sender, EventArgs e)
    {
        RollDice();
    }

    private void RollDice()
    {
        var currentRoll = roll.Next(1, 7);
        dice += currentRoll;
        dicePictureBox.Image = diceImages[currentRoll-1];
        playersTotal.Text = String.Format("{0}", dice);
    }

    private void PigForm_Load(object sender, EventArgs e)
    {
        diceImages = new Image[6];
        diceImages[0] = Properties.Resources.Alea_1;
        diceImages[1] = Properties.Resources.Alea_2;
        diceImages[2] = Properties.Resources.Alea_3;
        diceImages[3] = Properties.Resources.Alea_4;
        diceImages[4] = Properties.Resources.Alea_5;
        diceImages[5] = Properties.Resources.Alea_6;

        dice = 0;
        roll = new Random();
    }
}

答案 2 :(得分:3)

您允许currentRoll变量为[0, 6]之间的任何内容。其中包括0但不包括6。您应该更改为var currentRoll = roll.Next(1, 7);

编辑注释:然后,为了访问您的数组值(零索引),您应该从滚动结果中减去一个。

答案 3 :(得分:3)

  • 首先,为你的骰子设置一个整数数组是没有意义的,因为你只需要一个数字,这也意味着你不需要循环,因为它永远不会再次迭代。
  • 其次你的随机从0到5 包括,你希望它从1到6。

您的代码包含一些修改:

var currentRoll = roll.Next(1, 7); 
dice = currentRoll; // there should not be += operator because the result of the next roll will be absurd
dicePictureBox.Image = diceImages[currentRoll - 1]; // -1 because your array is zero-based which means that it starts from 0

这就是随机类真正起作用的方式。包含在你的情况下为1的初始值,但结尾的值不是,所以你需要的是1,7因为它将返回1到6之间的数字。

答案 4 :(得分:1)

正如其他人所指出的那样,Random.Next(a, b)会在包含和不包含b之间生成一个随机数。

虽然很容易做到

var currentRoll = roll.Next(1, 7);

会破坏你后面有两行的数组访问行。

相反,您最好的选择是修改添加行,

dice[i] += currentRoll + 1;

答案 5 :(得分:0)

查看Random.Next(int,int)方法的文档:

http://msdn.microsoft.com/en-us/library/2dx6wyd4%28v=vs.110%29.aspx

在那里你会发现下限是包含的,上限是独占的。 因此,Next(0,6)表示您得到0,1,2,3,4或5。

答案 6 :(得分:0)

我并不完全明白你的问题是什么,但我确实发现了一些看起来不对的东西。

尝试更改:

dice[i] += currentRoll;

使用:

dice[i] += currentRoll+1;