我用C ++自学,如果答案非常明显,请原谅我!
我正在为几年前提出的骰子游戏编写代码,我需要能够比较结果的值。我的想法是,如果我创建一个数组并将5个骰子中的每一个分配给数组中的一个点,那么应该编写几行代码来检查是否有任何部分是相等的。 / p>
这是诀窍 - 我需要能够检查对,三元组,四元组,五元组和双对。我没有任何想法如何解决这个问题,我似乎无法在阵列上找到任何可以帮助我的东西。使用数组是解决这个问题的最佳方法,还是有更简单的方法?或者,我是否必须简单地写出每个比较组合,然后继续下一步?
这是我到目前为止的(删节)代码 - 不多,但这就是我现在正在使用的代码。
#include <time.h>
#include <iostream>
using namespace std;
int d1; //die 1
int d2; //die 2
int d3; //die 3
int d4; //die 4
int d5; //die 5
int dice [5]; //all 5 dice
int sum; //the sum of all the dice
int main()
{
srand(time(NULL));
d1 = rand() % 6 + 1;
d2 = rand() % 6 + 1;
d3 = rand() % 6 + 1;
d4 = rand() % 6 + 1;
d5 = rand() % 6 + 1;
sum = d1 + d2 + d3 + d4 + d5;
if (dice [] = dice [])
cout << endl << dice [];
return 0;
}
显然,dice []
不起作用。我正在尝试为我想要的东西构建逻辑,而我正在做空。我可以使用结构吗?我想要考虑任何事情,但是当谈到实际比较不同的数字以确定它们是否相等时,我正在画一个空白。我觉得必须采用某种方式键入if (dice [x.1] = dice [x.2])
,其中dice [x.1]
代表五个数字中的任何一个,dice [x.2]
是另一个。
答案 0 :(得分:2)
d1 = rand() % 6 + 1;
d2 = rand() % 6 + 1;
d3 = rand() % 6 + 1;
d4 = rand() % 6 + 1;
d5 = rand() % 6 + 1;
这应该是这样的:
for (int i=0; i<5; ++i)
d[i] = rand() % 6 + 1;
然后,要计算每个数字的实例数,请尝试以下方法:
int dieFaces[6] = {0};
for(int i=0; i<5; ++i) {
dieFaces[d[i]-1]++;
}
但是如果滚动的订单很重要,我们甚至只需要d[]
数组。如果您只需要掷骰子的值,我们可以将两个循环组合成:
int dieFaces[6] = {0};
for(int i=0; i<5; ++i) {
int face = rand() % 6;
dieFaces[face]++;
}
无论哪种方式,在填充dieFaces
之后,您都可以通过访问比您感兴趣的面部少1的元素来访问为任何特定骰子面部滚动的数字(数组为0索引)。
所以,如果你想知道推出了多少五个:
int fivesRolled = dieFaces[4];
如果你想检查是否有任何三元组:
bool triplesRolled = false;
for(int i = 0; i<6; ++i) {
if(dieFaces[i] == 3) {
triplesRolled = true;
break;
}
}
计算骰子的总和:
int sum = 0;
for(int i = 0; i<6; ++i) {
sum += ((i+1) * dieFaces[i]);
}
虽然,我可能只是在生成数字的同时计算总和。
答案 1 :(得分:0)
一种可能的思考方式是,当您生成数字时,不要将数组中的每个不同索引视为单独的模具,而是将每个索引视为滚动该索引的骰子数。
例如,如果你有5个六面模具并且滚动了2,2,4,5,6,那么你可能有一个看起来像[0,2,0,1,1,1]的数组。然后,您可以遍历数组,查找感兴趣的值来记录它们
当然,如果你需要知道哪个骰子滚动了哪个值,那么这没有多大帮助,并且它对于每个骰子具有不同数量的边数这样的事情并不是特别灵活。
希望这能让您了解如何解决问题。