【问题标题】:Dice Loop, With roll again if 6骰子循环,如果 6 则再次掷骰
【发布时间】:2012-11-27 11:03:31
【问题描述】:

C# 新手,很抱歉,如果这很愚蠢。

到目前为止,关于我的骰子,我有以下代码:

Random DiceRandom = new Random();
int DiceThrow = DiceRandom.Next(1, 7);
Console.WriteLine(DiceThrow);
Console.ReadLine();

Console.WriteLine("Player 1 rolled a " + DiceThrow);
Console.ReadLine();

Console.WriteLine("Player 2 rolled a " + DiceThrow);
Console.ReadLine();

Console.WriteLine("Player 3 rolled a " + DiceThrow);
Console.ReadLine();

Console.WriteLine("Player 4 rolled a " + DiceThrow);
Console.ReadLine();

现在,这会创建一个很好的数字并显示它,但是每个玩家的数字都是相同的。

我需要一个循环,为每个玩家重复掷骰,如果有玩家掷出 6,我将再次掷骰。

【问题讨论】:

  • 来一个!当然你可以计算出你需要调用 DiceThrow = DiceRandom.Next(1, 7);每次...如果您设置一次变量(以任何语言),您希望它具有什么值?
  • @MitchWheat 这对于刚接触这个的人来说并不一定很明显。如果您不是很熟悉 C# 和一般编程,int DiceThrow = DiceRandom.Next(1, 7); 行可以看作是函数的内联定义。
  • @Jeff:初学者比函数委托更可能假设简单的变量赋值。对吗?
  • @MitchWheat 可能更有可能,但是比编码更习惯数学的人可以合理地将声明视为陈述等价而不是赋值。跨度>
  • 我只能为自己说话:我拥有纯数学学位。我记得学习编程。首先想到的肯定是变量赋值。

标签: c# loops dice


【解决方案1】:

正如其他人指出的那样,问题在于随机数DiceThrow 每次使用时都不会刷新。您可以在不使用循环的情况下解决此问题,但不要。您确实需要一个循环,并且可能看起来像这样:

for(int i = 1; i <= 4; i++) {
    DiceThrow = DiceRandom.Next(1,7);
    Console.WriteLine("Player " + i + " rolled a " + DiceThrow);
    Console.ReadLine();
    if(DiceThrow == 6) i--;
}

最后一行有点晦涩,但可以提供“在 6 上重新滚动”的要求。由于循环每次都会增加i,因此减少它会有效地使循环再次为同一个玩家循环。

编辑:实际上,使用 while 循环的更明确的版本如下:

int i = 1;
while(i <= 4) {
    DiceThrow = DiceRandom.Next(1,7);
    Console.WriteLine("Player " + i + " rolled a " + DiceThrow);
    Console.ReadLine();
    if(DiceThrow != 6) i++;
}

【讨论】:

  • 修改循环变量通常不是一个好习惯。再说一次,我的答案有一个无限循环 =)
  • @paddy 是的,我倾向于同意你的观点,但另一种选择是嵌套的 for 循环(也不受欢迎,但我承认可能更少)或者非常复杂的 while 循环while(player &lt;= 4 &amp;&amp; DiceThrow != 6) 之类的表达式,然后在每次迭代时只更新其中一个变量,这对我来说听起来很可怕。
  • 我选择使用此代码 Jeff,非常感谢您完美运行。现在,因为这是我正在制作的游戏,玩家在每轮结束时保持他们的分数相加(我会说一轮是一个滚动,每个滚动不包括 6)我将如何在最后显示累积分数每一轮,然后是另一轮?
  • @user1890490 很高兴您发现它很有用(尽管我强烈建议您阅读我的答案的编辑和帕迪的答案,以及那里的 cmets)。我建议另一个关于分数的问题——关于 Stack Overflow 的问题通常应该保持单一主题。另外 - 请接受您认为最有用的答案:)
【解决方案2】:

怎么样:

for( int player = 1; player <= 4; player++ )
{
    while(1) {
        int DiceThrow = DiceRandom.Next(1, 7);
        Console.WriteLine( "Player " + player + " rolled a " + DiceThrow );
        if( DiceThrow < 6 ) break;
    }
    Console.ReadLine();
}

【讨论】:

  • 如果玩家掷出 6,OP 会要求多次掷出。内部循环是实现它的一种方法。
  • 是的,一个更好的版本是int DiceThrow; while((DiceThrow = DiceRandom.Next(1,7)) != 6){,但即使这样也很笨拙......
  • @Jeff 以这种方式使用 while 循环也不会进入循环以显示滚动。那会很笨拙。我知道人们总是会在 while(1) 循环方面处于两个阵营,但我经常在专业意义上遇到他们。在 C++ 中,我会使用 do { } while() 构造,但我不确定 C# 是否有这个。
【解决方案3】:

不是 100% 确定 readlines 等。但本质上,您每次打印时都引用相同的掷骰子。您需要做的是每次生成一个新的掷骰(通过 DiceRandom.Next(1,7))。

Random DiceRandom = new Random();

for (int i = 1; i <= 4; i++) {
    var roll = DiceRandom.Next(1,7);
    Console.WriteLine("Player 1 rolled a " + roll);
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2021-10-07
    • 2021-04-06
    • 2012-02-29
    相关资源
    最近更新 更多