【问题标题】:Rolling Multiple Die in C++在 C++ 中滚动多个骰子
【发布时间】:2013-12-13 08:25:45
【问题描述】:

我一直在为我的计算机科学课做练习题,其中一个题目如下:

重复掷一对骰子。如果“厢式车”(6-6)出现,玩家 A 获胜。如果不是,但 7 连续出现两次(例如,一个骰子显示 7,然后在你再次掷出两个骰子后,另一个 7 出现),B 获胜。编写一个 C++ 程序,掷一对骰子 1000 次,并输出 A 和 B 会赢多少次。

所以我已经获得了该程序的主要骨干并对其进行了几次测试,但到目前为止,B 玩家每次都显示为 0 次获胜。每次我运行程序时,A 玩家的胜利都会波动,所以我相信 A 的编码是正确的,但任何提示或调试都将不胜感激。程序:

#include <iostream>
#include <ctime>
using namespace std;

int main()
{
int die1, die2, store = 0, awin = 0, bwin = 0;

srand(time(NULL));

for(int i = 0; i < 1000; i++)
{
    die1 = rand()% 6+1;
    die2 = rand()% 6+1;

    if(die1 == 6 && die2 == 6)
    {
        awin++;
    }
    else if(die1 == 7 || die2 == 7)
    {
        store = 1;
    }

    if(store == 1 && die1 == 7)
    {
        bwin++;
        store = 0;
    }
    else if(store == 1 && die2 == 7)
    {
        bwin++;
        store = 0;
    }

    store = 0;
}

cout << "A has won " << awin << " times and B has won " << bwin << " times." << endl;

system("pause");

}

【问题讨论】:

  • else if(die1 == 7) 6 面骰子怎么可能是 7 面?
  • 骰子有几面?
  • 我刚刚注意到骰子实际上不可能等于 7,所以我在这里勉强说他相信 sum i> 等于七,不是一个死的。我觉得自己像个彻头彻尾的白痴,但我今天也刚参加了有机化学测试,所以我有点花...对不起,哈哈。
  • 我可以给小费吗?这与问题无关,因为它已经得到了回答,但是不要在 ifelse if 甚至函数声明之后在新行上开始大括号,而是将其立即放在右方括号之后。即int main(){ 作为您的第 5 行。它只是有助于节省空间并提高可读性。
  • @TheWalkingCactus:你知道,程序员会为这样的编码约定争论不休。比如我鄙视同一行的花括号,我会争论到死!

标签: c++ visual-studio-2012 dice


【解决方案1】:

rand() % 7 永远不会给你 7 的结果。它是一个数字除以 7 的余数,所以你会得到 0 到 6 之间的任何值。

记住您的评论,只需检查die1 + die2 == 7,您就会被排序。

【讨论】:

  • 是的,实际上我刚刚注意到骰子最多只能达到 6,而我的教授可能是说 sum 等于 7。我觉得自己像个白痴……
  • 我认为可能是这样,但如果这是逐字逐句的问题,那么他至少部分有过错。
【解决方案2】:

rand()%6+1 返回一个从 1 到 6 的范围。
store 仅在骰子掷出 7 的情况下才被分配,这永远不会发生。
bwin 仅在以下情况下才会递增store 等于掷骰子,这也永远不会发生,因为存储被初始化为 0,并且永远无法满足重新分配它的条件(滚动 7)。
因此,bwin 始终为 0,awin 仅在两个骰子都掷出 6 时才会增加。

【讨论】:

    【解决方案3】:

    这部分的一切似乎都是正确的:

    if(die1 == 6 && die2 == 6) {
        awin++;
    }
    

    在这之后,事情就发生了变化。

    首先,检查上一卷是否为 7,当前卷是否与上一卷匹配:

    if(store == 7 && store == die1 + die2) {
    

    如果结果为真,则 b 获胜:

        bwin++;
    }
    

    然后存储当前滚动的值,以便您在下一次滚动时知道它:

    store = die1+die2;
    

    【讨论】:

      【解决方案4】:

      您不应该检查每个骰子与 7 的对比,而是检查两个骰子的总和。

      试试这个

      for(int i = 0; i < 1000; i++)
      {
          die1 = rand()% 6+1;
          die2 = rand()% 6+1;
      
          if(die1 == 6 && die2 == 6)
          {
              awin++;
          }
          else if (store == 7 && (die1 + die2) == 7)
          {
              bwin++;
          }
      
          store = die1 + die2;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-03-16
        • 1970-01-01
        • 2021-11-13
        • 2013-09-17
        • 1970-01-01
        • 2016-08-10
        • 1970-01-01
        • 2016-03-14
        • 2023-03-28
        相关资源
        最近更新 更多