繁体   English   中英

掷骰子游戏和功能

[英]Craps game and function

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

如果总和= 7,11赢; 如果sum = 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;   
        }   
    }   
}

您经常打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');

除了@dbush最佳答案中指出的算法问题外,骰子掷骰没有正确模拟。 @克拉斯·林贝克

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM