intel1337 / heads-tails-C

Heads or tails in C
0 stars 1 forks source link

Encapsule la logique de définition de choix pour simplifier la lecture du code #5

Open CHAOUCHI opened 3 weeks ago

CHAOUCHI commented 3 weeks ago

https://github.com/intel1337/heads-tails-C/blob/7accba224eb129bee531c730644160722c574f03/main.c#L38

Plutot que d'utiliser des if else if tu peux créer une fonction qui renvoi un int et faire un switch en fonction de cet int.

Actuellement :

 if(strncmp(input,"1",1)==0||strncmp(input,"pile",4)==0||strncmp(input,"PILE",4)==0||strncmp(input,"pILe",4)==0||strncmp(input,"p",1)==0){
                inp=PILE_NOMBRE;
            }
            else if(strncmp(input,"2",1)==0||strncmp(input,"face",4)==0||strncmp(input,"FACE",4)==0||strncmp(input,"fACE",4)==0||strncmp(input,"f",1)==0){
                inp=FACE_NOMBRE;
            }
            else if(strncmp(input,"0",1)==0){
                break;
            }
            else if(strncmp(input,"3",1)==0){
                printf("Le but du jeu est de deviner pile ou face\n");
                printf("Aucune règles précise hors de ca");
                printf("Vous gagnez si vous devinez correctement\n");
                printf("Si vous arrivez à 10 lose, vous perdez\n");
                printf("Press Enter to continue\n");
                getchar();
                continue;
            }
            else if(strncmp(input,"4",1)==0){
                printf("Vous avez gagné %d fois et perdu %d fois\n", win, lose);
                printf("Press Enter to continue\n");
                getchar();
                continue;
            }
            else if(strncmp(input,"5",1)==0){
                printf("\n");
                printf("Crédits : \n");
                printf("github.com/intel1337\n");
                printf("Press Enter to continue\n");
                getchar();
                continue;
            }
            else
                continue;
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <unistd.h>
    #define BLK "\e[0;30m"
    #define RED "\e[0;31m"
    #define GRN "\e[0;32m"
    #define YEL "\e[0;33m"
    #define BLU "\e[0;34m"
    #define MAG "\e[0;35m"
    #define CYN "\e[0;36m"
    #define WHT "\e[0;37m"
    #define WRONG_INPUT -1
    #define QUIT_NOMBRE 0
    #define PILE_NOMBRE 1
    #define FACE_NOMBRE 2
    #define RULE_NOMBRE 3
    #define HISTORY_NOMBRE 4
    #define CREDIT_NOMBRE 5
    #define MAX_LENGTH 4

    int get_choice(){
            char input[MAX_LENGTH];
            memset(input,0,MAX_LENGTH);
            fgets(input, MAX_LENGTH, stdin);
            printf("\n");
            if(strncmp(input,"1",1)==0||strncmp(input,"pile",4)==0||strncmp(input,"PILE",4)==0||strncmp(input,"pILe",4)==0||strncmp(input,"p",1)==0){
                return PILE_NOMBRE;
            }
            else if(strncmp(input,"2",1)==0||strncmp(input,"face",4)==0||strncmp(input,"FACE",4)==0||strncmp(input,"fACE",4)==0||strncmp(input,"f",1)==0){
                return FACE_NOMBRE;
            }
            else if(strncmp(input,"0",1)==0){
                return QUIT_NOMBRE;
            }
            else if(strncmp(input,"3",1)==0){
                // printf("Le but du jeu est de deviner pile ou face\n");
                // printf("Aucune règles précise hors de ca");
                // printf("Vous gagnez si vous devinez correctement\n");
                // printf("Si vous arrivez à 10 lose, vous perdez\n");
                // printf("Press Enter to continue\n");
                // getchar();
                // continue;
                return RULE_NOMBRE;
            }
            else if(strncmp(input,"4",1)==0){
                // printf("Vous avez gagné %d fois et perdu %d fois\n", win, lose);
                // printf("Press Enter to continue\n");
                // getchar();
                // continue;
                return HISTORY_NOMBRE;
            }
            else if(strncmp(input,"5",1)==0){
                // printf("\n");
                // printf("Crédits : \n");
                // printf("github.com/intel1337\n");
                // printf("Press Enter to continue\n");
                // getchar();
                // continue;
                return CREDIT_NOMBRE;
            }
            else
                return WRONG_INPUT; // WRONG INPUT
    }

    int main(){
        int inp;
        char input[MAX_LENGTH];
        int win = 0;
        int lose = 0;
        while(1){
            system("clear");
            printf(BLU);
            printf("             [------ %sPile ou %sFace %s? %s------]\n", MAG, CYN, WHT, BLU);
            printf("\n");
            printf("\n");
            printf(MAG);
            printf("  [------[1] - Pile // [2] - Face // [3] - Rules------]\n");
            printf(CYN);
            printf("[------[0] - Exit // [4] - History// [5] - Credits------]\n");
            printf("\n");
            printf("\n");
            printf("%s                   Player%s@%spo%sf--%s#", WHT, GRN, MAG, MAG, WHT);

            inp = get_choice();
            switch (inp)
            {
                case QUIT_NOMBRE:
                    // je ne peux plus juste faire un break pour couper la boucle while car j'ai encapsuler mon code
                    // il faut donc que je traite le cas ou le joueur veux sortir ici.
                    break;
                case PILE_NOMBRE:

                    break;
                case FACE_NOMBRE:
                    break;
                case RULE_NOMBRE:
                    printf("Le but du jeu est de deviner pile ou face\n");
                    printf("Aucune règles précise hors de ca");
                    printf("Vous gagnez si vous devinez correctement\n");
                    printf("Si vous arrivez à 10 lose, vous perdez\n");
                    printf("Press Enter to continue\n");
                    getchar();
                    break;
                case HISTORY_NOMBRE:
                    printf("Vous avez gagné %d fois et perdu %d fois\n", win, lose);
                    printf("Press Enter to continue\n");
                    getchar();
                    break;
                case CREDIT_NOMBRE:
                    printf("\n");
                    printf("Crédits : \n");
                    printf("github.com/intel1337\n");
                    printf("Press Enter to continue\n");
                    getchar();
                    break;

                default:
                    // any wrong number
                    break;
            }

            // Il faut adapter ton code pour qu'il rentre dans le switch ta condition de while doit être modifié pour ça.

            if(r == inp) {
                if(win>=1){
                    printf("Réussites !");
                }
                else if(lose>=1){
                    printf("Réussites !");
                }
                else{
                printf("Réussite !\n");
                }
                win++;
                if(inp==PILE_NOMBRE){
                    printf("Vous avez eu Pile\n");
                }
                else if(inp==FACE_NOMBRE){
                    printf("Vous avez eu Face\n");
                }
                printf("Press Enter to continue\n");
            }
            else{
                if(win>=1){
                    printf("Défaites !");
                }
                else if(lose>=1){
                    printf("Défaites !");
                }
                else{
                    printf("Défaite !");
                }
                printf("Vous avez Perdu\n");
                lose++;
                if(inp==PILE_NOMBRE){
                    printf("Vous avez eu Pile\n");
                }
                else if(inp==FACE_NOMBRE){
                    printf("Vous avez eu Face\n");
                }
                printf("Press Enter to continue\n");
            }
            if(lose==10){
                printf("Game Over !\n");
            }
            getchar();
        }
        return 0;
    }
CHAOUCHI commented 3 weeks ago

En résumé ton code est dur a lire car tout se trouve dans la fonction mais divise t'as logique comme j'ai fais a la fonction get_choice pour que ton code soit une suite d'appels de fonction et qu'il n'y ai pas d'allé retour compliqué entre while(1) continue break et les if else if.

Augmenter l'encapsulation