首页 > 解决方案 > 比许多嵌套的“for”循环更好的东西?

问题描述

我希望为一款游戏评估几种不同的潜在规则/计分系统。游戏涉及滚动三个骰子最多三次。为了考虑每种可能性的结果,我遍历了九个可能掷骰子的所有可能值。

我的问题是以下蛮力风格编码是否是最好的方法。

// get the result for each possible game
void Evaluate( const ScoringSystem& sys )
{
    for( int d1=0; d1<6; ++d1 )
    {
        for( int d2=0; d2<6; ++d2 )
        {
            for( int d3=0; d3<6; ++d3 )
            {
                for( int d4=0; d4<6; ++d4 )
                {
                    for( int d5=0; d5<6; ++d5 )
                    {
                        for( int d6=0; d6<6; ++d6 )
                        {
                            for( int d7=0; d7<6; ++d7 )
                            {
                                for( int d8=0; d8<6; ++d8 )
                                {
                                    for( int d9=0; d9<6; ++d9 )
                                    {
                                        int rolls[] = { d1, d2, d3, d4, d5, d6, d7, d8, d9 };

                                        // get the result for this particular game
                                        sys.GetGameResult( rolls );
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

代码功能但很丑陋并且不能扩展到具有更多骰子的游戏。我有一个支持 C++17 的环境,所以我对更新的想法持开放态度——只要它们不会让代码看起来太糟糕。

(切线:6^9 超过 1000 万。我可能最好使用伪随机数并一百万次“滚动”九个骰子。但我仍然想知道是否有一种聪明的方法来处理排列。)

标签: c++

解决方案


如果您发现您正在嵌套看起来几乎相同的循环,您应该考虑使用递归。

void generateDiceRolls(const ScoringSystem& sys, std::vector<int>& rolls, size_t index)
{
    if (index == rolls.size())
    {
        // Reached the end - all the dice have been rolled
        sys.GetGameResult(rolls);
    }
    else
    {
        // For each value of a die at this index, generate dice rolls for the rest of them
        for (int i = 0; i < 6; i++)
        {
            rolls[index] = i;
            generateDiceRolls(sys, rolls, index + 1);
        }
    }
}
void Evaluate(const ScoringSystem& sys)
{
    std::vector<int> rolls(9);  // Change 9 to however many dice you want to use
    generateDiceRolls(sys, rolls, 0);
}

推荐阅读