Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Aide] Un pierre, papier, ciseau

Pas à pas

    28 octobre 2007 à 19:28:21

    Bonsoir !

    Après mon topic expliquant comment procéder pas à pas pour le plus ou moins: Dispo ici, je me suis dis que de vous expliquer un autre petit jeu pouvez être amusant autant pour moi que pour vous :)

    A qui s'adresse ce tp ?
    -> Aux personnes qui ont finis le tp du plus ou moins et ayant vu les fonctions
    -> Aux personnes ayant vu les chaines de caractère ou plus.

    Note: Si vous en êtes à la SDL, passez votre chemin ça va être trop simple pour vous :p
    Note2: dans mon code j'utilise les chaines de caractères si vous n'avez pas vu cela ce n'est pas grave je donnerais une alternative très simple ;)


    Un problème ?


    Si vous rencontrez un problème il faut à tout prix regarder ce que votre compilateur vous dit !

    Mon compilateur ne trouve pas d'erreur et mon code plante !

    Votre compilateur n'est pas convenablement réglé, on va donc le régler maintenant :)

    Dans Code::Blocks:
    Settings -> Compiler -> (onglet) compiler -> (onglet) other options -> (coller ceci) -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -> OK -> CTRL F11

    Et voyez enfin ce que votre compilateur vous repproche :)


    En avant !


    Cahier des charges:
    DEBUT
       DEMANDE à l'utilisateur de choisir entre les 3
       CALCULE un choix pour l'ordinateur
       AFFICHE (chaine ou condition pour ceux qui n'ont pas vu les chaines) ce que l'ordinateur et l'utilisateur ont choisis
       AFFICHE qui a gagné (via une fonction
       DEMANDE si l'utilisateur veut refaire une partie
    FIN


    Je vous conseille de coder par vous-mêmes puis de revenir voir la solution si ça bloque.
    Vous aurez besoin de time.h pour le choix de l'ordi.


    It's Showtime !


    Un bon départ


    On va partir de ce code-ci:
    int main(void)
    {
        int choix = 0, choixCOM = 0, continuer = 1;
        const char *elements[] = {"pierre", "papier", "ciseaux"};
    // tableau de chaine, si vous n'avez pas vu les chaines passez ce bout de code
     
        srand(time(NULL));
        choixCOM = (rand() % (2 - 0 + 1)) + 0;
     
        printf("Programme: (jeux) Pierre, papier, ciseaux.\n\n");
        printf("0. Pierre\n1. Papier\n2. Ciseaux\n");
     
    return 0;
    }
    


    attardons nous sur ça :
    choixCOM = (rand() % (2 - 0 + 1)) + 0;
    

    Vous l'avez sûrement utilisé avec le jeu du plus ou moins sous la forme d'un Max et d'un Min, ici on en a pas besoin on peut écrire directement la valeur dedans car elle ne changera pas. On part donc de 0 pour aller à 2 (soit 3 possibilités):
    0. Pierre
    1. Papier
    2. Ciseaux


    On y va :pirate:


    Ensuite nous allons demander à l'utilisateur son choix (pas trop dur :p ):
    scanf("%d", &choix);
    

    Or si le gros balour n'a pas compris que c'était entre 0 et 2 inclus et qu'il vous sort un -3 ou 7 bah tout plante, comment évitez cela? Utilisez Anti-Kévin v.1.14.1 comme ceci :p
    do {
            printf("Votre choix: ");
            scanf("%d", &choix);
            } while (choix < 0 && choix > 2);
    

    ce qui donne:
    Votre choix: -3
    Votre choix: 6
    Votre choix: 3
    Votre choix:

    Pris au piège :diable:

    Maintenant qu'on un noob qui sait ce qu'il note il ne reste plus qu'à afficher ce qu'il a choisi et celui de l'ordi:
    printf("vous avez choisi: %s et l'ordinateur: %s\n",elements[choix], elements[choixCOM]);
    

    Pour les personnes n'ayant pas vu les chaines vous devez procéder ainsi: condition (si choix == ...) alors.. Oui c'est long mais il faut faire comme ça pour toutes les solutions ;p


    Maintenant c'est bien beau mais faut dire qui a gagné et qui a perdu !

    La fonction gagne


    Soyons logique pour cette fonction. Ce qu'on va faire: une fonction qui renvoi un entier et on utilise cette entier pour définir si oui on non l'utilisateur a gagné.
    Ce qui donne:
    FONCTION qui renvoi 0 si égalité, 1 si perdu et 2 si gagné
    La fonction sera une suite de condition
    On l'utilise dans un switch


    Pour l'égalité c'est simple !
    Si choix = choixCom alors renvoi 0


    Ensuite vous pouvez choisir de faire perdu avec les 3 possibilités (utilisez les opérateurs && et || )

    Puis pour le dernier pas besoin d'un else if, fait un else car il y a pas d'autre solution ;)

    CODEZ ! :p

    Voici ma fonction (par soucis de place j'ai utilisé des noms de variables super cours !)
    Secret (cliquez pour afficher)
    int gagne(int j, int c)
    {
        if (j == c)
        return 0;
     
        else if ((j == 0 && c == 1) || (j == 1 && c == 2) || (j == 2 && c == 0))
        return 1;
     
        else
        return 2;
    }
    


    Il ne reste plus qu'à l'utiliser dans un switch comme ceci:
    Secret (cliquez pour afficher)
    switch(gagne(choix,choixCOM))
        {
            case 0:
            printf("Egalite\n\n");
            break;
     
            case 1:
            printf("Perdu!\n\n");
            break;
     
            case 2:
            printf("Gagne!\n\n");
            break;
        }
    

    Et voilà !

    J'ai tout de suite lancé la fonction dans le switch, c'est peut-être nouveau pour vous c'est pour ça que je préfère le préciser ! vous auriez pu faire ainsi aussi:
    int resultat = gagne(choix, choixCom);
    switch (resultat)
    {
    
    mais c'est plus long et inutile :p


    On a fait le plus gros !
    Il ne reste plus qu'une condition boléenne qui demande si le joueur veut recommencer ou pas et ajoutez diverses choses inutiles genre:
    printf("Code By MonPseudoDeFou © 2007");
    

    avec tout un tas de décoration abusive si cela vous chante :)


    Pour ma part ma version me suffit emplement:

    Code en entier commenté


    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int gagne(int j, int c)
    {
        if (j == c)
        return 0;
     
        else if ((j == 0 && c == 1) || (j == 1 && c == 2) || (j == 2 && c == 0))
        /* littéralement:
        sinon si joueur prend pierre ET computer prend papier
        OU    si joueur prend papier ET computer prend ciseaux
        OU    si joueur prend ciseaux ET computer prend pierre
        alors on renvoi 1 = perdu
        */
        return 1;
     
        else
        /*
        si pas égalité et pas perdu alors c'est gagné
        (pas besoin de faire des conditions unitiles: y a pas d'autre choix)
        */
        return 2;
    }
     
    int main(void)
    {
        int choix = 0, choixCOM = 0, continuer = 1;
        const char *elements[] = {"pierre", "papier", "ciseaux"};
        // tableaux de chaines (ou tableau à 2 dimensions)
     
        srand(time(NULL));
     
        while(continuer)
        {
            choixCOM = (rand() % (2 - 0 + 1)) + 0;
            // on le place dans la boucle pour pas avoir le même chiffre dans une autre partie
            system("cls");
            // efface l'écran (SEULEMENT sous windows)
     
            printf("Programme: (jeux) Pierre, papier, ciseaux.\n\n");
        printf("0. Pierre\n1. Papier\n2. Ciseaux\n");
     
        do {
            printf("Votre choix: ");
            scanf("%d", &choix);
            } while (choix < 0 && choix > 2);
            // sécurise le scanf
     
     
        printf("\n\n");
        printf("vous avez choisi: %s et l'ordinateur: %s\n",elements[choix], elements[choixCOM]);
        // affiche les choix
     
        switch(gagne(choix,choixCOM))
        { // prend ce que renvoi la fonction 0, 1 ou 2
            case 0:
            printf("Egalite\n\n");
            break;
     
            case 1:
            printf("Perdu!\n\n");
            break;
     
            case 2:
            printf("Gagne!\n\n");
            break;
        }
     
        printf("Une nouvelle partie?\n0. Non\n1. Oui!");
        scanf("%d", &continuer);
        }
     
     
     
            return 0;
    }
    

    (solution pour ceux ayant vu les chaines)

    Citation : Pas de titre

    Project : Console application
    Compiler : GNU GCC Compiler (called directly)
    Directory : C:\Documents and Settings\Mwa\Mes documents\Jules Butes\CC++\Exercices\pierre papier ciseaux\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    Linking console executable: C:\Documents and Settings\Mwa\Mes documents\Jules Butes\CC++\Exercices\pierre papier ciseaux\console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 0 warnings



    tadaaaaaaaaaaaaaaaaa :p:p
    C'était pas dur avouez !

    Améliorations !


    On en a pas fini :pirate:
    * Un mode 2 joueurs ? Soyons fou !
    * Faire une IA de salop :lol: Si le joueur rentre ciseaux alors l'ordinateur ne pourra rentrer que: ciseaux ou pierre, en gros égalité ou perdu pour l'utilisateur :lol:


    FIN


    C'est fini ! N'hésitez pas à me donner vos avis, commentaires, etc c'est ce qui m'a donné l'envi de faire ce topic ;) Et aussi en voyant que mon autre topic d'aide avait atteint 700 visites :p
    Il n'est pas dit que ce topic ne soit pas édité.

    A plus tard pour d'autres petits programmes ;)

    a+ les zéros !


    • Partager sur Facebook
    • Partager sur Twitter
      28 octobre 2007 à 20:15:59

      Quand j'appuie sur 1 pour recommancer, l'ordi chosie toujours la même chose ...
      aussi ton compilo n'est pas bien réglé, à la lign srand il devrait y avoir un warning

      warning C4244: 'argument' : conversion de 'time_t' en 'unsigned int', perte possible de données


      Pour y remedier :

      1. srand((unsigned)time(NULL));


      Pour le system("cls"):, tu aurais put faire un ifdef plus haut

      enfin erreur très fréquente met le rand dans la boucle principale !
      • Partager sur Facebook
      • Partager sur Twitter
        28 octobre 2007 à 20:54:46

        Edité merci par contre je préfère garder le code de matéo pour le chiffre aléatoire pour pas destabiliser les débutants et aussi car je ne vois pas ce que ça change (je ne comprends pas ta modif en gros).
        • Partager sur Facebook
        • Partager sur Twitter
          28 octobre 2007 à 21:25:00

          Je vais mis mettre de suite, un exercice en plus ne peut jamais faire de mal!
          • Partager sur Facebook
          • Partager sur Twitter
            29 octobre 2007 à 10:06:47

            Aussi pour ceux qui ont vu le préprocesseur, tu peut mettre des ifdef pour savoire si ils sont sur linux/windows et pour le srand le warning est explicite,

            Sinon bon exercice, bel initative, c'est vrai que ça peut faire un bon tp d'entrainement après le plus ou moins ;)
            • Partager sur Facebook
            • Partager sur Twitter
              29 octobre 2007 à 10:09:33

              En option de compilation j'ai ceci:

              Citation : Pas de titre

              -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes



              Ca me semblait être la meilleure solution, peux-tu me proposer la tienne et m'expliquer la réelle différence?
              Sinon pour les conditions des préprocesseurs je vais l'ajouter aux améliorations ;)
              Et merci pour ton merci ( :p ), j'ai pensé que c'était un bon exercice surtout au niveau de la fonction (condition comme dans un jeu plus évolué).


              Citation : FeNiX57

              Je vais mis mettre de suite, un exercice en plus ne peut jamais faire de mal!



              N'hésite pas à nous montrer ta solution :) !!
              • Partager sur Facebook
              • Partager sur Twitter
                29 octobre 2007 à 10:22:35

                Dsl, je n'utilise pas gcc, j'utilise visual avec warning niveaux 4 ( très serrés )

                Sinon je crois bien que tu as des optimisations (-O2), je sais plus ou mais j'ai vu que c'est déconseillé. (Incompatible avec le debugger mais dîte moi si je me plante).

                Aller trouve nous un autre jeu a réaliser, un bien dure cette fois ;):p
                • Partager sur Facebook
                • Partager sur Twitter
                  21 novembre 2007 à 21:10:17

                  lorsqu'on debug, on n'utilise pas -O2
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [Aide] Un pierre, papier, ciseau

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown