2 votes

Jeu de craps et fonction

Je suis en train de créer une sorte de jeu de craps en utilisant le C.

si sum=7,11 gagner ; si sum=2,3,12 perdre ; sinon continuer.

J'ai quelques problèmes avec la fonction play_game() car le retour de la fonction n'est pas correct. Par exemple, si la somme est 3, elle ne renvoie pas toujours 1 mais 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;   
        }   
    }   
}

5voto

dbush Points 8590

Vous appelez play_game trop souvent.

Vous l'appelez une fois au début de la boucle mais jetez le résultat. Vous l'appelez à nouveau et vérifiez si le résultat est égal à 0. Si ce n'est pas le cas, vous appelez la fonction à nouveau et vérifiez si le résultat est 1, si non vous l'appelez à nouveau et vérifier si le résultat est 2.

Vous devez appeler play_game une seule fois dans chaque boucle et enregistrez la valeur de retour afin de pouvoir la vérifier ultérieurement sans avoir à rappeler la fonction.

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');

0voto

chux Points 13185

En plus des problèmes d'algorithme soulignés dans @dbush réponse fine, les jets de dés ne sont pas simulés correctement. @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;
}

En outre, un bon rand() a tendance à être coûteux en temps de calcul. Une alternative qui n'utilise que 1 rand() appelez

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X