c++ - 比许多嵌套的“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 万。我可能最好使用伪随机数并一百万次“滚动”九个骰子。但我仍然想知道是否有一种聪明的方法来处理排列。)
解决方案
如果您发现您正在嵌套看起来几乎相同的循环,您应该考虑使用递归。
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);
}
推荐阅读
- javascript - Javascript 中二维数组的 eval() 或 Function() 的替代方法?
- sql - 多边形 PostGIS 上的 ST_Intersect:JOIN/ON 的参数必须是布尔类型,而不是记录类型
- performance - Jmeter 问题:尝试从 CSV 读取数据时,@ 被 %40 替换
- python - 在 python 类中有一个不同名称的列表?
- powershell - 带有 Clixml 和 Taskscheduler 的 PowerShell 脚本
- powershell - 使用上一个命令中的名称信息填充变量
- css - 引导图像自动调整大小在左列中不起作用
- pandas - 如何在 pandas 中设置 pivot_table 来计算总值并得出百分比?
- python - 网页抓取 URL 构建
- python - 如果单词以大写开头,则在字符串中交换大小写