从button1_Click方法引用randomNumber

时间:2017-05-26 23:03:31

标签: c#

我正在为我的课程项目创建游戏,但我很难弄清楚如何将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;
        }
    }
}

我真的很感激帮助解决这个问题。谢谢:))

4 个答案:

答案 0 :(得分:1)

您在评论中提到的基本问题是您希望随机化存储桶的顺序

如果存储桶是随机顺序,那么你可以按照通常的顺序(0到26)迭代它们,然后它们就会被洗牌。

你在这里所做的事情被称为&#34; XY问题&#34;在StackOverflow上。您已经知道如何解决问题,您询问该想法,并且没有任何答案实际上解决了您的真正的问题。让我们来解决真正的问题。

要随机化一个小数组,请执行以下操作:

    static Random random = new Random();
    string[] dollarAmount = (new[] { whatever })
      .OrderBy(x => random.NextDouble())
      .ToArray();

我注意到,如果您首先提出这个问题,您几乎肯定会得到错误的建议,因为此问题在本网站上经常 并吸引低质量的答案。

特别是:

  • 不要通过对guid进行排序来随机化。 Guids保证唯一,而不是未排序
  • 不要通过给出排序算法的随机比较器来随机化;比较器必须与总订单一致

答案 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);

另外,如果您担心随机数生成的正确性,请阅读一些评论