Bonjour à tous j'ai fait un programme qui fonctionne mais je suis sur de pouvoir le racourcir sans savoir comment. Dans la consigne il dit de changer le ran() par le scanf_s mais du coup je ne comprends pas le nombreMystere ne sera plus aléatoire !?
Et si vous pouviez me guider pour racourcir le programme. Merci d'avance !
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char* argv[]) // equivalent de int main
{
const MIN = 1;
int nombreEntre = 0, nombreMystere = 0, compteurCoup = 0, recommencer = 0, MAX = 0, niveau = 0, nbJoueurs = 0;
printf("Quel niveau de difficultée choisissez vous ?\n 1 entre 1 et 100\n 2 entre 1 et 1000\n 3 entre 1 et 10000\n");
scanf_s("%d", &niveau);
switch (niveau)
{
case 1:
MAX = 100;
break;
case 2:
MAX = 1000;
break;
case 3:
MAX = 10000;
break;
}
printf("Tapez le nombre de joueurs (1 ou 2) ?\n");
scanf_s("%d", &nbJoueurs);
if (nbJoueurs == 1)
{
do
{
do
{
srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
// On demande le nombre
printf("Quel est le nombre ? ");
scanf_s("%d", &nombreEntre);
// On compare le nombre entré avec le nombre mystère
if (nombreMystere > nombreEntre)
printf("C'est plus !\n\n");
else if (nombreMystere < nombreEntre)
printf("C'est moins !\n\n");
else
printf("Bravo, vous avez trouve le nombre mystere en %d coups!!!\n\n", compteurCoup);
compteurCoup++;
} while (nombreEntre != nombreMystere);
printf("Voulez vous recommencer ? \n Tapez 0 pour oui ou 1 pour arrêter \n");
scanf_s("%d", &recommencer);
} while (recommencer == 0);
printf("Merci d'avoir jouer\n");
}
else
{
int nombreMystere = 0, nombreMystere1 = 0, nombreMystere2 = 0, nombreEntre1 = 0, nombreEntre2 = 0, compteurCoup1 = 0, compteurCoup2 = 0;
do
{
srand(time(NULL));
nombreMystere1 = (rand() % (MAX - MIN + 1)) + MIN;
nombreMystere2 = (rand() % (MAX - MIN + 1)) + MIN;
do
{
// On demande le nombre
printf("Quel est le nombre (joueur1)? ");
scanf_s("%d", &nombreEntre1);
// On compare le nombre entré avec le nombre mystère
if (nombreMystere1 > nombreEntre1)
printf("C'est plus !\n\n");
else if (nombreMystere1 < nombreEntre1)
printf("C'est moins !\n\n");
else
printf("Bravo, joueur 1 vous avez trouve le nombre mystere en %d coups!!!\n\n", compteurCoup1);
compteurCoup1++;
} while (nombreEntre1 != nombreMystere1);
do
{
// On demande le nombre
printf("Quel est le nombre (joueur2)? ");
scanf_s("%d", &nombreEntre2);
// On compare le nombre entré avec le nombre mystère
if (nombreMystere2 > nombreEntre2)
printf("C'est plus !\n\n");
else if (nombreMystere2 < nombreEntre2)
printf("C'est moins !\n\n");
else
printf("Bravo,joueur 2 vous avez trouve le nombre mystere en %d coups!!!\n\n", compteurCoup2);
compteurCoup2++;
} while (nombreEntre2 != nombreMystere2);
printf("Voulez vous recommencer ? \n Tapez 0 pour oui ou 1 pour arrêter \n");
scanf_s("%d", &recommencer);
} while (recommencer == 0);
printf("Merci d'avoir jouer\n");
}
return 0;
}
Dans la consigne il dit de changer le ran() par le scanf_s mais du coup je ne comprends pas le nombreMystere ne sera plus aléatoire !?
Je suppose, que c'est pour le mode deux joueurs, car dans ce cas c'est un joueur qui saisie le nombre à chercher et l'autre qui doit le trouver.
Entre parenthèses, il ne faut appeler srand qu'une seule fois lors de l’exécution du programme.
On voit bien qu'il y a du code qui se répète dans ton code, dans ce cas oui tu peux effectivement le raccourcir. Surtout qu'il se répète trois fois pour deux modes.
Raccourcir un programme n'est pas très important. La taille d'un programme influe seulement sur son poids sur le disque (et encore là on parle de quelques ko) et peut-être aussi sa rapidité à être lu par l'ordinateur (de presque rien). Concentre toi plutôt sur un code lisible qu'un code court car un code court n'est pas forcément lisible tandis qu'un code lisible est bien souvent court (je penses à des fonctions d'abstraction pour un lib).
Quelques petits trucs pour améliorer la lisibilité de ton code :
- "MAX" n'est pas un bon nom de variable, pour moi c'est soit une constante soit un define alors que MAX est ni const ni un define
- Les booléens sont la vie (stdbool.h), cela donne plus de sens à "recommencer"
Aussi fait attention avec scanf et ses cousins car si tu attends un %d et que l'utilisateur t'envoie un %s alors le programme plante. Il est bien de protéger ses inputs utilisateurs car comme dit dans le cours du zestedusavoir.com : "l'utilisateur est un idiot".
pour commencer il faut savoir voir les choses simples. Ton switch ligne 13 peut tenir en une ligne :
Si tu regardes bien, la valeur max est directement dépendante du niveau de difficulté, la base est 10 puis on ajoute autant de zéro que la difficulté choisie 1-> 10 0 ; 2-> 10 00 ; 3->10 000, facile d'en conclure que :
max = 10* pow(10.0, niveau); //10* 10^niveau
Ensuite, on n'écrit jamais 2 fois la même chose. Tu as écris 3 fois la même chose... Donc on écrit une fois du code et si quelque chose doit changer entre 2 boucles, alors tu as identifié une variable.
Tables et boucles sont la solution.
Comme l'a souligné Rouloude ton mode 2 joueurs ne répond pas aux instructions de l'exercice. Mais en guise d'indice, le nombre de joueur n'intervient que lors de la définition du nombre à trouver.
Me revoilà. J'ai beaucoup d'erreur de syntaxe dont certaine je n'arrive pas à debuger à commencer par le fin et certaine que l'on ne peux faire comme utiliser des fonctions dans des if. J'ai pas encore les connaissance pour faire autrement. Donc je vais continuer le cour mais j'aimerais avoir à nouveaux votre avis. D'avance merci.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
nombreJoueurs(nbJoueurs)
{
int nbJoueurs = 0, joueurs = 0;
printf("Tapez le nombre de joueurs (1 ou 2) ?\n");
scanf_s("%d", &nbJoueurs);
if nbJoueurs == 1
joueurs = 1;
if nbJoueurs == 2
joueurs = 2;
return joueurs;
}
int main(int argc, char* argv[]) // equivalent de int main
{
const int MIN = 1;
int nombreEntre = 0, compteurCoup = 0, recommencer = 0, max = 0, niveau = 0;
printf("Quel niveau de difficultée choisissez vous ?\n 1 entre 1 et 100\n 2 entre 1 et 1000\n 3 entre 1 et 10000\n");
scanf_s("%d", &niveau);
switch (niveau)
{
case 1:
max = 100;
break;
case 2:
max = 1000;
break;
case 3:
max = 10000;
break;
}
do (nombreJoueurs() == 1 || nombreJoueurs() == 2)
{
int nombreMystere = 0,
srand(time(NULL));
nombreMystere = (rand() % (max - MIN + 1)) + MIN;
}while (nombreJoueurs() != 1 || nombreJoueurs() != 2);
if (nombreJoueurs() == 1 || nombreJoueurs() == 2)
{
do
{
// On demande le nombre
printf("Quel est le nombre ? ");
scanf_s("%d", &nombreEntre);
// 1 joueur
if (nombreJoueurs() == 1 || nombreMystere > nombreEntre)
printf("C'est plus !\n\n");
else if (nombreMystere < nombreEntre)
printf("C'est moins !\n\n");
else
printf("Bravo, vous avez trouve le nombre mystere en %d coups!!!\n\n", compteurCoup);
compteurCoup++;
//2 joueurs
for (nombreJoueurs() = 0, nombreJoueurs() = 2, nombreJoueurs()++);
{
printf("nombreJoueurs()");
if (nombreMystere > nombreEntre;)
printf("C'est plus !\n\n");
else if (nombreMystere < nombreEntre)
printf("C'est moins !\n\n");
else
printf("Bravo, vous avez trouve le nombre mystere en %d coups!!!\n\n", compteurCoup);
compteurCoup++;
}
printf("Voulez vous recommencer ? \n Tapez 0 pour oui ou 1 pour arrêter \n");
scanf_s("%d", &recommencer);
} while (recommencer == 0);
printf("Merci d'avoir jouer\n");
}
return 0;
}
- Edité par Benjodubois 5 septembre 2020 à 10:37:50
Re bonjour j'ai fait un imprim écran pour le debugage car je ne comprends les 2 premières (dernière) erreurs. Si vous pouviez m'aider...
2 premières (dernière) ? premières ou dernières, faut savoir ! Normalement il faut les prendre dans l'ordre, car la première peut provoquer le signalement d'erreur suivante qui n'en sont pas.
Tu as essayé de faire une fonction, il faudrait tout de même regarder le cours a ce sujet, car il y a des règles pour écrire une fonction. Elle doivent avoir un type de retour, ses paramètres doivent aussi avoir un type
int nombreJoueurs(int nbJoueurs)
{
//...
aussi, le paramètre fait parti des variables locale à la fonction, tu ne peux donc pas déclarer une variable du même nom que le paramètre.
Dans le cas de ta fonction, le paramètre est inutile car tu désir juste que la fonction te retourne le nombre de joueur que tu as saisie.
De plus tu te complique la vie avec tes if pour retourner le nombre de joueurs. tu peux le retourner directement. Tu peux éventuellement faire une boucle avec un test si tu veux limiter le nombre de joueur.
Visiblement tu compiles en C++, changes l'extension en .c.
Apres tu fait des erreurs entre virgule et point-virgule (genre ligne 40). Pour la ligne 38 la syntaxe du do...while est à revoir.
Mais si on oublie la syntaxe il ne faut pas que tu appelles la fonction pour avoir le nombre de joueur plusieurs fois par partie, tu l'appelles une fois et tu stocke le resultat dans une variable (int nbDeJoueur = nombreJoueurs() ) puis tu utilises la variable.
Mais ne te force pas à utiliser des fonctions si tu ne sais pas faire.
Il serait bien de se mettre au booléen assez rapidement. Quand je lis :
while(recommencer == 0);
Pour moi "recommencer" est un nombre alors que son nom traduit un état, ça n'a aucun sens. Avec un booléen c'est tout de suite plus claire (ou énum si l'état n'est pas binaire) :
while(recommencer == false);
// ou encore plus rapide
while(!recommencer);
Tout de suite on comprend l'utilité de cette variable : elle marque un état et ne stocke pas un nombre.
Le PO débute, il n'a peut-être pas encore vu les booléen ! Quand on débute on ne peut pas tout voir en même temps ! Comme on dit : chaque chose en son temps !
Le PO débute, il n'a peut-être pas encore vu les booléen ! Quand on débute on ne peut pas tout voir en même temps ! Comme on dit : chaque chose en son temps !
C'est la base... C'est même pas propre au langage, c'est de l'algorithmie !
L'algèbre de Boole, ça se fait en seconde pour les options TSA.
Après, il n'y a pas de quoi faire une fixette sur les booléens. Ils sont d'ailleurs devenus plutôt handicapants dans certains langages pour lesquels il valent absolument false ou true plutôt que 0 et pas 0.
Le type des variables n'a rien à voir avec l'algorithmie qui est un raisonnement à suivre, pas une méthode.
Si je fais :
int toto = getTotoFromUser(),
value;
if (toto)
value = 25;
else
value = 0;
C'est la même chose que :
bool toto = getTotoFromUser();
int value = toto * 25;
Même algo, différente méthode. toto pourrait tout aussi bien être un char ou un int_64 dans le premier cas, dans le second il DOIT être un bool ou un numérique dans [0,1].
Certains langages refusent le produit d'un booléen et d'un numérique.
× 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.
Bonhomme !! | Jeu de plateforme : Prototype.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Bonhomme !! | Jeu de plateforme : Prototype.