C 骰子游戏及其功能

C 骰子游戏及其功能,c,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 (p

我正在用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;   
        }   
    }   
}

你打电话的次数太多了

在循环开始时调用一次,但放弃结果。您再次调用它并检查结果是否为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');

除了精细答案中指出的算法问题外,掷骰子的模拟也不正确

此外,好的
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;
}

如果总和为3,
play_game()
不可能返回2。在您的代码中,骰子似乎是0-5,而不是1-6。最好使
const int result=play_game()为了清晰起见。两次循环后程序结束,我不明白为什么。@Walter
getchar
函数读取所有字符,包括换行符。如果你读了一行新词,你需要一直调用
getchar
,直到你得到其他东西。
int roll_2dice(void){
    int r = rand()%36;  // 36 combinations
    int die1 = r/6 + 1;
    int die2 = r%6 + 1;
    return die1 + die2;
}