bonjour a tous, je suis nouveau en langage C, j'ai vraiment eu quelque difficulte a le faire marcher correctement. je suis ouvert au critique, surtout n'hesitez pas. Merci d'avance
ps: desole pour les accents ou autres fautes, je suis avec un clavier US (hahahaha).
voici mon code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char **argv)
{
int nombreMystere = 0, nombreEntre =0, choixDuNiveaux = 0, nombreDeJoueur = 0, nombreMystereChoisi = 0;
const int MIN = 1;
int max = 0;
int nouvellePartie = 1;
srand(time(NULL));
do // pour commencer la boucle generale
{
printf("Choissiez le nombre de joueur : 1 joueur ou 2 joueurs\n\n");
scanf("%d", &nombreDeJoueur);// choix du nombre de joueur
int coups = 0;
switch(nombreDeJoueur)// ceci commence le switch du choix du nombe de joueurs
{
case 1:// mode 1 joueur
printf("Choisis un niveau de difficulte:\n\n");
printf("1. Debutant: choisis un nombre entre 1 et 100\n");
printf("2. Intermediaire: choisis un nombre entre1 et 200\n");
printf("3. Veteran: choisis un nombre entre 1 et 300\n");
printf("4. Expert: choisis un nombre entre 1 et 400\n");
printf("5. Super Heros: choisis un nombre entre 1 et 500\n");
scanf("%d", &choixDuNiveaux);
printf("\n\n");
switch(choixDuNiveaux)
{
case 1:
printf("Tu as choisi le niveau debutant, c'est bien pour commencer \n\n");
max = 100;
break;
case 2:
printf("Ok, tu as choisi le niveau intermediaire, ca commence a devenir interessant\n\n");
max = 200;
break;
case 3:
printf("Oh ok, le cela deviens un peu plus amusant avec le niveau Veteran\n\n");
max = 300;
break;
case 4:
printf("Alors la, tu commence a me plaire avec ce niveau Expert !!!\n\n");
max = 400;
break;
case 5:
printf("Bon ca ne rigole plus maintenant, tu est en mode Super Heros !!!\n\n");
max = 500;
break;
default:
printf("Tu as choisi un niveau qui n'existe pas !!\n\n");
break;
}while(choixDuNiveaux < 1 || choixDuNiveaux > 5);// fin de boucle de choix de difficult
nombreMystere = (rand()%(max - MIN + 1)) + MIN; // generateur de nombre aleatoire
do // debut de la boucle pour trouver le nombre mystere
{
printf("please guess the number between %d and %d ?", MIN, max);
scanf("%d", &nombreEntre);
coups++;
if(nombreMystere>nombreEntre)
printf("it's more\n\n");
else if(nombreMystere<nombreEntre)
printf("it' less\n\n");
else
printf("Well done, you find the mystery number in %d tentatives!!\n\n", coups);
}while(nombreEntre!=nombreMystere);// fin de la boucle pour trouver nombre mystere
break;
case 2:// mode 2 joueurs
printf("Player 1, please choose a number\n");// je demande au premier joueur de choisir un nombre a deviner
scanf("%d", &nombreMystereChoisi);
do
{
printf("Player 2, try to find the number of player 1\n");// le 2eme joueur vas essayer de deviner le nombre mystere
scanf("%d", &nombreEntre);
coups++;
if(nombreMystereChoisi>nombreEntre)
printf("it's more\n\n");
else if(nombreMystereChoisi<nombreEntre)
printf("it's less\n\n");
else
printf("Well done player 2, you find the mystery number in %d tentatives!\n\n", coups);
}while(nombreEntre!=nombreMystereChoisi);
break;// ceci permet de fermer le switch(nombreDeJoueur)
}
printf("Do you want to try again ?\n");
printf("Yes = enter 1 \nNo = enter 0\n\n");
scanf("%d", &nouvellePartie);
printf ("\n\n");
if(nouvellePartie == 0)
printf("Thanks for playing with us !!\n\n");
}while(nouvellePartie == 1); // pour fermer la boucle generale.
return 0;
}
un truc un peu dérangeant pour l'utilisateur, c'est le mélange français/anglais ("cool il me parle français, euh attends, pourquoi il me parle anglais maintenant ???")
et la seule différence entre le mode 1 joueur et 2 joueurs c'est le mode de tirage du nombre mystère (+ une partie du texte), il doit y avoir moyen de factoriser ça (la boucle de jeu est la même (au texte près) on devrait ne l'avoir qu'une seule fois)
Je vais me faire détester par les pro ... Un bon programmeur est fainéant ... Ce n'est pas vrai, mais on s'arange pour coder le moins possible et ne pas dédoubler le code. Je verrais le jeu dans une fonction à laquelle tu passe le nombre mystère en paramètre. Pour la difficulté, j'éviterais personnellement le switch. Tu pourrais mettre tes messages dans un tableau: char message[5] = {"message 1", "message 2", ... }; Ça vaut autant pour le menu que pour les réponses. les choix pourraient être dans un tableau également: tableauChoix[5] = {100, 200, ...}; Tu fais: max = tableauChoix[choix-1]; Ce mode pourrait se trouver dans une fonction qui retourne la valeur de max. Quand je l'ai fait, j'ai été plus sadique pour l'utilisateur. Mes choix étaient 100, 1000, 10000, 100000, 1000000 ... et tu ne connais pas le maximum.
Le Tout est souvent plus grand que la somme de ses parties.
Hmmm, pas facile d'ooptimiser dans ces conditions. Il y a tout de même moyen de s'arranger pour n'avoir qu'une copie du jeu lui-même. si mode == 1 joueur je trouve le max avec le switch sinon c'est l'autre qui me donne le max à partir d'ici, je trouve le nombre mystère avec rand() et je joue la partiet
Le Tout est souvent plus grand que la somme de ses parties.
un truc un peu dérangeant pour l'utilisateur, c'est le mélange français/anglais ("cool il me parle français, euh attends, pourquoi il me parle anglais maintenant ???")
et la seule différence entre le mode 1 joueur et 2 joueurs c'est le mode de tirage du nombre mystère (+ une partie du texte), il doit y avoir moyen de factoriser ça (la boucle de jeu est la même (au texte près) on devrait ne l'avoir qu'une seule fois)
oui je sais je suis entrain de changer tous cela. je les fais dans les 2 langues pour tester ma copine qui apprend le francais.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char **argv)
{
int nombreMystere = 0, nombreEntre =0, choixDuNiveaux = 0, nombreDeJoueur = 0, nombreMystereChoisi = 0;
const int MIN = 1;
int max = 0;
int nouvellePartie = 1;
srand(time(NULL));
do // pour commencer la boucle generale
{
printf("Choissiez le nombre de joueur : 1 joueur ou 2 joueurs\n\n");
scanf("%d", &nombreDeJoueur);// choix du nombre de joueur
int coups = 0;
switch(nombreDeJoueur)// ceci commence le switch du choix du nombe de joueurs
{
do
{
case 1:// mode 1 joueur
printf("Choisis un niveau de difficulte:\n\n");
printf("1. Debutant: choisis un nombre entre 1 et 100\n");
printf("2. Intermediaire: choisis un nombre entre1 et 200\n");
printf("3. Veteran: choisis un nombre entre 1 et 300\n");
printf("4. Expert: choisis un nombre entre 1 et 400\n");
printf("5. Super Heros: choisis un nombre entre 1 et 500\n");
scanf("%d", &choixDuNiveaux);
printf("\n\n");
switch(choixDuNiveaux)
{
case 1:
printf("Tu as choisi le niveau debutant, c'est bien pour commencer \n\n");
max = 100;
break;
case 2:
printf("Ok, tu as choisi le niveau intermediaire, ca commence a devenir interessant\n\n");
max = 200;
break;
case 3:
printf("Oh ok, cela deviens un peu plus amusant avec le niveau Veteran\n\n");
max = 300;
break;
case 4:
printf("Alors la, tu commence a me plaire avec ce niveau Expert !!!\n\n");
max = 400;
break;
case 5:
printf("Bon ca ne rigole plus maintenant, tu est en mode Super Heros !!!\n\n");
max = 500;
break;
default:
printf("Tu as choisi un niveau qui n'existe pas !!\n\n");
break;
}
}while(choixDuNiveaux < 1 || choixDuNiveaux > 5);// fin de boucle de choix de difficulte
nombreMystere = (rand()%(max - MIN + 1)) + MIN; // generateur de nombre aleatoire
do // debut de la boucle pour trouver le nombre mystere
{
printf("Choisi un nombre entre %d et %d ", MIN, max);
scanf("%d", &nombreEntre);
coups++;
if(nombreMystere>nombreEntre)
printf("C'est plus !\n\n");
else if(nombreMystere<nombreEntre)
printf("C'est moins !\n\n");
else
printf("Bravo, vous avez trouvez le nombre mystere en %d tentatives!!\n\n", coups);
}while(nombreEntre!=nombreMystere);// fin de la boucle pour trouver nombre mystere
break;
case 2:// mode 2 joueurs
printf("Joueur 1, choisi un nombre\n\n");// je demande au premier joueur de choisir un nombre a deviner
scanf("%d", &nombreMystereChoisi);
do
{
printf("Joueur 2, essaye de trouver le nombre mystere\n");// le 2eme joueur vas essayer de deviner le nombre mystere
scanf("%d", &nombreEntre);
coups++;
if(nombreMystereChoisi>nombreEntre)
printf("C'est plus !\n\n");
else if(nombreMystereChoisi<nombreEntre)
printf("C'est moins !\n\n");
else
printf("Bravo joueur 2, vous avez trouvez le nombre mystere en %d tentatives!\n\n", coups);
}while(nombreEntre!=nombreMystereChoisi);
break;// ceci permet de fermer le switch(nombreDeJoueur)
}
printf("Veux-tu rejouer\n");
printf("Oui = tape 1 \nNon = tape 0\n\n");
scanf("%d", &nouvellePartie);
printf ("\n\n");
if(nouvellePartie == 0)
printf("Merci d'avoir jouer avec nous !!\n\n");
}while(nouvellePartie); // pour fermer la boucle generale.
return 0;
}
switch(nombreDeJoueur) { // ceci commence le switch du choix du nombe de joueurs
do {
case 1:// mode 1 joueur
est incorrecte … il ne faut rien mettre entre le switch et le premier case …
L'indentation est encore imparfaite (et c'est important de bien indenter). Il existe des outils qui permettent d'indenter correctement comme astyle. Certains IDE le propose aussi, et une indentation automatique est toujours 'dune grande utilité.
Il va falloir garder dans un coin de ton cerveau le fait que programmer (en C ou tout autre langage d'ailleurs) n'est pas uniquement pondre du code. C'est une démarche un peu plus complexe qui va la modélisation, à la production d'un exécutable en passant par des phases de tests (des outils permettent de t'aider), de debug (idem, savoir utiliser un debuger et un memory profiler est indispensable), de documentation, de packaging sans oublier les outils d'aide à l'intégration de bibliothèques tierces et des gestion du projet … mais bon ça c'est pour plus tard.
Étant donné qu'on n'a que deux situations, un ou deux joueurs, je pense que ce serait mieux avec un if if(un joueur) { je le fais avec le switch sur la difficulté } else { c'est l'autre qui me donne le max } tu n'as pas encore corrigé le fait d'avoir écrit le jeu en double. Une raison pour le faire est que le comportement pourrait être différent avec un ou deux joueurs si tu as un bug pour l'un des deux.
Le Tout est souvent plus grand que la somme de ses parties.
switch(nombreDeJoueur) { // ceci commence le switch du choix du nombe de joueurs
do {
case 1:// mode 1 joueur
est incorrecte … il ne faut rien mettre entre le switch et le premier case …
L'indentation est encore imparfaite (et c'est important de bien indenter). Il existe des outils qui permettent d'indenter correctement comme astyle. Certains IDE le propose aussi, et une indentation automatique est toujours 'dune grande utilité.
Il va falloir garder dans un coin de ton cerveau le fait que programmer (en C ou tout autre langage d'ailleurs) n'est pas uniquement pondre du code. C'est une démarche un peu plus complexe qui va la modélisation, à la production d'un exécutable en passant par des phases de tests (des outils permettent de t'aider), de debug (idem, savoir utiliser un debuger et un memory profiler est indispensable), de documentation, de packaging sans oublier les outils d'aide à l'intégration de bibliothèques tierces et des gestion du projet … mais bon ça c'est pour plus tard.
bon du coup, j'ai revu tous cela. desole mais je n'avais pas appris les fonctions. Voici mon code modifier.
merci encore pour vos conseil, et desole pour les erreurs, je suis un newbie en coding
code modifie:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int difficulte()
{
int choix = 0 ;
while(choix < 1 || choix > 5)
{
printf("Choisis un niveau de difficulte:\n\n");
printf("1. Debutant: choisis un nombre entre 1 et 100\n");
printf("2. Intermediaire: choisis un nombre entre1 et 200\n");
printf("3. Veteran: choisis un nombre entre 1 et 300\n");
printf("4. Expert: choisis un nombre entre 1 et 400\n");
printf("5. Super Heros: choisis un nombre entre 1 et 500\n");
scanf("%d", &choix);
if(choix < 1 || choix > 5)
{
printf("Tu as choisi un niveau qui n'existe pas, essaye encore !!\n");
}
}return choix;
}
int main(int argc, char **argv)
{
int nombreMystere = 0, nombreEntre =0, nombreDeJoueur = 0, nombreMystereChoisi = 0;
const int MIN = 1;
int max = 0;
int nouvellePartie = 1;
srand(time(NULL));
do // pour commencer la boucle generale
{
printf("Choissiez le nombre de joueur : 1 joueur ou 2 joueurs\n\n");
scanf("%d", &nombreDeJoueur);// choix du nombre de joueur
int coups = 0;
if (nombreDeJoueur == 1)
{
switch(difficulte())
{
case 1:
printf("Tu as choisi le niveau debutant, c'est bien pour commencer \n\n");
max = 100;
break;
case 2:
printf("Ok, tu as choisi le niveau intermediaire, ca commence a devenir interessant\n\n");
max = 200;
break;
case 3:
printf("Oh ok, cela deviens un peu plus amusant avec le niveau Veteran\n\n");
max = 300;
break;
case 4:
printf("Alors la, tu commence a me plaire avec ce niveau Expert !!!\n\n");
max = 400;
break;
case 5:
printf("Bon ca ne rigole plus maintenant, tu est en mode Super Heros !!!\n\n");
max = 500;
break;
default:
printf("Tu as choisi un niveau qui n'existe pas, essaye encore !!\n\n");
break;
}
nombreMystere = (rand()%(max - MIN + 1)) + MIN; // generateur de nombre aleatoire
do // debut de la boucle pour trouver le nombre mystere
{
printf("Choisi un nombre entre %d et %d\n", MIN, max);
scanf("%d", &nombreEntre);
coups++;
if(nombreMystere>nombreEntre)
printf("C'est plus !\n\n");
else if(nombreMystere<nombreEntre)
printf("C'est moins !\n\n");
else
printf("Bravo, vous avez trouvez le nombre mystere en %d tentatives!!\n\n", coups);
}while(nombreEntre!=nombreMystere);// fin de la boucle pour trouver nombre mystere
}
else if (nombreDeJoueur == 2)
{
printf("Joueur 1, choisi un nombre\n\n");// je demande au premier joueur de choisir un nombre a deviner
scanf("%d", &nombreMystereChoisi);
do
{
printf("Joueur 2, essaye de trouver le nombre mystere\n");// le 2eme joueur vas essayer de deviner le nombre mystere
scanf("%d", &nombreEntre);
coups++;
if(nombreMystereChoisi>nombreEntre)
printf("C'est plus !\n\n");
else if(nombreMystereChoisi<nombreEntre)
printf("C'est moins !\n\n");
else
printf("Bravo joueur 2, vous avez trouvez le nombre mystere en %d tentatives!\n\n", coups);
}while(nombreEntre!=nombreMystereChoisi);
}
printf("Veux-tu rejouer\n");
printf("Oui = tape 1 \nNon = tape 0\n\n");
scanf("%d", &nouvellePartie);
printf ("\n\n");
if(nouvellePartie == 0)
printf("Merci d'avoir jouer avec nous !!\n\n");
}while(nouvellePartie);
return 0;
}
Maintenant que tu connais les fonctions ... Ne pourrais-tu pas placer dans la fonction difficulte() ce qu'il faut pour obtenir la valeur de max ? (le switch) Tu pourrais faire une fonction qui demande la valeur de max à l'autre joueur. Et finalement une fonction pour le jeu lui-même. Tu verras ce que ça donne. Le code de ton main sera grandement simplifié. Dis-nous si tu as vu les tableaux. On pourrait éliminer le switch pour trouver max. On pourrait également simplifier l'affichage de ton menu et les réponses avec des tableaux de chaînes.
Le Tout est souvent plus grand que la somme de ses parties.
Pour ne pas t'embêter avec les messages personnalisés, mets des messages généraux dans le jeu. Quand tu demandes au joueur 2 d'entrer le max pour le joueur 1, tu pourrais avoir le message suivant à la fin: « Joueur 2, veuillez laisser la place au joueur 1 » Tu devrais pouvoir appeler la fonction qui fait le jeu une seule fois après que max a été soit évalué ou donné par l'autre. De la même façon, le nombre mystère pourrait n'être calculé qu'une fois. Si tu ne sais pas qu'on peut passer une expression en paramêtre, je te l'apprend ... int nombreMystere = rand() % (max-MIN+1) + MIN; faireJeu(nombreMystere); ou bien: faireJeu(rand() % (max-MIN+1) + MIN); Tu sauves une variable ...
Le Tout est souvent plus grand que la somme de ses parties.
Voir plus haut : dans le cours en question, cet exercice tombe (bêtement) avant les fonctions et les tableaux. Sans parler des enumerations, et des booleens qui n'existent pas.
On m'a déjà fait la même remarque. On devrait placer l'exercice plus loin dans le cours. On pourrait remplacer les menus par des tableaux de chaînes et éliminer le switch facilement pour ce genre d'exercice. Il reste tout de même facile de n'avoir qu'une copie du jeu. S'il y avait une erreur dans une des versions du jeu et pas dans l'autre, la confusion pourrait être plus grande pour un débutant.
@ox223252: on aurait pu aller plus loin en ne donnant pas les dimensions des tableaux de chaînes et utiliser sizeof(tableau) / sizeof(tableau[0])
mais cela non plus, on ne le voit pas au début.
- Edité par PierrotLeFou 5 octobre 2021 à 15:45:03
Le Tout est souvent plus grand que la somme de ses parties.
Le plus grave me semble être le manque de fonctions.
Une fonction, c'est un moyen de matérialiser une action. En separant le fait
La définir à part
L'appeler (*)
Avec les fonctions, on se demande comment écrire une boucle qui répète l'action faire_une_partie().
Sans les fonctions, le debutant cherche quelles instructions inserer (et où) dans son code pour "revenir" au début (ou à peu pres). Ça le pousse à penser en terme de branchements ( Si la réponse est oui, je retourne au debut), pour peu qu'il aie entendu parler de goto, il se precipite dessus.
(*) éventuellement depuis plusieurs endroits pour réutiliser, mais au début c'est moins important que le "simple" fait d'identifier clairement une suite d'opérations qui a un but précis.
- Edité par michelbillaud 7 octobre 2021 à 12:06:33
que pensez-vous de ce code ? plus ou moins
× 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.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
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.
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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub
Le Tout est souvent plus grand que la somme de ses parties.
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub