IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Pascal Discussion :

Jeu pierre feuille ciseaux : victoire mal détectée


Sujet :

Pascal

  1. #1
    Membre à l'essai Avatar de Zankou
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Points : 11
    Points
    11
    Par défaut Jeu pierre feuille ciseaux : victoire mal détectée
    Bonjour,

    voilà j'ai envie de faire un pierre feuille ciseaux, or j'ai un problème que je n'arrive pas trop à capter : en gros chaque signe est lié a une valeur (1,2 ou 3) et si vous lisez mon code vous pouvez comprendre comme le jeu marche (c'est assez simple à comprendre).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    program PFC;
    uses wincrt,crt;
    Var X,N,Compteur1,Compteur2,Choix:integer;
      Verif,MotJ,ChoixIA:string;
     
    begin
     
      Randomize;
      Verif:='';N:=0;Compteur1:=0;Compteur2:=0;
     
      WRITELN('                     Pierre Feuille ciseaux!');
      WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;
      WRITE('Voulez vous connaitre les ''regles'' ou ''jouer'' ? ');READLN(Verif);
     
      if (Verif='regles') then
         BEGIN
           Clrscr;
           WRITELN('Le jeux est tres connu');
           WRITELN('Le joueur choisit entre:');
           WRITELN('   -(1) la feuille');
           WRITELN('   -(2) la pierre');
           WRITELN('   -(3) les ciseaux');
           WRITELN('Le joueur indiquera donc le numero de l''element qu''il veut jouer.');
           WRITELN('La feuille enveloppe la pierre, la pierre casse les ciseaux, et les ciseaux coupent la feuille.');
           WRITELN('Le puit n''existant pas dans la version originale du jeu, il n''existe pas non plus ici.');
     
           WRITELN;
           WRITE('Voulez vous jouer ? ');READLN(Verif);
         end;
      if (Verif='jouer') then
         BEGIN
           Verif:='oui';
         end;
      Clrscr;
     
      While (Verif='oui') DO
            BEGIN
              X:=random(3)+1;
              WRITE('Faite votre choix: ');READLN(Choix);
     
              if ((X=1) and (Choix=3)) then
                 BEGIN
                   X:=3;
                   Choix:=1;
                 end;
              if ((X=3) and (Choix=1)) then
                 BEGIN
                   X:=1;
                   Choix:=3;
                 end;
     
              if (X=1) then
                 BEGIN
                   ChoixIa:='la feuille'
                 end;
              if (X=2) then
                 BEGIN
                   ChoixIa:='la pierre'
                 end;
              if (X=3) then
                 BEGIN
                   ChoixIa:='les ciseaux'
                 end;
     
              if (Choix=1) then
                 BEGIN
                   MotJ:='la feuille'
                 end;
              if (Choix=2) then
                 BEGIN
                   MotJ:='la pierre'
                 end;
              if (Choix=3) then
                 BEGIN
                   MotJ:='les ciseaux'
                 end;
     
              if (X>Choix) then
                 BEGIN
                   WRITELN('L''IA a choisit ',ChoixIA,' donc, ',MotJ,' gagne');
                   WRITE('Le joueur remporte donc la manche, voulez vous continuer ? ');READLN(Verif);
                   Compteur1:=Compteur1+1;
                   Compteur2:=Compteur2+1;
                   N:=N+1;
                   Clrscr;
                 end;
              if (X<Choix) then
                 BEGIN
                   WRITELN('L''IA a choisit ',ChoixIA,' donc, ',MotJ,' perd');
                   WRITE('Le joueur ne remporte donc pas la manche, voulez vous continuer ? ');READLN(Verif);
                   Compteur1:=0;
                   N:=N+1;
                   Clrscr;
                 end;
              if (X=Choix) then
                 BEGIN
                   WRITELN('L''IA a choisit ',ChoixIA,' et le joueur ',MotJ);
                   WRITE('Il y a donc match nul, voulez vous continuer ? ');READLN(Verif);
                   Compteur1:=0;
                   N:=N+1;
                   Clrscr;
                 end;
     
            end;
      WRITELN('Avant de quitter le jeu, un petit recapitulatif s''impose.');
      WRITELN('Le joueur a enchaine ',Compteur1,' avant de quitter la parite.');
      WRITELN('Mais il a aussi fait ',Compteur2,' avant de quitter la partie.');
      WRITELN('Le joueur a joue un total de ',N,' manches.');
     
     
     
    READLN;
    end.
    Voici mon code ci-dessus, le problème c'est que des fois il m'affiche que le joueur a perdu, alors qu'il est censé avoir gagné.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Le problème c'est que la différence de grandeur entre les trois nombres n'a rien à voir avec leur puissance dans le jeu.

    Il n'y a pas seulement trois cas à examiner, mais neuf.

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    11
    12
    13
    21
    22
    23
    31
    32
    33

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 442
    Points : 5 862
    Points
    5 862
    Par défaut
    Salut

    C'est surtout que tu modifies ta variable avant de contrôler.

    Regarde le code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        if ((X=1) and (Choix=3)) then
        BEGIN
           X:=3;
           Choix:=1;
        END;
     
        if ((X=3) and (Choix=1)) then
        BEGIN
           X:=1;
           Choix:=3;
        end;
    J'ai un peu reorganisé ton code pour plus de clarté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    program PFC;
    uses wincrt,crt;
    Var X,N,Compteur1,Compteur2,Choix:integer;
      Verif,MotJ,ChoixIA:string;
     
     
     
    Procedure EcranAceuil ;
    BEGIN
      WRITELN('                     Pierre Feuille ciseaux!');
      WRITELN;
      WRITELN;
      WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;
      WRITE('Voulez vous connaitre les (R)egles ou (J)ouer ? ');
    END; 
     
    Procedure EcranAide ;
    BEGIN
      Clrscr;
      WRITELN('Le jeux est tres connu');
      WRITELN('Le joueur choisit entre:');
      WRITELN('   -(1) la feuille');
      WRITELN('   -(2) la pierre');
      WRITELN('   -(3) les ciseaux');
      WRITELN('Le joueur indiquera donc le numero de l''element qu''il veut jouer.');
      WRITELN('La feuille enveloppe la pierre, la pierre casse les ciseaux, et les ciseaux coupent la feuille.');
      WRITELN('Le puit n''existant pas dans la version originale du jeu, il n''existe pas non plus ici.');
      WRITELN;
      WRITE('Voulez vous (J)ouer ? ');
    END; 
     
    Fonction DonneLibel(Aval : Integer) : String;
    BEGIN
       CASE Aval OF 
    	  1 : RESULT:='la feuille';
          2 : RESULT:='la pierre';
          3 : RESULT:='les ciseaux';
      END;
    END;
    Procedure EcranFin(Cpt1,Cpt2,Nb : Integer);
    BEGIN
      WRITELN('Avant de quitter le jeu, un petit recapitulatif s''impose.');
      WRITELN('Le joueur a enchaine ',Cpt1,' avant de quitter la parite.');
      WRITELN('Mais il a aussi fait ',Cpt2,' avant de quitter la partie.');
      WRITELN('Le joueur a joue un total de ',Nb,' manches.');
    END;
    ////////////////////////////////////////////////////////////////////////////////
    begin
      Randomize;
      Verif:='';
      N:=0;
      Compteur1:=0;
      Compteur2:=0;
      EcranAceuil; 
      READLN(Verif);
     
      if (Uppercase(Verif)='R') then // connaitre les regle
      BEGIN
        EcranAide;
    	READLN(Verif);
      end;
      if (Uppercase(Verif)='J') then
      BEGIN
        Verif:='O';
      end;
      Clrscr;
      While (Verif='O') DO
      BEGIN
         X:=random(3)+1;// Choix Robot
         WRITE('Faite votre choix: ');
    	 READLN(Choix);
     
        if ((X=1) and (Choix=3)) then
        BEGIN
           X:=3;
           Choix:=1;
        END;
     
    	 if ((X=3) and (Choix=1)) then
         BEGIN
           X:=1;
           Choix:=3;
        end;
     
        ChoixIa := DonneLibel(X) ;
    	MotJ    := DonneLibel(Choix) ;
     
        if (X>Choix) then
        BEGIN
          WRITELN('L''IA a choisit ',ChoixIA,' donc, ',MotJ,' gagne');
          WRITE('Le joueur remporte donc la manche, voulez vous continuer ? (O)/(N) ');READLN(Verif);
          Compteur1:=Compteur1+1;
          Compteur2:=Compteur2+1;
          N:=N+1;
          Clrscr;
        END
    	Else 
    	BEGIN
          If (X<Choix) then
          BEGIN
            WRITELN('L''IA a choisit ',ChoixIA,' donc, ',MotJ,' perd');
            WRITE('Le joueur ne remporte donc pas la manche, voulez vous continuer ? (O)/(N)');READLN(Verif);
            Compteur1:=0;
            N:=N+1;
            Clrscr;
          END
    	  ELSE // (X=Choix)
          BEGIN
            WRITELN('L''IA a choisit ',ChoixIA,' et le joueur ',MotJ);
            WRITE('Il y a donc match nul, voulez vous continuer ? (O)/(N) ');READLN(Verif);
            Compteur1:=0;
            N:=N+1;
            Clrscr;
          END;
        END;
      END;	
      EcranFin(Compteur1,Compteur2,N);
      READLN;
    end.

  4. #4
    Membre à l'essai Avatar de Zankou
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Roland Chastain: Oui j'avais bien conscience du fait qu'il y ait 9 possibilités, le problème (que je ne comprends toujours pas) est que même si je modifie leurs valeurs au bon moment, ça ne fonctionne toujours pas. Mais merci quand même.

    anapurna: Alors, merci du programme que tu as fait. Mais je dois le faire en application simple, ensuite je ne comprend pas vraiment comment fonctionne ton code et en quoi il est. Mais merci à toi d'avoir pris ton temps pour m'avoir répondu.

    Voici le "nouveau" code que j'ai fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    program PFC;
    uses wincrt,crt;
    Var X,N,Compteur1,Compteur2,Choix:integer;
      Verif,MotJ,ChoixIA:string;
     
    begin
     
      Randomize;
      Verif:='';N:=0;Compteur1:=0;Compteur2:=0;MotJ:='';
     
      WRITELN('                     Pierre Feuille ciseaux!');
      WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;
      WRITE('Voulez vous connaitre les ''regles'' ou ''jouer'' ? ');READLN(Verif);
     
      if (Verif='regles') then
         BEGIN
           Clrscr;
           WRITELN('Le jeux est tres connu');
           WRITELN('Le joueur choisit entre:');
           WRITELN('   -(1) la feuille');
           WRITELN('   -(2) la pierre');
           WRITELN('   -(3) les ciseaux');
           WRITELN('Le joueur indiquera donc le numero de l''element qu''il veut jouer.');
           WRITELN('La feuille enveloppe la pierre, la pierre casse les ciseaux, et les ciseaux coupent la feuille.');
           WRITELN('Le puit n''existant pas dans la version originale du jeu, il n''existe pas non plus ici.');
     
           WRITELN;
           WRITE('Voulez vous jouer ? ');READLN(Verif);
         end;
      if (Verif='jouer') then
         BEGIN
           Verif:='oui';
         end;
      Clrscr;
     
      While (Verif='oui') DO
            BEGIN
              X:=random(3)+1;
              WRITE('Faite votre choix: ');READLN(Choix);
     
     
     
              if (X=1) then
                 BEGIN
                   ChoixIa:='la feuille'
                 end;
              if (X=2) then
                 BEGIN
                   ChoixIa:='la pierre'
                 end;
              if (X=3) then
                 BEGIN
                   ChoixIa:='les ciseaux'
                 end;
     
              if (Choix=1) then
                 BEGIN
                   MotJ:='la feuille'
                 end;
              if (Choix=2) then
                 BEGIN
                   MotJ:='la pierre'
                 end;
              if (Choix=3) then
                 BEGIN
                   MotJ:='les ciseaux'
                 end;
     
              if ((X=1) and (Choix=3)) then
                 BEGIN
                   X:=3;
                   Choix:=1;
                 end;
              if ((X=3) and (Choix=1)) then
                 BEGIN
                   X:=1;
                   Choix:=3;
                 end;
     
              if (X>Choix) then
                 BEGIN
                   WRITELN('L''IA a choisit ',ChoixIA,' donc, ',MotJ,' gagne');
                   WRITE('Le joueur remporte donc la manche, voulez vous continuer ? ');READLN(Verif);
                   Compteur1:=Compteur1+1;
                   Compteur2:=Compteur2+1;
                   N:=N+1;
                   Clrscr;
                 end;
              if (X<Choix) then
                 BEGIN
                   WRITELN('L''IA a choisit ',ChoixIA,' donc, ',MotJ,' perd');
                   WRITE('Le joueur ne remporte donc pas la manche, voulez vous continuer ? ');READLN(Verif);
                   Compteur1:=0;
                   N:=N+1;
                   Clrscr;
                 end;
              if (X=Choix) then
                 BEGIN
                   WRITELN('L''IA a choisit ',ChoixIA,' et le joueur ',MotJ);
                   WRITE('Il y a donc match nul, voulez vous continuer ? ');READLN(Verif);
                   Compteur1:=0;
                   N:=N+1;
                   Clrscr;
                 end;
     
            end;
      WRITELN('Avant de quitter le jeu, un petit recapitulatif s''impose.');
      WRITELN('Le joueur a enchaine ',Compteur1,' avant de quitter la parite.');
      WRITELN('Mais il a aussi fait ',Compteur2,' avant de quitter la partie.');
      WRITELN('Le joueur a joue un total de ',N,' manches.');
     
     
     
    READLN;
    end.
    C'est basiquement le même avec quelques modifications, mais toujours la même erreur que j'ai finalement réussi a déterminer. Quand je fait feuille et que l'ordi fait ciseaux, il gagne, logique, mais quand je fais ciseaux et que lui fait feuille, il gagne, pas logique.

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    Vous avez bien compris, dites-vous, qu'il y a neuf possibilités mais vous n'en examinez toujours que trois (A plus petit que B, A égale B, A plus grand que B).

    Cependant, comme j'essayais de l'expliquer, la différence de grandeur entre les nombres n'a aucun rapport avec le fait que l'un ou l'autre soit gagnant. Il n'y a que dans le cas de l'égalité que votre méthode fonctionne. Pour les autres cas, il faut les examiner un par un. Si le joueur a choisi pierre et que l'ordinateur a choisi feuille, alors...

    Inverser la valeur des variables ne servirait qu'à déplacer l'erreur.

  6. #6
    Membre à l'essai Avatar de Zankou
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Comme je l'ai dit j'ai compris qu'il n'y avait 9 cas mais, et j'ai oublié de le préciser, je ne m'interesse qu'aux sortis donc soit le joueur perd, soit il gagne, soit il y a match nul. J'ai effectivement fait un autre programme qui gére donc les cas, mais j'aimerais faire un programme qui gère les sortis

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Zankou Voir le message
    soit le joueur perd, soit il gagne, soit il y a match nul.
    Cela en fonction de neuf combinaisons différentes. Lesquelles ?

    Pour la dernière fois, les opérateurs "plus petit que" et "plus grand que" ne vous sont d'aucune utilité.

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 442
    Points : 5 862
    Points
    5 862
    Par défaut
    Salut

    @ZANKOU : pour info ton programme est en Pascal et le code que je t'ai fourni est, ô miracle, aussi en Pascal... J'utilise simplement des facilités de ce langage pour que le code ne devienne pas comme des spaghetti entremêlés qui se terminent immanquablement par une incompréhension du code.

    @Roland Chastain : je ne comprends pas tes 9 solutions.
    Tu as deux intervenants qui on trois choix possibles mais tu ne peux avoir que 3 solutions :

    • soit le joueur 1 bat le joueur 2 ;
    • soit le joueur 2 bat le joueur 1 ;
    • soit le joueur 1 est égal au joueur 2.

    Après tu as effectivement 9 combinaisons possibles mais la valorisation des éléments ne te donne que 3 solutions possibles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    1-1  => egale
    1-2  => 2 Bat 1
    1-3  => 2 Bat 1
    2-1  => 1 Bat 2
    2-2  => egale
    2-3  => 2 Bat 1
    3-1  => 1 Bat 2
    3-2  => 1 Bat 2
    3-3  => egale
    Tu n'as pas d'autres solutions, le problème ne vient pas de là.
    En fait on ne sait pas ce qui ne marche pas chez lui
    Quand je vois ce genre de code qui ne sert à rien je me dis que la personne ne comprend pas ce qu'elle fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        if ((X=1) and (Choix=3)) then // ici on inverse c'est a dire que malgré le bon choix tu perd
        BEGIN
           X:=3;
           Choix:=1;
        end;
        if ((X=3) and (Choix=1)) then // et ensuite içi tu inverse ce que tu viens de faire 
        BEGIN
            X:=1;
            Choix:=3;
        end;

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    @anapurna

    Si, le problème vient de là, puisque les neuf combinaisons sont ramenées arbitrairement à trois cas qui n'ont aucun rapport avec le sujet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (X>Choix) then
    BEGIN
    end;
    if (X<Choix) then
    BEGIN
    end;
    if (X=Choix) then
    BEGIN
    end;
    Apparemment je n'arrive pas à me faire comprendre. Je ne veux pas non plus donner la solution toute faite. Je vais prier pour vous, là c'est tout ce qui reste à faire.

    Le code inutile que tu pointes du doigt est, je pense, une tentative maladroite pour corriger les résultats de cette méthode.

    D'ailleurs, dans ton pseudo-code, tu traites bien séparément les neuf combinaisons, ce qui est la bonne méthode.

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 442
    Points : 5 862
    Points
    5 862
    Par défaut
    Salut

    Je ne dois pas me faire comprendre non plus. ^^
    X est un Random déterminant donc le choix de l'ordinateur Choix est une valeur entre 1 et 3 de l'utilisateur.

    La résultante est bien la différence entre X et choix, quel que soit le sens des variables c'est bien la confrontation des deux valeurs qui détermine celui qui gagne ou pas.

    Bon le nom des variables n'est pas super parlant mais que tu dises (X > Choix) ou (Choix < X) pour moi cela est équivalent.

    Je reprends donc mes neuf possibilités :
    X - Choix
    1 - 1 => x=Choix (3)
    1 - 2 => (X < Choix) ou (Choix > X) (1)
    1 - 3 => (X < Choix) ou (Choix > X) (1)
    2 - 1 => (X > Choix) ou (Choix < X) (2)
    2 - 2 => x=Choix (3)
    2 - 3 => (X < Choix) ou (Choix > X) (1)
    3 - 1 => (X > Choix) ou (Choix < X) (2)
    3 - 2 => (X > Choix) ou (Choix < X) (2)
    3 - 3 => x=Choix (3)
    Nous n'avons que trois cas résultants possibles :
    cas (1) => (X < Choix) L'ordinateur Gagne
    cas (2) => (X > Choix) l'utilisateur Gagne
    cas (3) => (X = Choix) la partie est nulle
    J'avoue ne pas comprendre ta façon de voir, n’étant pas mathématicien de formation il me manque sûrement quelques neurones bien placés pour dénouer ta logique.

    Par contre pour son problème... il faut qu'il vérifie que x et choix soient dans l’intervalle 1..3.

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    @anapurna

    Un est plus petit que deux et il est aussi plus petit que trois. Pourtant, contre l'un il gagne, et contre l'autre il perd. Qu'en penses-tu ?

  12. #12
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 442
    Points : 5 862
    Points
    5 862
    Par défaut
    Salut

    Je comprends mieux, on ne parle pas de la logique programmée mais de la logique du jeu.
    C'est-à-dire que la pierre est supérieure aux ciseaux mais inférieure à la feuille qui elle-même est inférieure aux ciseaux.

    Disons qu'effectivement pour ce genre de logique il faut utiliser une table de vérité, en abcisse l'utilisateur et en ordonnée l'ordinateur et dans cette table on donne les différents cas.

    PS : mais pour info ce n’était pas sa question.

  13. #13
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    @anapurna

    Cette fois nous sommes d'accord. D'ailleurs la façon dont tu expliques les choses m'a donné une idée.

  14. #14
    Membre à l'essai Avatar de Zankou
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Bon je vois que la discussion a donné quelques chose de productif, merci beaucoup. Finalement on m'a dit que juste faire un ChiFuMi ne servait pas à grand chose, il fallait en faire un avec un ordi imbattable et malheureusementt je vais encore devoir chercher pendant longtemps merci d'avoir résolu mon problème, merci à vous deux !!

  15. #15
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    @Zankou

    Nous n'avons rien résolu du tout puisque votre programme ne fonctionne toujours pas.

    L'idée d'un adversaire imbattable à un jeu de pur hasard est ridicule. Si quelqu'un vous a dit ça, il s'est moqué de vous.

    Ou alors c'est que l'ordinateur triche et choisit sa réponse en fonction de celle de l'utilisateur. Ce pourrait être un prolongement intéressant de l'exercice (quand la première partie aura été résolue).

  16. #16
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    Allez, moi j'ai trouvé une solution, dont je vous livre la clé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
        case barba of
          1:
            case papa of
              1: (* ? *);
              2: (* ? *);
              3: (* ? *);
            end;
          2:
            case papa of
              1: (* ? *);
              2: (* ? *);
              3: (* ? *);
            end;
          3:
            case papa of
              1: (* ? *);
              2: (* ? *);
              3: (* ? *);
            end;
    Ou une variante plus compacte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        case 10 * barba + papa of
          11, 22, 33: (* ? *);
          12, 23, 31: (* ? *);
          13, 21, 32: (* ? *);
        end;

  17. #17
    Membre à l'essai Avatar de Zankou
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Par rapport à l'ordi on m'a dit que les choix se faisaient avec des tableaux de probabilités. Mon professeur me l'avait dit puisqu'il l'a aussi fait quand il était en licence.
    Ensuite j'ai pas vraiment compris votre solution, pourriez vous l'expliquer ?

  18. #18
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    Depuis le début je vous explique la même chose mais vous ne voulez pas me croire. Les opérateurs < et > ne sont pas appropriés pour savoir à qui revient la victoire. C'est là le principal défaut du code que vous avez proposé. Il ne pourra jamais fonctionner. Faites-le sur le papier, vous allez voir, ça ne marche pas.
    Donc comment faire ? La première solution qui vient à l'esprit, c'est de traiter une par une les neuf combinaisons, ce qui pourrait se faire par exemple de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    const
      CHOSE: array[1..3] of string = ('pierre', 'feuille', 'ciseaux');
     
    var
      u, m: integer; { Utilisateur, Machine }
     
    begin
      Randomize;
      WriteLn('Commandes');
      WriteLn('  1 pierre');
      WriteLn('  2 feuille');
      WriteLn('  3 ciseaux');
      WriteLn('  0 quitter');
      repeat
        Write('Votre choix ? ');
        ReadLn(u);
        if u = 0 then
          exit;
     
        m := Random(3) + 1;
     
        WriteLn(CHOSE[u], ' contre ', CHOSE[m]);
     
        case u of
          1:
            case m of
              1: WriteLn('0-0');
              2: WriteLn('0-1');
              3: WriteLn('1-0');
            end;
          2:
            case m of
              1: (* ? *);
              2: (* ? *);
              3: (* ? *);
            end;
          3:
            case m of
              1: (* ? *);
              2: (* ? *);
              3: (* ? *);
            end;
        end;
      until FALSE;
    end.
    Voilà, je ne peux pas mieux faire.

    P.-S. À part vous mettre encore un pouce rouge pour votre passivité. Voilà, c'est fait.

  19. #19
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    Ou sinon, plus simple, une table (comme l'a proposé anapurna).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const
      ...
      VAINQUEUR: array[1..3] of integer = (2, 3, 1);
     
    begin
      ...
        if u = m then
          WriteLn('0-0')
        else if u = VAINQUEUR[m] then
          WriteLn('1-0')
        else
          WriteLn('0-1');
    Ou une formule magique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        else if (u = Succ(m)) or (u = 1) and (m = 3) then

  20. #20
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 490
    Points
    15 490
    Billets dans le blog
    9
    Par défaut
    Peut-être serait-il plus simple d'utiliser un type énuméré au lieu de nombres, comme dans cet exemple en C, qui ne devrait pas être très difficile à traduire en Pascal.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    enum fcp { feuille, ciseaux, pierre };
    enum wld { win, loose, draw };
     
    // Fonction qui verifie le jeu du joueur A par rapport à celui du joueur B.
    wld verify( fcp A, fcp B ) {
      if( A == B )
        return draw;
      else if( A == feuille && B == pierre  ||
               A == ciseaux && B == feuille ||
               A == pierre  && B == ciseaux )
        return win;
      else
        return loose;
    }

Discussions similaires

  1. Pierre Feuille Ciseaux JS
    Par Uisge Beatha dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 24/08/2018, 14h30
  2. pierre papier ciseaux shell
    Par Phoenix2025 dans le forum Linux
    Réponses: 9
    Dernier message: 31/03/2009, 14h02
  3. Aide : Jeu feuille, cailloux, ciseau.
    Par noquioz dans le forum Tkinter
    Réponses: 12
    Dernier message: 01/05/2008, 23h50
  4. Pierre Feuille Ciseaux
    Par Wilvart dans le forum C++
    Réponses: 12
    Dernier message: 20/08/2006, 13h19
  5. [Conception] Concevoir le jeu Pierre Feuille Ciseau
    Par websurfeur dans le forum Général Java
    Réponses: 14
    Dernier message: 17/03/2006, 19h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo