随机类和骰子模拟器中的if语句?

时间:2019-05-18 12:17:04

标签: c# random logic dice

我是C#的初学者,我有一个家庭作业,必须写骰子模拟器。

用户最多可以选择5个骰子,然后在掷出每个骰子时将总和与之前掷出的骰子相加。最后显示卷数和总数。

但是,如果用户掷出6,则该结果不会添加到总和中,但骰子再掷出两次,然后将总和相加。

我有几点要坚持和/或想知道一种更好的编写方式。我在下面添加了一个代码段。

  1. 下面,每次掷骰子时我都会声明我的Random类,但是我可以只执行一次然后在整个代码中使用吗?

  2. 是否有一种简单的方法来编写零件,如果您掷6,会发生什么?我的意思是我想我可以在每次骰子滚动时写另一个if语句,但是看起来这会很长吗?

if (intnumberofdie == 1)

            {
                Random rnd1 = new Random();
                int dice1 = rnd1.Next(1, 7);

                Console.WriteLine("You have rolled " + dice1);


            else if (intnumberofdie == 2)

            {
                Random rnd1 = new Random();
                int dice1 = rnd1.Next(1, 7);

                Console.WriteLine("The first die rolled " + dice1);

                Console.ReadKey();

                Random rnd2 = new Random();
                int dice2 = rnd2.Next(1, 7);

                Console.WriteLine("The second die has rolled " + (dice2));

                Console.ReadKey();

                Console.WriteLine("The total sum so far is " + (dice1 + dice2));

}

2 个答案:

答案 0 :(得分:1)

一次尝试:

var rnd1 = new Random();
var rollsRemaining = 6;
var sum = 0;
while (rollsRemaining > 0)
{
    int dice1 = rnd1.Next(1, 7);
    Console.WriteLine("You have rolled " + dice1);
    if (dice1 == 6)
    {
        rollsRemaining += 2;    
    }
    else
    {
        sum += dice1;
        rollsRemaining -= 1;
    }
}
Console.WriteLine("The sum is " + sum);

答案 1 :(得分:0)

由于您是初学者,所以我将首先解释一些事情。 如果您有很多次必须做相同的事情,则永远不要自己处理每种情况。这意味着您不应该使用if else if else ..而是使用诸如for或while之类的循环。

我写了一个简短的函数,可以执行您想要的操作。

private int GetNumber(int amountDie) {
    if (amountDie <= 0 || amountDie > 5) return 0;

    int total = 0;

    for (int i = 0; i < amountDie; i++)
    {
        int roll = rnd.Next(1, 7);

        if (roll == 6)
        {
            int specialRoll1 = rnd.Next(1, 7);
            int specialRoll2 = rnd.Next(1, 7);

            total += specialRoll1;
            total += specialRoll2;
        }
        else {
            total += roll;
        }
    }

    return total;
}

现在更多解释: 由于您说的死亡数不能超过5,因此我们将首先检查给定的值是否有效,否则我们将仅返回0(在这种情况下,有更好的方法要做,但是为了简单起见,我们只说他们回来了0)。
之后,我们声明总计以跟踪必须返回的点数。
然后我们开始循环。对于每个骰子,我们滚动一次(for-construct中的第一行)。 由于我们需要检查用户是否掷出了6,所以我们在那里。在其中,我们滚动两个骰子,并将两个结果相加。请注意,对于这两个纸卷6,它就像其他任何数字一样,没有不同的处理方式(如果您需要的话,会更加复杂)。
如果用户未掷出6,则只需将他们掷出的所有东西加到总数中。

完成所有任务后,我们只返回得到的总数。

您将看到,如果仅复制粘贴此代码,它将无法编译。这样做的原因是您缺少随机对象。在您的代码中,每次滚动时总是创建一个新代码。这是一个问题,因为Random类并不是您想像的那么随机,您应该始终为多个随机数创建一个。
这就是为什么我在班级顶部添加此内容的原因:
private static readonly Random rnd = new Random();

此随机对象仅创建一次,然后用于每个骰子。这为您提供了更多的随机性,并防止了每个用户始终滚动相同的值。

我希望这向您展示了如何创建这样的方法。当然,您可以像在代码中一样添加控制台输出等。