在C中重新注册的特定骰子

时间:2017-03-10 01:31:56

标签: c arrays die

我正在开发Yahtzee游戏,游戏的一部分是用户可以选择他们希望重新滚动的5个骰子。除了编写大量if if-else语句之外,我真的不知道如何处理这个问题,但必须有一种更有效的方法来重新推出特定的模具/骰子。我写了一篇我想要完成的内容片段,它在我的实际代码中并不完全相同,但希望它足以回答这个问题:)

#include<stdio.h>

int main(void)
{
    int die1 = 0, die2 = 0, die3 = 0, die4 = 0, die5 = 0;
    int *ptr_die1 = &die1, *ptr_die2 = &die2, *ptr_die3 = &die3, *ptr_die4 = &die4, *ptr_die5 = &die5;
    int choice = 0;
    int die[5] = { 0 };


    for (int i = 0; i < 5; i++)
    {
        die[i] = rand() % 6 + 1;
    }



    printf("Die[1] = %d\n", die[0]);
    printf("Die[2] = %d\n", die[1]);
    printf("Die[3] = %d\n", die[2]);
    printf("Die[4] = %d\n", die[3]);
    printf("Die[5] = %d\n", die[4]);


    choice = printf("Please select which die to reroll\n");
    scanf("%d", &choice); 

    printf("%d\n", choice);

    for (int i = 0; i < 5; i++)
    {
        die[choice-1] = rand() % 6 + 1;
    }

    printf("Die[1] = %d\n", die[0]);
    printf("Die[2] = %d\n", die[1]);
    printf("Die[3] = %d\n", die[2]);
    printf("Die[4] = %d\n", die[3]);
    printf("Die[5] = %d\n", die[4]);

    return 0;
}

在此之后,我真的迷失了如何更换模具,因为用户可能只想更改1或全部5或其间的任何组合......

4 个答案:

答案 0 :(得分:0)

你可以让用户输入一个逗号分隔的die列表,而不是一个整数,它看起来就像你现在正在做的那样。然后只需解析输入,检查你有1到5个有效整数小于6,并索引到每个骰子。

或者你可以像kaylum建议和循环一样,直到用户输入一个特殊的字符串表示他们已经完成,或提示1,2,... 5并要求对每个人做出是或否答案。

答案 1 :(得分:0)

只需使用int值数组来表示骰子集:

#define DICE_COUNT 6

void rollDice(int* diceArray, size_t diceIndex) {

    assert( 0 <= diceIndex && diceIndex < DICE_COUNT );

    diceArray[ diceIndex ] = rand() % 6 + 1;
}

int main(int argc, char* argv[]) {

    // Seed the RNG:
    srand( (unsigned)time(&t) );

    int dice[DICE_COUNT];

    for(size_t i = 0; i < DICE_COUNT; i++) {

        rollDice( dice, i );
    }

    while( true ) {

        printf("Please select which die to reroll. Enter -2 to quit. (%d to %d inclusive)", 1, DICE_COUNT);
        int selection = -1;
        scanf("%d", &selection);
        if( selection == -2 ) break;

        if( 1 <= selection && selection <= DICE_COUNT ) {

            selection--; // convert from 1-6 to 0-5.

            rollDice( dice, selection );
        }
    }

    return EXIT_SUCCESS;
}

答案 2 :(得分:0)

你有太多不需要的变量。

int main(int argc, char **argv) 
{
  int i;
  int choice;
  int dices[5];
  srand(time(NULL));

  while(1){
    for (i = 0; i < 5; i++)
      dices[i] = rand() % 6 + 1;

    choice = printf("Please select which die to reroll (or enter 0 to quit)");
    scanf("%d", &choice);
    if (choice == 0)   // end the game
       break;    
    if (choice < 1 || choice > 5 ){  // make sure that input is valid
      fprintf(stderr, "error, input should be between 1 to 5 (inclusive)\n");
      return -1;
    }
    printf("dice shows: %d", dices[choice-1]);
  }
  return 0;
}

您需要询问用户结束它,例如&#34;输入0结束游戏&#34;。否则它将是一个无限循环。

答案 3 :(得分:0)

我在上面的代码中没有看到任何if..else语句。我会说,在这段代码中:

for (int i = 0; i < 5; i++)
{
    die[choice-1] = rand() % 6 + 1;
}

您不需要for循环。你没有使用索引,rand()应该第一次工作。我知道rand()不是最好的书面函数,但如果你先播种它,它应该给你一个伪随机数。

#include <time.h>
...
/* initialize random seed: */
srand ( time(NULL) );
...
die[choice-1] = rand() % 6 + 1;

希望如果您还在为该项目工作,这会很有帮助!