Codecademy 9/9

Fermé
rwandael Messages postés 4 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 19 juillet 2016 - 19 juil. 2016 à 14:10
 tomahwang - 20 juil. 2016 à 15:31
Bonjour,

Je suis nouveau sur ce forum et en javascript que j'apprends avec le site codecademy

Je n'ai pas trouvé de réponse satisfaisante à mon problème sur leur forum. C'est pourquoi je vous sollicite.

Il y a un ensemble d'exercices où il faut créer un jeu "pierre, feuille, ciseaux" contre l'ordinateur. Jusque là, pas de problèmes.

ensuite, il nous est suggéré de tenter différentes choses :

- transformer le jeu en rajoutant lézard et spock. OK
- envoyer un message d'erreur si le joueur entre un mot qui n'est pas dans choix. OK
- proposer de rejouer si le résultat est une égalité

C'est sur le troisième point que j'ai des problèmes. Les solutions proposées sur le forum de codecademy proposent toutes d'utiliser des boucles sauf qu'à ce stade des cours, on n'est pas censé connaître les boucles.

J'ai donc eu l'idée de recréer un jeu "pierre, feuille, ciseaux" dans le code à exécuter si le joueur et l'ordinateur font une égalité mais ça ne marche pas. Je n'arrive pas à comprendre pourquoi.

Quelqu'un peut-il m'aider ? PS : soyez indulgent pour le code d'un néophyte complet en codage. Voici le code :

var choixUtilisateur = prompt("Choisissez-vous pierre, feuille, ciseaux, lézard ou spock ?");
var choixOrdi = Math.random();
if (choixOrdi < 0.21) {
choixOrdi = "pierre";
} else if(choixOrdi < 0.41) {
choixOrdi = "feuille";
} else if(choixOrdi < 0.61) {
choixOrdi = "ciseaux";
} else if(choixOrdi < 0.81) {
choixOrdi = "lézard";
} else {
choixOrdi = "spock";
}
console.log("Ordinateur : " + choixOrdi);
var comparer = function(choix1, choix2){
if (choix1 === choix2){
var choixUtilisateurbis = prompt("Choisissez-vous pierre, feuille, ou ciseaux ?");
var choixOrdibis = Math.random();
if (choixOrdibis < 0.34) {
choixOrdibis = "pierre";
} else if(choixOrdibis <= 0.67) {
choixOrdibis = "feuille";
} else {
choixOrdibis = "ciseaux";
} console.log("Ordinateur : " + choixOrdibis);
var comparerbis = function(choix3, choix4){
if (choix3 === choix4){
return "Egalité !";
}
else if (choix3 === "pierre"){
if (choix4 === "ciseaux"){
return "pierre gagne";
}
else {
return "feuille gagne";
}}
else if (choix3 === "feuille"){
if (choix4 === "pierre"){
return "feuille gagne";
}
else {
return "ciseaux gagnent";
}}
else if (choix3 === "ciseaux"){
if (choix4 === "pierre"){
return "pierre gagne";
}
else {
return "ciseaux gagnent";
}}};
comparerbis (choixUtilisateurbis, choixOrdibis);
}
else if (choix1 === "pierre"){
if (choix2 === "ciseaux" || choix2 === "lézard"){
return "pierre gagne";
}
else if (choix2 === "spock"){
return "spock gagne";
}
else {
return "feuille gagne";
}}
else if (choix1 === "feuille"){
if (choix2 === "pierre" || choix2 === "spock"){
return "feuille gagne";
}
else if (choix2 === "lézard"){
return "lézard gagne";
}
else {
return "ciseaux gagnent";
}}
else if (choix1 === "ciseaux"){
if (choix2 === "pierre"){
return "pierre gagne";
}
else if (choix2 === "lézard"){
return "ciseaux gagnent";
}
else if (choix2 === "spock"){
return "spock gagne";
}
else {
return "ciseaux gagnent";
}}
else if (choix1 === "lézard"){
if (choix2 === "spock" || choix2 === "feuille"){
return "lézard gagne";
}
else if (choix2 === "ciseaux"){
return "ciseaux gagnent";
}
else {
return "pierre gagne";
}}
else if (choix1 === "spock"){
if (choix2 === "ciseaux" || choix2 === "pierre"){
return "spock gagne";
}
else if (choix2 === "feuille"){
return "feuille gagne";
}
else {
return "lézard gagne";
}}
else if (choix1 !== "pierre" && choix1 !== "feuille" && choix1 !== "ciseaux" && choix1 !== "lézard" && choix1 !== "spock"){
confirm ("Votre choix n'a aucun sens");
}
};
comparer(choixUtilisateur, choixOrdi);
A voir également:

6 réponses

rwandael Messages postés 4 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 19 juillet 2016
19 juil. 2016 à 14:30
Bonjour ZackielHP,

A la fin du code, quand j'apelle la fonction comparer choix1 devient choixUtilisateur et choix2 devient choixOrdi.

En fait le jeu fonctionne jusqu'au moment où on fait une égalité : à ce moment là, il devient possible de faire un nouveau choix.

Le problème est que ce nouveau choix n'est pas comparé à celui de l'ordinateur
0
ZackielHP Messages postés 8 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 19 juillet 2016
19 juil. 2016 à 14:51
Oui j'ai vu qu'après en retapant ton code dans Codecademy ! Difficile visibilité sur CCM :p
0
ZackielHP Messages postés 8 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 19 juillet 2016
Modifié par ZackielHP le 19/07/2016 à 14:51
J'ai pas trouvé d'erreur dans ton code.. :/
Il semblerait que la comparaison(choix3, choix 4) ne se fasse pas. Aucune idée pourquoi..
0
ZackielHP Messages postés 8 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 19 juillet 2016
19 juil. 2016 à 15:17
J'ai réussi à résoudre ton problème, mais ça risque de pas te plaire :

Vu que la deuxième comparaison ne marchait pas (Je ne sais pas pourquoi.
Une erreur dans le code ? Une limite de JS ? ) bah je suis passé par une comparaison bête et simple.

C'est un peu plus long du coup, je commence le code avec la variable "comparer" et je ne fais que si ("choix1 === choix2")

var comparer = function(choix1, choix2){ 
if (choix1 === choix2){

console.log("Egalité !")

var choixUtilisateurbis = prompt("On relance ! Choisissez-vous pierre, feuille, ou ciseaux ?");
var choixOrdibis = Math.random();

if (choixOrdibis < 0.34) {
choixOrdibis = "pierre";
} else if(choixOrdibis <= 0.67) {
choixOrdibis = "feuille";
} else {
choixOrdibis = "ciseaux";
};

console.log("Ordinateur : " + choixOrdibis);
console.log("Utilisteur : " + choixUtilisateurbis);

if (choixOrdibis === choixUtilisateurbis){
console.log("Encore égalité !");
} else if (choixOrdibis === "feuille" && choixUtilisateurbis === "ciseaux") {
console.log("Ciseaux gagnent !");
} else if (choixOrdibis === "feuille" && choixUtilisateurbis === "pierre") {
console.log("Feuille gagne !");
} else if (choixOrdibis === "pierre" && choixUtilisateurbis === "ciseaux") {
console.log("Pierre gagne! ");
} else if (choixOrdibis === "pierre" && choixUtilisateurbis === "feuille") {
console.log("Feuille gagne! ");
} else if (choixOrdibis === "ciseaux" && choixUtilisateurbis === "pierre") {
console.log("Pierre gagne! ");
} else {
console.log("Ciseaux gagnent! ");
};
};
};

comparer(choixUtilisateur, choixOrdi)
0
rwandael Messages postés 4 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 19 juillet 2016
19 juil. 2016 à 15:23
Merci de ta réponse et surtout d'avoir passé du temps sur mon code.

Peut-être est-ce finalement du site codecademy que vient le problème ?

Étant vraiment débutant, je ne savais pas si mon code était bon ou non.

Si tu ne vois pas d'erreurs, je crois que je vais passer aux leçons suivantes et arrêter de bloquer sur celle-ci
0
ZackielHP Messages postés 8 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 19 juillet 2016
19 juil. 2016 à 15:30
Peut-être cela vient-il aussi du site !
Je ne sais pas je ne suis pas un pro du JS ^^

Mais pour avoir fais la plupart des cours de Codecademy ne tombe pas dans le piège de vouloir faire au mieux (Surtout quand ils vont te faire créer ta propre aventure) parce qu'après ils vont te faire découvrir une nouvelle fonctionnalité et tu vas être là :

"J'ai passé 1h à faire 100 lignes alors qu'avec ça j'aurais pu le faire en 10 minutes..."
(C'est du vécu :p)

Par exemple ton code avec les boucles ça aurait duré 5 minutes à faire !

Donc mon conseil c'est suit les cours en faisant le "minimum" et une fois que tu as tout fini, éclate-toi en utilisant tout ce que tu as appris ! :D
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rwandael Messages postés 4 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 19 juillet 2016
19 juil. 2016 à 15:29
Je viens de voir ton nouveau code et rassure-toi, ça ne me déplaît pas du tout.

Je bloque tellement sur cette leçon que j'ai vraiment besoin d'une nouvelle vision des choses et tu l'apportes.

Je vais essayer ça

Bonne journée à toi
0
ZackielHP Messages postés 8 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 19 juillet 2016
19 juil. 2016 à 15:31
No soucis !

Bonne journée aussi !
0
Salut,

pas de boucle et vous appelez comment la fonction if ?
C'est une boucle conditionnelle aussi appelé test logique mais bien une boucle.
C'est à dire qu'à l'intérieur des accolades de chaque if(si) on a des instructions, c'est la boucle.
S'il existe différents types de boucles ce que vous demandez est tout à fait possible avec seulement la boucle if...

Par exemple:

Si le résultat est joueur perds le pierre papier ciseau => afficher vous avez perdu, compter le résultat
Si le résultat est joueur gagne le pierre papier ciseau => afficher vous avez gagné, compter le résultat
Si le résultat est égalité =>afficher égalité, proposer un nouveau pierre papier ciseau

On est bien dans des boucles et le problème est bien un problème de réflexion avant qu'il soit de code.
Cela s'appelle l'algorithmique, un algorithme c'est la structure des éléments du programme(blocs d'instructions). Ici assez simple car tout est procédural(on a un départ définit et tout se fait de façon linéaire du dépaert à l'arrivée).

Concrètement en code en cas d'égalité il vous suffit de rajouter une instruction qui permet de refaire ce que vous avez fait.

Si dans l'exemple cité par Zackie écrire les 100 lignes de code n'était pas forcément nécessaire cela s’appelle de la pédagogie. En faisant cela et passant à la méthode suivante qui permet de réduire le nombre de lignes de codes à taper, la simplicité de fabrication et de lecture du programme est certainement acquise maintenant. Cela s'appelle une leçon et c'est la meilleure façon: tirer soi même l’apprentissage de l'expérience.
Donc les 100 lignes de code qui n'est rien du tout à taper en soi l'était uniquement pour montrer qu'il y a une meilleure façon, plus rapide et plus claire et simple et c'est quelque chose acquis par soi même donc mieux apprit que si on vous dit seulement faites ça parce que ceci et que vous devez le croire aveuglément.

L'informatique c'est fait pour se simplifier la vie. Les langages informatiques c'est avant tout une façon de penser(j'ai cité l'algorithmique mais il y a d'autres notions à comprendre) donc certainement pas une acquisition de savoir en faisant du recopier mais bien une méthode de pensée(pour aller plus loin d'analyse et de conception) avant tout.
0
pour le cas qui vous concerne peut être verrez vous les fonctions qui sont des blocs d'instructions auxquels on peut faire appel quand on le désire une fois ceux ci écrits, donc dans le cas d'une pierre papier ciseau l'instruction qui permet le choix du joueur et l'instruction qui permet le choix d'une réponse aléatoire de l'ordinateur peuvent être mis en "fonction" et donc utilisé de façon générique pour les "appeler"(utiliser) quand on le désire.

Mais peut être le cours prends le parti de vous faire réécrire celles ci pour vous montrer à quel point es fonctions sont des notions essentielles et indispensables de la programmation et le résultat obtenu en les utilisant par rapport à ne pas les utiliser.
Bref c'est l'apprentissage normal, et le meilleur comme déjà dit(voire le seul?) : tirer parti de vos erreurs ou méconnaissances par vous même plutôt que suivre bêtement un dogme imposé sans savoir pourquoi. Cela se nomme l'expérience et Zackie à eu l'expérience de 100 lignes écrites où il pouvait n'y en avoir que quelques unes à la place et à donc acquis non seulement la syntaxe et facilité de la solution meilleure que les 100 lignes et surtout le but de celles ci(éviter d'écrire des centaines de lignes quand une fonction peut faire plus rapide, simple et clair).
0