在 C 中重投的特定骰子
Specific dice to reroll in C
我正在开发一款 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 个或两者之间的任何组合...
您可以让用户输入逗号分隔的骰子列表,而不是单个整数,就像您现在正在做的那样。然后只需解析输入,检查是否有 1 到 5 个小于 6 的有效整数,并索引每个骰子。
或者您可以按照 kaylum 的建议进行循环,直到用户输入一个特殊的字符串表示他们已经完成,或者提示输入 1、2、... 5 并要求对每个答案是或否。
只需使用 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;
}
您有太多实际上不需要的变量。
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;
}
您需要询问用户是否结束它,例如"Enter 0 to end the game"。否则就是死循环
我在上面的代码中没有看到任何 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;
希望这对您有所帮助,如果您仍在从事该项目的话!
我正在开发一款 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 个或两者之间的任何组合...
您可以让用户输入逗号分隔的骰子列表,而不是单个整数,就像您现在正在做的那样。然后只需解析输入,检查是否有 1 到 5 个小于 6 的有效整数,并索引每个骰子。
或者您可以按照 kaylum 的建议进行循环,直到用户输入一个特殊的字符串表示他们已经完成,或者提示输入 1、2、... 5 并要求对每个答案是或否。
只需使用 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;
}
您有太多实际上不需要的变量。
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;
}
您需要询问用户是否结束它,例如"Enter 0 to end the game"。否则就是死循环
我在上面的代码中没有看到任何 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;
希望这对您有所帮助,如果您仍在从事该项目的话!