Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建一个骰子,如果它落在C中的一个特定数字上,它将加倍并继续滚动?_C#_Recursion_Dice_Rolling Computation - Fatal编程技术网

C# 创建一个骰子,如果它落在C中的一个特定数字上,它将加倍并继续滚动?

C# 创建一个骰子,如果它落在C中的一个特定数字上,它将加倍并继续滚动?,c#,recursion,dice,rolling-computation,C#,Recursion,Dice,Rolling Computation,我正在尝试制作一个我认为必须使用递归的程序。简而言之:创建一个掷骰子的程序。如果它落在6上,则会创建并掷两个骰子,依此类推,直到不再掷6为止 问题不是创建新的或真正的随机对象,而是递归骰子 递归方法如下所示: public static int Recursion(int a) { Random m = new Random(); if (a < 6) { return a; }

我正在尝试制作一个我认为必须使用递归的程序。简而言之:创建一个掷骰子的程序。如果它落在6上,则会创建并掷两个骰子,依此类推,直到不再掷6为止

问题不是创建新的或真正的随机对象,而是递归骰子

递归方法如下所示:

    public static int Recursion(int a)
    {
        Random m = new Random();

        if (a < 6)
        {
            return a;
        }

        else
        {
            a = m.Next(1, 7);
            return Recursion(a) * 2;
        }
    }

可能是这样的吗

public static int Roll() {
   return Roll(new Random(), 1);
}

public static int Roll(Random random, int diceCount) {
    int sum = 0;
    for (int dice = 1; dice <= diceCount; ++dice) {
        int rolled = random.Next(1, 7);
        if (rolled == 6) {
            sum += Roll(random, 2)
        }
        else
        {
            sum += rolled;
        }

    }

    return sum;
}

所以,首先我掷一个骰子。如果它不是6,那么我接受它的值作为结果。如果是六,那么我移除那个骰子,并用另外两个我掷的骰子替换它。然后,对于每一个新的骰子,我都遵循相同的规则,直到桌上所有的骰子都掷完,没有一个是6。现在我把骰子的所有价值加起来。这就是这个递归算法所做的。请注意,尽管它的可能性非常小,但您可以玩到游戏结束,因为总是有机会掷6,所以您可能只能掷6直到死亡。

您可以通过创建骰子对象使其更面向对象:

using System;
using System.Collections.Generic;

class Dices
{
    public class Dice
    {
        private static Random roler = new Random();
        private int roledNumber;
        public int Role()
        {
            roledNumber = roler.Next(6) + 1 ;
            return roledNumber;
        }

        public int Number
        {
            get { return roledNumber; }
        }
    }

    static void Main(string[] args)
    {
        List<Dice> allDices = new List<Dice>();

        Dice firstDice = new Dice();
        allDices.Add(firstDice);

        if (firstDice.Role() == 6) createDices(allDices);
    }

    static void createDices(List<Dice> dices)
    {
        Dice first = new Dice();
        dices.Add(first);
        if (first.Role() == 6) createDices(dices);
        Dice second = new Dice();
        dices.Add(second);
        if (second.Role() == 6) createDices(dices);

    }
}

如果它落在6上,则会创建并滚动两个骰子,依此类推,直到不再滚动6个骰子-不再滚动哪个骰子的6个骰子?欢迎使用stackoverflow。你的问题是什么?取决于你真正想做什么,一个简单的循环可以代替递归。当然,你不需要每次都有一个新的随机对象-你可以创建无限多个随机数。你不是在加倍骰子数,而是在加倍掷骰数。@LV428,恐怕你不熟悉这个。阅读我给出的链接中的答案。你的问题肯定与此有关。。。请注意,随机构造函数用作种子的时钟值只有一定的分辨率。您的递归执行速度太快,可能会多次递归,导致在时钟值之前出现StackOverflowException,因此您创建的每个随机数生成器的种子都会更改。David-谢谢!这就是我要找的!