掷骰子游戏

本文关键字:游戏 掷骰子 | 更新日期: 2023-09-27 18:01:40

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

然而,当我掷骰子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();
    }
}

掷骰子游戏

关于代码的几点说明:

    为什么使用数组,如果它总是包含一个整数?这也使得for循环毫无用处。使用普通整数并删除循环。
  • Random类的Next()方法有两个参数。第一个是包容下界,第二个是排他上界。这意味着在您的例子中,0将是一个可能的数字,而6将永远不会出现。(MSDN页面:随机。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();
    }
}
var currentRoll = roll.Next(0, 6)

这将生成一个从0到5(包括5)的随机数。您可能想要从1到6生成:

var currentRoll = roll.Next(1, 7)

参考:随机的。Next Method (Int32, Int32)

编辑:

dicePictureBox.Image = diceImages[currentRoll - 1]
  • 首先,为你的骰子设置一个整数数组是毫无意义的,因为你只需要一个数字,这也意味着你不需要循环,因为它永远不会迭代第二次。
  • 其次,你的随机值从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之间的数字。

您允许currentRoll变量是[0, 6]之间的任何东西。这包括0,但不包括6。你应该改成var currentRoll = roll.Next(1, 7);

编辑注释:然后访问你的数组值(这是零索引),你应该从你的滚动结果减去1。

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

虽然直接写

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

会中断数组访问行,你有两行后。

相反,您最好的选择是修改附加行,执行
dice[i] += currentRoll + 1;

看一下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

我不太明白你的问题是什么,但我确实发现了一些看起来不对的地方。

尝试改变:

dice[i] += currentRoll;

:

dice[i] += currentRoll+1;