我正在做一个宾果游戏,想要检查一个号码是否已经被调用,所以如果它有一个新的号码,那么就没有被调用。 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();
}
答案 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
个字母以及范围值。