Texas Instrumens "pierre-feuille-ciseaux" sur TI-82


  • O

    Bonjour, j'essaie de créer un algorithme pour jouer a pierre-feuille-ciseaux pour deux joueurs,sur un même appareil, jusqu’à ce qu'un des deux obtienne 5 points(je sais, ça ne sert pas à grand chose, mais j'ai vraiment envie d'en finir...), mais une partie de l'algorithme ne marche pas. Le voici:

    :0→A  
    :0→B  
    :While A≠5 ou B≠5  
    :Input X  
    :Disp " "  
    :Disp " "  
    :Disp " "  
    :Disp " " }tout ces espaces sont pour éviter qu'un joueur voit ce qu'a choisi l'autre joueur  
    :Disp " "  
    :Disp " "  
    :Disp " "  
    :Input Y  
    :If X=1  
    :Disp "X:PIERRE"  
    :If X=2  
    :Disp "X:FEUILLE"  
    :If X=3  
    :Disp "X:CISEAUX"  
    :If Y=1  
    :Disp "Y:PIERRE"  
    :If Y=2  
    :Disp "Y:FEUILLE"  
    :If Y=3  
    :Disp "Y:CISEAUX"  
    :If X=1 et Y=1  
    :Disp "EGALITE"  
    :If X=1 et Y=2  
    :Disp "Y:GAGNE"  
    :B+1→B  
    :If X=1 et Y=3  
    :Disp "X:GAGNE"  
    :A+1→A  
    :If X=2 et Y=1  
    :Disp "X:GAGNE"  
    :A+1→A  
    If X=2 et Y=2  
    :Disp "EGALITE"  
    :If X=2 et Y=3  
    :Disp "Y:GAGNE"  
    :B+1→B  
    :If X=3 et Y=1  
    :Disp "Y:GAGNE"  
    :B+1→B  
    :If X=3 et Y=2  
    :Disp "X:GAGNE"  
    :A+1→A  
    If X=3 et Y=3  
    :Disp "EGALITE"  
    :End  
    :If A=5  
    :Disp "X:GAGNE(fin)"  
    :If B=5  
    :Disp "Y:GAGNE(fin)"  
    

    Il y a surement une façon plus simple que celle que j'ai utilisé, mais j'ai du faire avec mes maigres connaissances(et internet, mais ça aide pas beaucoup!). Tout marche, sauf au moment où un joueur a 5 fois, la partie continue comme si A ou B n'était jamais égales à 5, ou que si mais que la boucle recommençait indéfiniment. j'essaie depuis plusieurs jours de résoudre ce problème mais aucunes solution ne me vient, alors si vous avez une idée ou besoin d'explication n’hésitez pas, merci!

    (et désolé pour les fautes d'orthographes, je fais de mon mieux)


  • mtschoon

    Bonjour,

    Je ne vais guère t'aider vu que je n'ai pas de TI 82.

    Je regarde seulement ce que tu as indiqué.

    La 3ème ligne ne va pas.

    Tu as écrit
    Citation
    :While A≠5 ou B≠5

    Le "ou" ne convient pas car le programme doit tourner tant que A et B sont différents de 5

    C'estA≠5 AND B≠5 qu'il faut mettre car je suppose de ta calculette parle anglais, sinon, en français, il faudrait même ET.

    Tu peux déjà rectifier cette erreur.

    Quelque chose me parait bizarre vers la fin, à partir deIf A=5

    En logique informatique, on utiliseIf...Then...Else ...et on termine par End.

    Je me demande comprend bien ce que tu veux dire...
    Je te conseille de revoir cela avec la notice de ta TI82.

    J'espère qu'un propriétaire de TI82 passera pas là.


  • O

    Bonjour, j'ai remplacé le "ou" par "et", puis modifié la fin, voila ce que ça donne:

    :0→A  
    :0→B  
    :While A≠5 et B≠5  
    :Imput X  
    :Disp " "  
    :Disp " "  
    :Disp " "  
    :Disp " " }tout ces espaces sont pour éviter qu'un joueur voit ce qu'a choisi l'autre joueur  
    :Disp " "  
    :Disp " "  
    :Disp " "  
    :Imput Y  
    :If X=1  
    :Disp "X:PIERRE"  
    :If X=2  
    :Disp "X:FEUILLE"  
    :If X=3  
    :Disp "X:CISEAUX"  
    :If Y=1  
    :Disp "Y:PIERRE"  
    :If Y=2  
    :Disp "Y:FEUILLE"  
    :If Y=3  
    :Disp "Y:CISEAUX"  
    :If X=1 et Y=1  
    :Disp "EGALITE"  
    :If X=1 et Y=2  
    :Disp "Y:GAGNE"  
    :B+1→B  
    :If X=1 et Y=3  
    :Disp "X:GAGNE"  
    :A+1→A  
    :If X=2 et Y=1  
    :Disp "X:GAGNE"  
    :A+1→A  
    If X=2 et Y=2  
    :Disp "EGALITE"  
    :If X=2 et Y=3  
    :Disp "Y:GAGNE"  
    :B+1→B  
    :If X=3 et Y=1  
    :Disp "Y:GAGNE"  
    :B+1→B  
    :If X=3 et Y=2  
    :Disp "X:GAGNE"  
    :A+1→A  
    If X=3 et Y=3  
    :Disp "EGALITE"  
    :End  
    :If A=5  
    :Then  
    :Disp "X:GAGNE(FIN)"  
    :Else  
    :Disp "Y:GAGNE(FIN)"  
    :End  
    

    J'ai essayé aussi plusieurs formations de la dernière boucle, mais rien ne change...
    Mais merci quand même de m'avoir aidé.


  • mtschoon

    Attention : Il faut que tu remplaces OU par AND (qui veut dire "et" en anglais)

    Tu dois écrire

    : While A≠5 and B≠5
    

    La fin me parait bonne maintenant.

    Par contre, j'ignore si ta calculette comprend tous ces"If"successifs...


  • O

    J'ai déjà remplacé Ou par Et, et pour tout les If, j'ai déjà fait plusieurs algorithme avec des tonnes de If, Then, et autre et je n'ai eu aucun problème.

    Je me demandais aussi d’où venait le problème, si c’était que A ou B n'avaient jamais la valeur 5, ou que lorsqu'ils l'avaient, la fin de l'algorithme ne se déclenchait pas.

    J'ai ajouté un :Disp A quand X gagne ( quand X=1 et Y=3) pour voir ce qu'il ce passait,et il ne s'affichait plus que ce qu'avait choisis les deux joueurs(soit X:PIERRE et Y:CISEAU) mais pas le X:GAGNE, et ensuite A s'affichait, donc il y avait écrit 1. La deuxième Tout était pareil sauf que A était égal a 4, et la troisième fois a 7

    Au moins maintenant je sais quels problèmes je dois résoudre: A et B ne sont jamais égales a 5, car lorsque 1 doit s'ajouter a la valeur de A ou B, ça ne marche pas toujours (et au passage que le X:GAGNE et le Y:GAGNE disparaissent on ne sais ou...)
    Et voila la petite modification que j'ai faite pour afficher A(commence à la ligne 30):

    :If X=1 et Y=3  
    :Disp "X:GAGNE"  
    :A+1→A  
    :Disp A  
    :if .....
    

  • T

    Pour une condition If, si tu veux executer plus de 1 instructions dans cette condition, tu dois mettre Then et End.
    Exemple:

    If X=1 et Y=3:Then  
    

    ou

    If X=1 et Y=3  
    Then  
    puis tes instructions  
    et enfin:  
    End  
    

    Donc avec ton code juste au dessus dans ton dernier message:

    If X=1 et Y=3:Then  
    Disp "X:GAGNE"  
    A+1→A  
    End  
    

    Et tu mets le Disp A apres tout ces tests, comme ça, tu n'as besoin d'en mettre qu'un seul.

    Ensuite, pour eviter d'avoir a faire Disp "" plein de fois (tu n'es meme pas oblige de mettre un espace), il te suffit de mettre in ClrHome ou EffEcran.

    Donc ton code corrige:

    :0→A  
    :0→B  
    :While A≠5 et B≠5  
    :Input X  
    :EffEcran  
    :Input Y  
    :If X=1  
    :Disp "X:PIERRE"  
    :If X=2  
    :Disp "X:FEUILLE"  
    :If X=3  
    :Disp "X:CISEAUX"  
    :If Y=1  
    :Disp "Y:PIERRE"  
    :If Y=2  
    :Disp "Y:FEUILLE"  
    :If Y=3  
    :Disp "Y:CISEAUX"  
    :If X=1 et Y=1  
    :Disp "EGALITE"  
    :If X=1 et Y=2:Then  
    :Disp "Y:GAGNE"  
    :B+1→B  
    :End  
    :If X=1 et Y=3:Then  
    :Disp "X:GAGNE"  
    :A+1→A  
    :End  
    :If X=2 et Y=1:Then  
    :Disp "X:GAGNE"  
    :A+1→A  
    :End  
    :If X=2 et Y=2  
    :Disp "EGALITE"  
    :If X=2 et Y=3:Then  
    :Disp "Y:GAGNE"  
    :B+1→B  
    :End  
    :If X=3 et Y=1:Then  
    :Disp "Y:GAGNE"  
    :B+1→B  
    :End  
    :If X=3 et Y=2:Then  
    :Disp "X:GAGNE"  
    :A+1→A  
    :End  
    :If X=3 et Y=3  
    :Disp "EGALITE"  
    :Disp A,B  
    :End  
    :If A=5  
    :Disp "X:GAGNE(fin)"  
    :If B=5  
    :Disp "Y:GAGNE(fin)"  
    

    Et voici un code (tres) optimise (20 ligne contre 54 pour la version au dessus, donc pratiquement divise par 3):

    :{0,0→L1  
    :Repeat 5=max(L1  
    :EffEcran  
    :Input X  
    :EffEcran  
    :Input Y  
    :For(A,1,2  
    :sub("XY",A,1  
    :Disp Rep+":"+sub("PIERRE FEUILLECISEAUX",7expr(Ans)-6,7  
    :End  
    :(X=Y+1 or X=Y-2)+2*(X=Y-1 or X=Y+2->V  
    :If V:Then  
    :Disp sub("XY",V,1)+":GAGNE  
    :Disp sub("YX",V,1)+":PERD  
    :1+L1(V→L1(V  
    :Else  
    :Disp "EGALITE  
    :End  
    :End  
    :Disp sub("XY",V,1)+":GAGNE(fin)  
    

    Voila, si tu as encore des questions, n'hésite pas 🙂


Se connecter pour répondre