我正在为我的课程项目创建游戏,但我很难弄清楚如何将randomNumber值传递给button1_Click方法。我已经尝试了很多方式在这里发现但没有一个有效。当我单击按钮时,我希望它自动从dollarAmount数组中选择一个值。我只需要能够从button1_Click中引用我的randomNumber然后我确定它会起作用。
namespace __Deal_Or_No_Deal__
{
public partial class Form1 : Form
{
string[] dollarAmount = new string[26] { "0.01", "1", "5", "10", "25",
"50", "75", "100", "200", "300", "400", "500", "750", "1,000",
"5,000", "10,000", "25,000", "50,000", "75,000", "100,000", "200,000",
"300,000", "400,000", "500,000", "750,000", "1,000,000" };
int[] priceIndexInBox = new int[26] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 };
string outputText = "";
public Form1()
{
InitializeComponent();
}
//private int randomNumber = 0;
private void Form1_Load(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show(
"Are you ready to play Deal or No Deal?",
"Deal or No Deal",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (result == DialogResult.No)
{
this.Close();
}
//Generate the price in each box
//when the game starts
int numberOfValueSet = 0;
Random rnd = new Random();
//while (numberOfValueSet < 26)
{
//Generate a random number:
int randomNumber = rnd.Next(0, 26);
//if (Array.IndexOf(priceIndexInBox, randomNumber) == -1)
//{
// //The random number is not is the priceIndex array
// //Insert the random number to the array
// priceIndexInBox[numberOfValueSet] = randomNumber;
// numberOfValueSet++;
//}
}
}
private void generateRandom()
{
}
private void button1_Click(object sender, EventArgs e)
{
PictureBox[] boxes =
{
picOneCent, picOneDollar, picFiveDollar, picTenDollar,
picTwentyFiveDollar, picFiftyDollar, picSeventyFiveDollar,
picOneHundredDollar, picTwoHundredDollar, picThreeHundredDollar,
picFourHundredDollar, picFiveHundredDollar, picSevenHundredFiftyDollar,
picOneThousandDollar, picFiveThousandDollar, picTenThousandDollar,
picTwentyFiveThousandDollar, picFiftyThousandDollar,
picSeventyFiveThousandDollar, picOneHundredThousandDollar,
picTwoHundredThousandDollar, picThreeHundredThousandDollar,
picFourHundredThousandDollar, picFiveHundredThousandDollar,
picSevenHundredFiftyThousandDollar, picOneMillionDollar
};
int numberOfValueSet = 0;
priceIndexInBox[numberOfValueSet] = randomNumber;
string outputText = dollarAmount[randomNumber];
blackBox.Text = "You have just picked case #" + (sender as Button).Text +
" with $" + outputText + " random: " + randomNumber;
boxes[randomNumber].Visible = false;
Button buttonSelected = sender as Button;
buttonSelected.Enabled = false;
}
}
}
我真的很感激帮助解决这个问题。谢谢:))
答案 0 :(得分:1)
您在评论中提到的基本问题是您希望随机化存储桶的顺序。
如果存储桶是随机顺序,那么你可以按照通常的顺序(0到26)迭代它们,然后它们就会被洗牌。
你在这里所做的事情被称为&#34; XY问题&#34;在StackOverflow上。您已经知道如何解决问题,您询问该想法,并且没有任何答案实际上解决了您的真正的问题。让我们来解决真正的问题。
要随机化一个小数组,请执行以下操作:
static Random random = new Random();
string[] dollarAmount = (new[] { whatever })
.OrderBy(x => random.NextDouble())
.ToArray();
我注意到,如果您首先提出这个问题,您几乎肯定会得到错误的建议,因为此问题在本网站上经常 并吸引低质量的答案。
特别是:
答案 1 :(得分:0)
如果我理解正确,每次按下按钮都需要一个新的随机数。如果这是正确的,将随机生成器定义为类范围的变量,然后在每个按钮按下时调用“next”。
[编辑]未经测试和不完整,甚至可能不是最好的方式 - 但这将使你开始没有重复。 (如评论所述,您仍然需要处理点击#27。)
public partial class Form1 : Form
{
Random rnd = new Random();
var possibles = new int[]{0,1,2,3,4,5.....,26}
// The rest of your code here
private void button1_Click(object sender, EventArgs e)
{
int randomNumber = -1;
while (randomNumber == -1)
{
randomNumber = possibles[rnd.Next(0, 25)];
if randomNumber > 0
{
possibles[randomNumber] = -1;
}
}
// Do something with the random number
答案 2 :(得分:0)
两行给你带来麻烦:
首先,
int randomNumber = rnd.Next(0, 26);
你有26个盒子,但你实际上在看27个数字。你应该只从0到25岁,而不是26岁。见:https://msdn.microsoft.com/en-us/library/2dx6wyd4(v=vs.110).aspx
其次,
if (Array.IndexOf(priceIndexInBox, randomNumber) == -1)
Array.IndexOf返回数组中找到值的索引。因此,您需要检查您的数组是否具有介于0-26之间的值。折扣我上面提到的第一个错误(应该是0-25),这个条件永远不会成立,因为你总是将0-25作为你的数组的成员,他们只能改变他们的方式是这不可能有条件。请参阅:https://msdn.microsoft.com/en-us/library/7eddebat(v=vs.110).aspx
相反,您要检查并查看其中是否包含美元金额数组中的美元值,例如:
if(Array.IndexOf(priceIndexInBox,dollarAmmount[randomNumber]) == -1)
这将确保不重复美元价值。进行这些更改,看看您的程序是否为您提供了预期的行为。
编辑:现在仔细查看您的代码,您的按钮事件中会出现一些语法和逻辑错误。请记住,赋值运算符(=)会将右侧上的内容分配给左侧上的内容。这不是一个数学等于;这种操作只有一种方式。此外,您始终访问priceIndexInBox的第一个索引,因为您在将numberOfValueSet用作索引之前将其设置为0。然后将第一个框中的值(始终是第一个框)设置为randomNumber,这将是Form_Load末尾生成的随机数。换句话说,无论最初生成的随机数是什么,都会被覆盖。答案 3 :(得分:0)
似乎你的一个问题是范围。看,你的随机数没有生活&#39;在Form1_Load方法之外。你想要做的是让它可以通过你的类的其他方法访问,因此,一种解决方案是让你的类成为随机数的直接所有者,然后重新使用该实例来更新它的值。像这样:
public partial class Form1 : Form
{
private int _randomNumber = 0;
...
private void Form1_Load(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("Are you ready to play Deal or No Deal?",
"Deal or No Deal",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (result == DialogResult.No)
{
this.Close();
}
//Generate the price in each box when the game starts
int numberOfValueSet = 0;
Random rnd = new Random();
//while (numberOfValueSet < 26)
{
//Generate a random number:
_randomNumber = rnd.Next(0, 26);
//if (Array.IndexOf(priceIndexInBox, randomNumber) == -1)
//{
// //The random number is not is the priceIndex array
// //Insert the random number to the array
// priceIndexInBox[numberOfValueSet] = randomNumber;
// numberOfValueSet++;
//}
}
}
请参阅Form1_Load中的不写int randomNumber,只需编写
重新使用它的类实例_randomNumber = rnd.Next(0, 26);
另外,如果您担心随机数生成的正确性,请阅读一些评论