【问题标题】:Specific dice to reroll in C在 C 中重掷的特定骰子
【发布时间】:2017-07-31 05:16:26
【问题描述】:

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

#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 个或两者之间的任何组合......

【问题讨论】:

  • 用户的输入为您提供了数组的索引,对吗?因此,只需使用它来查找要更改的骰子值。
  • 但是如果用户输入 2 和 5 会怎样?这就是让我感到困惑的地方,如果他们想更改 2 个或更多.. 以及我的 scanf 将如何更改以输入超过 1 个数字
  • 嗯,这就是循环的用途。读取输入、更改值、读取下一个输入、更改值等
  • 你听说过数组吗?你知道如何使用它们吗?嗯;是的,有int die[5];。为什么你有 5 个dieN 变量和 5 个ptr_dieN 变量?除了使您的代码更长之外,它们提供的好处是什么?
  • @JonathanLeffler 我只是在学习数组,我还在搞清楚它们

标签: c arrays die


【解决方案1】:

你有太多不需要的变量。

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;
}

您需要询问用户是否结束它,例如“输入0结束游戏”。否则就是无限循环。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 对于用户逗号分隔列表,我的 scanf 会是什么样子?
    • 如果你有 %s%s%s 你知道会输入 3 个东西,那结果不是显示了它是如何工作的吗?然而对于我的代码,它可能是 1 - 5?
    • 可以解析任意长度的逗号分隔列表,但我认为这超出了您原始问题的范围。
    【解决方案3】:

    只需使用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;
    }
    

    【讨论】:

      【解决方案4】:

      我在上面的代码中没有看到任何 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;
      

      如果您仍在从事该项目,希望这对您有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-29
        • 1970-01-01
        • 2017-04-09
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        • 2018-09-08
        • 2019-03-09
        相关资源
        最近更新 更多