尝试使用数组(Yahtzee)C ++检查3种类型

时间:2016-11-23 21:26:32

标签: c++

我正在尝试检查保持的骰子卷(最多可以是5个)是否是3种,所以我试图将骰子卷值相互比较。

当然R的第一个值显示为0,但运行代码后R的第二个值每次显示为8191,我不完全确定原因。

我也尝试过使用 r ++而不是r + = r + 1,但当然没有改变任何东西。

int r = 0;
          cout << "first value of R is " << r << endl;
          for(int t = 0; t < 5; t++) {
            for(int w = 0; w < 5; w++) {
              if(keptDice[t] == keptDice[w] ) {
                r += r + 1;
              }
            }
          }
          cout << "Value of R is " << r << endl;

3 个答案:

答案 0 :(得分:1)

r += r + 1

与写作相同

r = r + r + 1
每次都会翻倍。有趣的是,它总是小于2 ^ n

r = 0 + 0 + 1 (1)
r = 1 + 1 + 1 (3)
r = 3 + 3 + 1 (7)
r = 7 + 7 + 1 (15)
r = 15 + 15 + 1 (31)
r = 31 + 31 + 1 (63)
r = 63 + 63 + 1 (127)
r = 127 + 127 + 1 (255)
r = 255 + 255 + 1 (511)
r = 511 + 511 + 1 (1023)
r = 1023 + 1023 + 1 (2047)
r = 2047 + 2047 + 1 (4095)
r = 4095 + 4095 + 1 (8191)

您的计划正在计算13场比赛。对于yahtzee,你可能想要一个可以计算匹配数的数组,否则你会在每个模具上加倍。例如,如果你有

1 2 3 4 1

它将计算与最后一个模具匹配的前1个和与第一个模具匹配的最后一个模具(2个匹配)。

更明智的是计算你有多少1,你有多少2,并存储在数组中

int diceCount[6];
for(int num = 1; num <= 6; num++) {
        for(int w = 0; w < 5; w++) {
          int count = 0;
          if(keptDice[w] == num ) {
            count++;
          }
          diceCount[num-1] = count;
        }

这样一来,如果你有两个1,那么diceCount [0]将是2

答案 1 :(得分:1)

关键是在第二个for循环中你有从t开始的tor(int w = t; ...)否则你会将每个骰子与自身进行比较,这自然是相等的。另外使用r ++而不是r + = r + 1这绝对是错误的,但我认为这只是拼写错误。

int r = 0;
cout << "first value of R is " << r << endl;
for(int t = 0; t < 5; t++) {
    for(int w = t; w < 5; w++) {
        if(keptDice[t] == keptDice[w] ) {
            r++;
        }
    }
}
cout << "Value of R is " << r << endl;

答案 2 :(得分:0)

根据您的方法,但推广到N-of-kind:

int N = 3; // N in [1;5]
bool isNOfAKind = false;
for(int t = 0; t < 6-N; t++) { // skip searches with less elements than N
    int r = 0; // r must be reset for each count
    for(int w = t+1; w < 5; w++) { // avoid comparing to self
        if(keptDice[t] == keptDice[w]) {
            r++;
        }
    }
    // found a solution already? then bail out.
    if(r == N) {
        isNOfAKind = true;
        break;
    }
}
cout << N << " of a kind? " << isNOfAKind << endl;