我的验证检查数字是否在数组中然后更改它以使它不同有什么问题?

时间:2015-04-27 18:46:21

标签: c# arrays validation error-handling boolean

我正在做一个宾果游戏,想要检查一个号码是否已经被调用,所以如果它有一个新的号码,那么就没有被调用。  bool []数字;  随机r;

    private void button1_Click(object sender, EventArgs e)
    {
        this.Numbers = new bool[90];
        this.r = new Random();
        int attempt = this.r.Next(0, 90);

        while (this.Numbers[attempt] == true)
        {
            attempt = this.r.Next(0, 90);
            this.Numbers[attempt] = true;
        }

        textBox1.Text += (attempt + 1).ToString() + " ";
        textcurrent.Text += textBox1.Text;
        textBox1.Clear();

    }

3 个答案:

答案 0 :(得分:1)

这是一个无限循环:

    while (this.Numbers[attempt] == true)
    {
        attempt = this.r.Next(0, 90);
        this.Numbers[attempt] = true;
    }

在检查this.Numbers[attempt]循环的继续是否为真之前,您已将true设置为while

答案 1 :(得分:0)

该片段将导致无限循环:

 while (this.Numbers[attempt] == true)
 {
      attempt = this.r.Next(0, 90);
      this.Numbers[attempt] = true;
 }

请注意,您将this.Numbers[attempt]设置为true,然后检查它是否为true,因此循环将永远不会结束。

我会采取另一种方法:

var notUsed = this.Numbers.Where(used => !used)
                 .Select((val, idx) =>
                      new 
                      {
                          Idx = idx,
                          Val = val
                      }).ToList();

if (!notUsed.Any())
{
    //case when all numbers used
}
else
{
    attempt = notUsed[this.r.Next(0, notUsed.Count)].Idx;
    this.Numbers[attempt] = true;
}

编辑: 评论中的OP表示分配是在循环外完成的:

 while (this.Numbers[attempt] == true)
 {
      attempt = this.r.Next(0, 90);
 }

 this.Numbers[attempt] = true;

那么,在该方法中,当数组中的所有值都设置为true时,也可以发生infite循环。更重要的是,您可以为设置为true的元素生成attempt(当有许多元素设置为true时,获取false元素的理论机会很小)。

答案 2 :(得分:0)

我会采取不同的方法。创建宾果号码列表然后随机播放。然后,只需从顶部开始阅读每个数字:

void Main()
{
    //Create a list of BINGO numbers and the shuffle it randomly.
    string letters = "BINGO";
    var bingoNumbers = Enumerable.Range(1, 75)
                                 .Select(n => string.Format("{0}{1}", letters[(int)Math.Ceiling(n / 15.0) - 1], n))
                                 .OrderBy(o => Guid.NewGuid())
                                 .ToList();

    foreach (var number in bingoNumbers)
    {
        Console.WriteLine(number);        
    }                            
}

Math.Ceiling(...)位只是使用Linq创建宾果数组数组的技巧。如果您不想使用Linq,也可以使用两个嵌套的for循环。

通过使用OrderBy(o => Guid.NewGuid()),它会随机播放列表。这可能不是最好的改组方法。其他人,比如Fisher-Yates可能会更好。如果你想使用不同的shuffling方法,你可以省略OrderBy行并使用你想要的任何算法进行随机播放。

顺便说一句,我注意到你使用90来计算宾果游戏数量,但在传统游戏中只有75.如果你,不使用传统的BINGO数字,那么你可以在代码中替换BINGO个字母以及范围值。