掷骰子游戏
本文关键字:游戏 掷骰子 | 更新日期: 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;