【问题标题】:Dice Roll Simulator C++掷骰子模拟器 C++
【发布时间】:2016-04-18 22:30:01
【问题描述】:

在课堂上,我们收到了一项任务,要求我们编写一个模拟掷骰子(或多个骰子)的 C++ 程序。很简单,我做得很简单,甚至让它一次掷出超过 1 个骰子并计算一个数字被掷出的次数(2-12,正如你将在底部的代码中看到的那样)。但后来老师又给了我们一个作业。让程序滚动用户输入多少个骰子,根据用户输入骰子有多少面,用户希望骰子滚动多少次,以及能够“握住”骰子,就像在 Yahtzee 游戏中一样。

我和我的同学真的很困惑如何做到这一点,老师给我们创建“保持”功能的提示涉及数组。我们很困惑,因为我们唯一的 Array 示例是我们在课堂上做的示例,我们作为示例制作的原始 Dice 模拟器和滚动两个骰子等。

以下是我目前所拥有的代码。我知道并非所有变量都有目的,我尝试使用数组复制代码下面的示例,但我知道我做的不对,所以请放轻松。我不是要你为我做任务,我只是需要一些关于下一步做什么以及我做错了什么的指导。带有注释标签的代码是我提到的原始骰子模拟器,上面是我正在做的。任何帮助表示赞赏。

srand (time(NULL));
int dicenumber,diceroll,sides,rolls,rolling;
//Be able to hold, ask how many dice to roll, how many sides per die, and how many rolls
cout<<"\033[1;36m How many dice would you like to roll? \033[0m \n";
cin>>dicenumber;
cout<<"\033[1;36m How many sides per die? \033[0m \n";
cin>>sides;
cout<<"\033[1;36m How many times do you want to roll? \033[0m \n";
cin>>rolls;

//Sets total rolls to 0
for (rolling=0;rolling<rolls;rolling++)
    diceroll=rand()%sides+1;
    cout<<diceroll;




//Initialize variables and randomness
//srand (time(NULL));
//int COUNTER,ROLLS,TOTALS[13];

        //Set totals to 0
//for (COUNTER=0;COUNTER<13;COUNTER++)
//TOTALS[COUNTER]=0;

        //Simulate 1,000,000 dice rolls
//for (ROLLS=0;ROLLS<1000;ROLLS++)
    //TOTALS[rand()%6+1+rand()%6+1]++;

        //Output the totals
//for (COUNTER=1;COUNTER<13;COUNTER++)
    //cout<<COUNTER<<" = \033[1;36m"<<TOTALS[COUNTER]<<"\033[0m \n";

【问题讨论】:

  • 缩进的内容并不意味着它在它所在的循环内。
  • 是的,C++(大部分)对空格不敏感。从逻辑上讲,您需要大括号围绕第一个 for 循环的两行。
  • 用户可以“持有”多少个骰子是否有上限或假设上限?如果不是,您将不得不根据用户的选择动态分配一个数组
  • 我知道如何使用循环,我只是把我们在课堂上一起做的事情作为起点。我的老师说afor循环如果在括号中就不需要括号,我只是对这个项目感到很困惑,向我解释的方式并没有帮助我理解。
  • 袋鼠,我怎样才能使数组创建的空格数等于用户整数?

标签: c++ arrays probability dice


【解决方案1】:

如果您对用户可以选择的骰子数量没有上限(或者说没有“假定”上限),那么为了存储结果,您需要根据用户的输入分配数组,可以这样完成:

int *results = new int[dicenumber];
for(int i = 0; i < dicenumber; i++){
    // rolling the dice and storing the values...
    *(results+i) = rand() % sides + 1;
}// end for loop

// viewing the results...
for(int i = 0; i < dicenumber; i++){
    cout << *(results+i) << endl;
}
...
// end of program; free the memory when you're done
delete[] results;

在上述情况下,您使用指针*results 指向内存中的特定地址,其中使用new 关键字为我们分配空间来存储掷骰结果。在这种情况下,我们分配的空间等于int 的大小乘以骰子的数量。在 for 循环的每次迭代中,我们都在递增指针,从而对我们的数组进行索引。

但是,如果您只是被介绍给数组,我发现您的教授不太可能想到指针算术。将结果存储在静态数组中要容易得多(或者至少更直观);下面是一个例子:

int results[32]; // allocated an array of size sizeof(int)*32, so space for 32 ints!
for(int i = 0; i < dicenumber; i++){
    // indexing through the array and assigning our roll...
    results[i] = rand() % sides + 1;
}// end for loop

// viewing the results...
for(int i = 0; i < dicenumber; i++){
    cout << results[i] << endl;
}// end for loop

不管怎样,是的,数组是一种存储程序结果的简单方法。正如另一个答案所建议的那样,您确实可以使用std::vector&lt;int&gt; 或其他一些自定义类/结构的向量来存储结果,但坦率地说,除了静态数组之外的任何东西都是矫枉过正的(至少对于编程课程......)

【讨论】:

    【解决方案2】:

    您可以使用std::vector&lt;int&gt;int[DICE_COUNT],甚至std::vector&lt;Die&gt;,创建Die 类。有很多方法可以做到这一点,但基本上可以将数组/向量视为存储许多骰子的当前状态,然后可以在以后调用。

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 2018-01-03
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多