骰子滚动模拟器,2个骰子

时间:2014-03-18 17:43:30

标签: c

我正在尝试模拟一个游戏,程序会询问用户他们想要掷出一对骰子的次数。然后,程序将显示每个总计滚动的次数。我们不允许使用数组我的程序不滚动或计算随机数。任何帮助表示赞赏。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    int d2 = 0;
    int d3 = 0;
    int d4 = 0;
    int d5 = 0;
    int d6 = 0;
    int d7 = 0;
    int d8 = 0;
    int d9 = 0;
    int d10 = 0;
    int d11 = 0;
    int d12 = 0;

    int k, roll_1, roll_2, num_roll, total,  count = 0 ;

    srand((long)time(NULL));

    printf("Enter number \n");

    scanf("%d", &num_roll);


    for (k = 0; k < num_roll; k++)
    {
        roll_1 = rand() %6 +1;
        roll_2 = rand() %6 +1;
        total = roll_1 + roll_2;
        count++;
    }

    for (k = 0; k < num_roll; k++)
            {
              if (total == 2) d2++;
            else if (total == 3) d3++;
            else if (total == 4) d4++;
            else if (total == 5) d5++;
            else if (total == 6) d6++;
            else if (total == 7) d7++;
            else if (total == 8) d8++;
            else if (total == 9) d9++;
            else if (total == 10) d10++;
            else if (total == 11) d11++;
            else if (total == 12) d12++;
  for(k = 0; k < num_roll; k++)
            {
            perc = total / num_roll;
            }

     printf("Rolls: %i\n", num_roll);

     printf("  2: %d\n", d2);
     printf("  3: %d\n", d3);
     printf("  4: %d\n", d4);
     printf("  5: %d\n", d5);
     printf("  6: %d\n", d6);
     printf("  7: %d\n", d7);
     printf("  8: %d\n", d8);
     printf("  9: %d\n", d9);
     printf("  10: %d\n", d10);
     printf("  11: %d\n", d11);
     printf("  12: %d\n", d12);

   return 0;
   }  

4 个答案:

答案 0 :(得分:3)

问题是你有两个循环而不是一个来记录滚动。您的代码会滚动并覆盖total num_roll次。然后循环并尝试更新每个数字的滚动次数。这应该在一个循环中完成:

for (k = 0; k < num_roll; k++)
{
    roll_1 = rand() %6 +1;
    roll_2 = rand() %6 +1;
    total = roll_1 + roll_2;
    count++;

    if (total == 2) d2++;
    else if (total == 3) d3++;
    else if (total == 4) d4++;
    // ...
}

另请注意,这是switch语句解决的构造类型:

switch( total )
{
     case 2: d2++; break;
     case 3: d3++; break;
     case 4: d4++; break;
     case 5: d5++; break;
     //...
     default: //Error
}

答案 1 :(得分:1)

您需要将前两个循环合并为一个,否则total将始终只是您制作的最后一个循环。

答案 2 :(得分:0)

总变量位于循环内部,因此它的值将在每个回合中被擦除。 进行第二次循环时,仅使用最后一个总值。

你有两个解决方案,

首先是构建一个数组并存储所有总值。然后在第二个循环中,您可以访问所有值。 其次,(简单的一个)是使用总的当前值。

for (k = 0; k < num_roll; k++)
{
    roll_1 = rand() %6 +1;
    roll_2 = rand() %6 +1;
 ->    total = roll_1 + roll_2;
    count++;

    if (total == 2) d2++;
    else if (total == 3) d3++;
    else if (total == 4) d4++;
    // ...
}

如果您需要额外的解释,欢迎您。

答案 3 :(得分:0)

我几乎无法想象为什么你会得到这样的任务,但不允许使用数组。它只会教你不良习惯 - 命名变量a1,a2,...是一个。

如果你还没有被教过使用数组,那么这个问题不适合你。如果已经教会使用数组,那么挑战可能就是找到一个等同于数组的替代语法。

 int *ptr = malloc(10 * sizeof(int)); /* This isn't an array, but it's as good */
 memset(ptr,0,10);      /* Fill it with zeroes */

 /* Let's roll */
 for(i=0; i<num_roll; i++) {
     int roll = rand() % 6 + rand() %6; /* Our dice have sides from 0 to 5 */
     *(ptr + roll * sizeof(int)) ++; /* increment the appropriate part of our "array"
 }

 /* Print the results */
 for(int i=0; i<10;i++) {
     /* Add 2 to every roll for display, as if our dice had sides from 1 to 6 */
     printf("There were %d rolls with value %d\n", *(ptr+i), i+2);
 }