掷骰子游戏和功能

时间:2017-11-20 13:26:33

标签: c

我正在使用C创建一种掷骰子游戏。

如果总和= 7,11获胜; 如果总和= 2,3,12输; 否则继续。

我的函数play_game()有些问题,因为函数的返回不正确。例如,如果总和为3,有时不会返回1而是2。

int roll_dice(void);
int play_game(void);
int main(){
    int sum;
    char play;

    do{
        roll_dice();
        play_game();

        if (play_game()==0){
            printf ("\nYou win!");  
            printf ("\nPlay again? ");
            play=getchar(); 
        }
        else {
            if (play_game()==1) {
                printf ("\nYou lose!"); 
                printf ("\nPlay again? ");
                play=getchar(); 
            }   
            else {
                if (play_game()==2) play='y';
                else system ("pause");
            }   
        }                   
    }
    while (play=='y');
    return 0;       
}

int roll_dice(void){
    int sum = rand()%6 + rand()%6;
    return sum;
}


int play_game(void){
    int sum = roll_dice();
    printf ("\nYou rolled: %d", sum);
    if ((sum==7)||(sum==11)) return 0;
    else {
        if ((sum==2)||(sum==3)||(sum==12)) return 1;    
        else {
            printf ("\nYour point is %d", sum);
            return 2;   
        }   
    }   
}

2 个答案:

答案 0 :(得分:5)

您经常拨打play_game

在循环开始时调用一次,但丢弃结果。您再次调用它并检查结果是否为0.如果不是,则再次将其称为 并检查结果是否为1,如果不是,则再次将其称为 并且检查结果是否为2。

您需要在每个循环中只调用一次play_game并存储返回值,以便稍后检查它而无需再次调用该函数。

do{
    const int result = play_game();   // save result

    if (result ==0){      // use saved result
        printf ("\nYou win!");  
        printf ("\nPlay again? ");
        play=getchar(); 
    }
    else {
        if (result ==1) {     // use saved result
            printf ("\nYou lose!"); 
            printf ("\nPlay again? ");
            play=getchar(); 
        }   
        else {
            if (result ==2) play='y';    // use saved result
            else system ("pause");
        }   
    }                   
}
while (play=='y');

答案 1 :(得分:0)

除了@dbush精确答案中指出的算法问题外,骰子卷未正确模拟。 @Klas Lindbäck

// better name: roll_2dice()
int roll_dice(void){
    // int sum = rand()%6 + rand()%6;  // wrong simulation
    int sum = (rand()%6 + 1) + (rand()%6 + 1); // corrected.
    return sum;
}

此外,好的rand()在计算时间上往往很昂贵。仅使用1 rand()电话

的替代方案
int roll_2dice(void){
    int r = rand()%36;  // 36 combinations
    int die1 = r/6 + 1;
    int die2 = r%6 + 1;
    return die1 + die2;
}