Amelioration du programme

Fermé
krdishak Messages postés 4 Date d'inscription lundi 27 juillet 2020 Statut Membre Dernière intervention 7 août 2020 - 7 août 2020 à 15:06
 ViolentViolette - 8 août 2020 à 15:57
Bonjour,

Aujourd’hui je veux améliorer mon programme qui consiste a donner les opérations à calculer afin d'améliorer le calcule mental

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>TD : Jeu du "plus ou moins"</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<script type="text/javascript">
<!--

function nb1_aleatoire(min, max)
{
var nb1 = min + (max-min+1)*Math.random();
return Math.floor(nb1);
}
function nb2_aleatoire(min, max)
{
var nb2 = min + (max-min+1)*Math.random();
return Math.floor(nb2);
}

function PoM_manche(min, max)
{
var nb1 = nb1_aleatoire(min, max); // nb1 a deviner
var nb2 = nb2_aleatoire(min, max); // nb2 a deviner
var nb3 = nb1 + nb2; // nb3 a calculer
var cps = 0; // nb de coups pour la trouver
var saisie ; // nb tape par le joueur
var msg = "L'operation a calculer est\n" +nb1+ '+' +nb2+ '=' ;

do
{
saisie = prompt(msg);

// si "Annuler"
if(saisie == null)
return 0;

cps++;
if(saisie > nb3)
msg = "C'est moins";
else
msg = "C'est plus";
}
while(saisie != nb3);

return cps;
}

function PoM_partie(min, max)
{
var cps = 0; // nb de manches jouees
var best_score = 0; // meilleur score
var score; // score de la partie en cours
var continuer;

do
{
score = PoM_manche(min, max); // joue la manche
if(score)
{
cps++;
if(score < best_score || best_score == 0)
best_score = score;
continuer = confirm("Bravo, tu as gagne en " + score + " coups.\n Veux-tu rejouer ?");
}
else
continuer = false;
}
while(continuer);

alert("Tu as joue " + cps + " manche(s).\n Ton meilleur score est de " + best_score + " coups.");
return best_score;
}

//-->
</script>

</head>
<body>

<p>
<a href="#" onclick="javascript:PoM_partie(1, 63)">Niveau Zér0</a><br />
<a href="#" onclick="javascript:PoM_partie(1, 100)">Niveau Normal</a><br />
<a href="#" onclick="javascript:PoM_partie(1, 250)">Niveau Geek</a>
</p>

</body>
</html>

Pour améliorer ce programme je veux mettre une boucle (for) qui répète certain nombre d'opérations avant d'afficher le score final. sauf que je ne sais pas où il faut mettre ma boucle.
Aussi je veux faire changer les operations d'une maniere aleatoir entre ( + , - , * , / ) pour ca j'ai tenté quelque chose qui n'a pas marché malheureusement.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>TD : Jeu du "plus ou moins"</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<script type="text/javascript">
<!--

function nb1_aleatoire(min, max)
{
var nb1 = min + (max-min+1)*Math.random();
return Math.floor(nb1);
}
function nb2_aleatoire(min, max)
{
var nb2 = min + (max-min+1)*Math.random();
return Math.floor(nb2);
}

function PoM_manche(min, max)
{
var nb1 = nb1_aleatoire(min, max); // nb1 a deviner
var nb2 = nb2_aleatoire(min, max); // nb2 a deviner
var nb3 = nb1 + nb2; // nb3 a calculer
var cps = 0; // nb de coups pour la trouver
var saisie ; // nb tape par le joueur
var msg = "l'operation a calculer est\n" +nb1+ '+' +nb2+ '=' ;

var nb1 = nb1_aleatoire(min, max); // nb1 a deviner
var nb2 = nb2_aleatoire(min, max); // nb2 a deviner
var nb3 = nb1 - nb2; // nb3 a calculer
var cps = 0; // nb de coups pour la trouver
var saisie ; // nb tape par le joueur
var msg = "l'operation a calculer est\n" +nb1+ '-' +nb2+ '=' ;

var nb1 = nb1_aleatoire(min, max); // nb1 a deviner
var nb2 = nb2_aleatoire(min, max); // nb2 a deviner
var nb3 = nb1 * nb2; // nb3 a calculer
var cps = 0; // nb de coups pour la trouver
var saisie ; // nb tape par le joueur
var msg = "l'operation a calculer est\n" +nb1+ '*' +nb2+ '=' ;

var nb1 = nb1_aleatoire(min, max); // nb1 a deviner
var nb2 = nb2_aleatoire(min, max); // nb2 a deviner
var nb3 = nb1 / nb2; // nb3 a calculer
var cps = 0; // nb de coups pour la trouver
var saisie ; // nb tape par le joueur
var msg = "l'operation a calculer est\n" +nb1+ '/' +nb2+ '=' ;

do
{
saisie = prompt(msg);

// si "Annuler"
if(saisie == null)
return 0;

cps++;
if(saisie > nb3)
msg = "C'est moins";
else
msg = "C'est plus";
}
while(saisie != nb3);

return cps;
}

function PoM_partie(min, max)
{
var cps = 0; // nb de manches jouees
var best_score = 0; // meilleur score
var score; // score de la partie en cours
var continuer;

do
{
score = PoM_manche(min, max); // joue la manche
if(score)
{
cps++;
if(score < best_score || best_score == 0)
best_score = score;
continuer = confirm("Bravo, tu as gagne en " + score + " coups.\n Veux-tu rejouer ?");
}
else
continuer = false;
}
while(continuer);

alert("Tu as joue " + cps + " manche(s).\n Ton meilleur score est de " + best_score + " coups.");
return best_score;
}

//-->
</script>

</head>
<body>

<p>
<a href="#" onclick="javascript:PoM_partie(1, 63)">Niveau Zér0</a><br />
<a href="#" onclick="javascript:PoM_partie(1, 100)">Niveau Normal</a><br />
<a href="#" onclick="javascript:PoM_partie(1, 250)">Niveau Geek</a>
</p>

</body>
</html>

là le programme me donne que des opérations de "/".

Merci d'avance.

2 réponses

jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
7 août 2020 à 16:35
Merci de bien vouloir éditer ton message pour y mettre ( tel que je te l'avais demandé...) Les balises de code.
0
Salut,
euh pour "améliorer" il faut déjà que ce soit fait et fonctionnel.
Cela n'a pas l'air le cas si vous dites qu'il est incomplet...et avec des erreurs.
Côté amélioration une toute simple est déjà d'écrire un fichier externe chargé par la balise script dans la page. ça à des aspects pratiques comme de bien séparer le script de l'affichage HTML/CSS et permet de pouvoir utiliser le même script dans différents contextes/pages, ou une partie du script: toutes les fonctions seront disponibles dans les pages que l'on veut en chargeant le script externe.

Plus sur l'aspect technique vous pouvez regarder du côté des paradigmes de programmation comme la programmation fonctionnelle et la programmation orientée objet qui sont très utilisés(et très pratique).
Il y a aussi les "design pattern" ou en français "modèles de conception" mais je ne pense pas que ce soit des notions qui correspondent à votre niveau. En tout cas si on parle "d'amélioration" coté code il faut en passer par là(mais bien sûr avec les bases du langage et de l'algorithmique).

"qui répète certain nombre d'opérations avant d'afficher le score final. sauf que je ne sais pas où il faut mettre ma boucle. "
Le type de boucle alors ne change rien que ce soit for ou while ou autre chose tant que ça boucle ça changera la syntaxe et la façon de faire. D'ailleurs les boucles et les itérations c'est l'un des principes essentiel en programmation.

Un exemple de boucle for :
for (let i = 0; i<10 ; i++)//-- condition de la boucle
{//-- contenu de la boucle, il sera donc effectué de 0 à 9 soit 10 fois
console.log('répétition ou \'tours\' de boucle : '+i+' un nombre aléatoire : '+nb1_aleatoire(0,100));
}



De toute évidence votre programme ne fonctionne pas...
Vous devez commencer par réparer vos erreurs qui seront indiqués dans la console du navigateur. Commencez par chercher celle sur chaque ligne et la comprendre pour la corriger.

Vous n'avez aussi rien compris au fonctions...
POUR RAPPEL
une fonction est composée outre du nom qui permet de l'appeler d'aucun ou un ou plusieurs paramètres ( entre les parenthèses ) qui seront obligatoirement des valeurs (contenues dans des variables ou non) et de la partie appelé corps qui contient ce que fait la fonction.
Hors dans votre programme vous écrivez 2 fonctions complétement identiques...
1)Ce qui est totalement inutile, pas une erreur mais une perte de temps et un ajout de complexité inutile au programme.
2)Pire encore vous n'appliquez pas les fonctions correctement.

Pour corriger 1 ou plutôt optimiser ce qui est mal fait:
function nombreAleatoire(min,max){//-- renvoi un entier positif aléatoire entre min et max
return min+Math.floor(Math.random()*(max-min+1));
/** remarquez l'imbrication: floor arrondit le résultat aléatoire qui est au centre. Contrairement au français qui se lit de gauche à droite de façon linéaire le JavaScript se lit de l'intérieur vers l'extérieur ainsi:
 la fonction "nombreAleatoire" qui est entre les parenthèses de la fonction .floor est appliquée puis renvoi son résultat en tant que <gras>paramètre</gras> de la fonction .floor

Vous pouvez aussi remarquer la notation pointée Math.floor qui utilise le point "." comme séparateur et indique un la <gras>méthode</gras> floor de <gras>l'objet</gras> Math
bien sûr ça ne change pas les priorités d'un calcul arithmétique, celui ci étant niché dans son contexte.
*/
}
//-- une fonction ça sert à être utilisé
var nombre1 = nombreAleatoire(0, 100); // un entier entre 1 et 100
var nombre2 = nombreAleatoire(50, 30000); // un entier entre 51 et 30000

//-- pour "voir" les valeurs des variables c'est pratique de les afficher
console.log('LE HASARD FAIT LES CHOSES:');
console.log('entier de 1 à 100 =  '+nombre1+' et ici de 51 à 30000 = '+nombre2);

/** vous pouvez utiliser autant de fois la fonction que vous voulez, elle fera ce pour quoi elle est conçue , c'est 'un moule' qui sert à être réutilisé pour obtenir un résultat(pas de gâteau pour l'instant):
*/
for(let i=0;i<10;i++){
console.log('boucle tour '+i+'\t valeur aléatoire (0 à '+(10+i)+') => '+nombreAleatoire(0,10+i));
}



Voir bien entendu la définition et syntaxe d'une fonction (où visiblement vous avez du mal) , l'utilisation d'une fonction ou instance d'une fonction que vous confondez il me semble avec la fonction elle même(l'application ou résultat d'un outil n'est pas l'outil , la fonction est un outil qui est faite pour un but voire plusieurs).
La notion de portée des variables(c'est où je parlais d'imbrication, chaque "niche" et indépendante et ne communique pas avec les autres, sauf en utilisant return ) voire de ce qu'est la temporalDeadZone (zone temporelle morte) si vous voulez vraiment acquérir des bases solides.

Je serais vous vu l'état pitoyable et le manque de correction de votre script tout bugué je reprendrais tout de 0 en commençant par une recherche "JavaScript débutant" dans votre moteur de recherche préféré.
Vous vous approchez et c'est pas mal pour un début mais il vous manque encore des notions basiques essentielles.
0