Bonjour, j'essaye de créer un jeu où il faut trouver un nombre aléatoire en C. Le jeu comprend trois niveaux de difficultés, et un replay. Le problème c'est que je veux que quand on rejoue, on puisse à nouveau choisir le niveau de difficulté, mais je n'y arrive pas.
Voici le code:
// importe les bibliothèques
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#define NULL __DARWIN_NULL
int main() {
// Les variables à définir
srand(time(NULL));
int input = 0;
int maxNumb;
int level;
int playAgain;
bool isGameOn=false;
int random;
// Boucle du jeu
gameLoop:
while(input!=random) {
// Séléction du niveau de difficulté
if (isGameOn==false){
printf("Choisissez le niveau de difficulté\n");
printf("1: 1 à 10\n");
printf("2: 1 à 100\n");
printf("3: 1 à 1000\n");
scanf("%d", &level);
if (level==1) {
maxNumb=10;
} else if (level==2) {
maxNumb=100;
} else if (level==3) {
maxNumb=1000;
}
isGameOn=true;
}
// Génère le nombre aléatoire
int random=rand()%maxNumb+1;
printf("%d", random);
// Le jeu se déroule ici
printf("\nQuel est le nombre aléatoire? ");
scanf("%d", &input);
if(input<random) {
printf("Le nombre à trouver est plus grand!!\n");
} else if(input>random) {
printf("Le nombre à trouver est plus petit!!\n");
} else if (input==random){
printf("Bravo, vous avez trouvés!!");
// Rejouer ?
printf("Voulez-vous rejouer?\n1: Oui\n2:Non\n");
scanf("%d", &playAgain);
if (playAgain==1) {
bool isGameOn=false;
goto gameLoop;
}
}
}
}
J'espère que vous pourrez m'aider. Merci d'avance
P.S.: Si j'affiche le nombre aléatoire, c'est pour tester plus rapidement.
Le problème c'est que je veux que quand on rejoue, on puisse à nouveau choisir le niveau de difficulté, mais je n'y arrive pas.
C'est normal. Quand tu as trouvé le nombre et que tu souhaites rejouer, ligne 21 input vaut toujours random. Tu sors. Mais pourquoi employer goto ? Ce programme s'en passe parfaitement.
- Edité par edgarjacobs 9 juin 2023 à 16:51:55
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
J'explique comment je réfléchis pour faire ce genre de programme. Le principe : décomposer.
Je décompose : le jeu est composé de parties, chacune avec son niveau de difficulté, et chaque partie est composée de tentatives (de deviner le nombre). La partie s'arrête quand le joueur a trouvé le nombre ou bien s'il a épuisé ses tentatives (elles sont en nombre limité). Le jeu s'arrête lorsque le joueur le demande. À ce stade je ne raisonne pas en boucles ; je parle en français.
Autre principe, que le roi Arthur rappelle à Perceval (dans Kaamelott, mais je crois que ça vient d'un auteur antique ) : le tout est composé de trois parties : le début, le milieu, la fin. En programmation, on a toujours ce schéma : début (initialisations), traitement, fin.
Ainsi, le programme pourrait ressembler à (j'écris juste l'algorithme) :
Début_Jeu() :
// initialisations diverses
Fin_jeu = FAUX
Jeu() :
Faire :
Jouer_une_partie()
jusqu'à Fin_jeu = VRAI
Fin_Jeu() :
// c'est là qu'on peut afficher le score, par exemple
Ce sont trois fonctions, je n'ai pas précisé ce qu'il faut mettre en arguments.
Jouer une partie, c'est choisir son niveau de difficulté, puis effectuer un certain nombre de tentatives.
Jouer une partie() :
Début_partie() :
Demander le niveau de difficulté
Définir Nbmax = nombre maxi possible de tentatives
Définir N = le nombre à trouver
Num_tentative = 0
Trouvé = FAUX
Partie() :
Faire :
Tentative()
jusqu'à Trouvé = VRAI ou Num_tentative >= Nbmax
FinPartie() :
Afficher le résultat
Demander si on joue une nouvelle partie
Si réponse = "non" : Fin_jeu = VRAI
La fonction Tentative contiendra entre autres :
Tentative() :
Num_tentative += 1
n = nombre proposé par l'utilisateur
Si n == N : Trouvé = VRAI
Si n < N : ... ... ...
Si n > N : ... ... ...
Tout ça est très facile à écrire si on pense à décomposer. De plus, on pourra mettre le programme au point étape par étape, en laissant à vide les fonctions non encore écrites (on met juste un 'printf' dedans provisoirement). Ça évite le piège classique de la première compilation d'un fichier de 200 lignes où, forcément, il y aura plein d'erreurs et peu d'idées d'où elles viennent...
je fais un truc
je retourne là-haut si je veux faire une autre partie
est à remplacer par
l'ordinateur répète
faire un truc
demander si l'utilisateur veut faire une autre partie
tant que c'est oui
(accessoirement, c'est pas moi qui retourne en haut, ni l'utilisateur, mais le "fil d'exécution" du programme. Appelons-ça l'ordinateur)
et puis là, ça se traduit (*) par une boucle
do {
// code pour faire le truc
// ...
// code pour demander si on veut faire une autre partie
// ...
} while (condition pour recommencer);
(*) On a l'idée d'abord, on la traduit par du code après. Mais je triche évidemment : j'ai cette idée parce que je sais qu'elle pourra être traduite par du code qui fera le job. L'expérience, ça viendra en son temps.
Maintenant la victoire est just impossible, je ne sais pas ce qui se passe.
// importe les bibliothèques
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#define bool _Bool
#define NULL __DARWIN_NULL
int main() {
// Les variables à définir
srand(time(NULL));
int input = 0;
int maxNumb;
int level;
bool end_game;
bool isGameStarted=false;
int random;
bool Win=false;
bool gameOn=true;
int playAgain;
// Boucle du jeu
while(gameOn) {
// Séléction du niveau de difficulté
if (isGameStarted==false){
printf("Choisissez le niveau de difficulté\n");
printf("1: 1 à 10\n");
printf("2: 1 à 100\n");
printf("3: 1 à 1000\n");
scanf("%d", &level);
if (level==1) {
maxNumb=10;
} else if (level==2) {
maxNumb=100;
} else if (level==3) {
maxNumb=1000;
}
// Génère le nombre aléatoire
int random=rand()%maxNumb+1;
printf("%d", random);
isGameStarted=true;
Win=false;
}
while(Win==false) {
// Le jeu se déroule ici
printf("\nQuel est le nombre aléatoire? ");
scanf("%d", &input);
if(input<random) {
printf("Le nombre à trouver est plus grand!!\n");
} else if(input>random) {
printf("Le nombre à trouver est plus petit!!\n");
} else if (input==random){
printf("Bravo, vous avez trouvés!!");
Win=true;
// Rejouer ?
printf("Voulez-vous rejouer?\n1: Oui\n2:Non\n");
scanf("%d", &playAgain);
if (playAgain==2) {
return 0;
} else if (playAgain==1) {
Win=true;
}
} else {
printf("Désolé, mais ceci n'est pas un nombre!");
}
}
}
}
J'ai enfin réussi à faire marcher le programme grâce à michelbillaud. Merci beaucoup pour toutes ces réponses, et au cas où quelqu'un est le même problème, voici le code qui marche:
// importe les bibliothèques
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#define bool _Bool
#define NULL __DARWIN_NULL
int main() {
srand(time(NULL));
bool playAgain=true;
int input;
int random;
int maxNumb;
int level;
bool restart=true;
int askPlayAgain;
do {
// Niveau de difficulté
while(restart==true) {
restart=false;
printf("Choisissez le niveau de difficulté\n1: 1 à 10\n2: 1 à 100\n3: 1 à 1000");
scanf("%d", &level);
if(level==1) {
maxNumb=10;
} else if(level==2) {
maxNumb=100;
} else if(level==2) {
maxNumb=1000;
} else {
printf("Désolé, mais le niveau choisi n'est pas valide.\n");
restart=true;
}
}
// Génére le nombre aléatoire
random=rand()%maxNumb+1;
// Jeu
while(input!=random) {
printf("Quel est le nombre aléatoire?\n");
scanf("%d", &input);
if(input<random) {
printf("Le nombre aléatoire est plus grand!\n");
} else if(input>random) {
printf("Le nombre aléatoire est plus petit!\n");
} else if(input==random) {
printf("Bravo, vous avez trouvés!");
} else {
printf("Ce nombre n'est pas valide!");
}
}
restart=true;
while(restart==true) {
restart=false;
printf("Voulez-vous rejouer?\n1: Oui\n2: Non");
scanf("%d", &askPlayAgain);
if(askPlayAgain==1) {
} else if(askPlayAgain==2) {
playAgain=false;
} else {
printf("Cette réponse n'est pas valide!");
restart=true;
}
}
} while (playAgain==true);
}
Ligne 42: input n'est pas initialisé. Et si par hasard, lors du premier tour, input devait valoir random ?
Tu dois absolument apprendre à utiliser des do....while (et les variables booléennes ne sont pas toujours nécessaire) :
maxNumb=0;
do {
printf("Choisissez le niveau de difficulté\n1: 1 à 10\n2: 1 à 100\n3: 1 à 1000");
scanf("%d", &level);
if(level==1) {
maxNumb=10;
} else if(level==2) {
maxNumb=100;
} else if(level==2) {
maxNumb=1000;
} else {
printf("Désolé, mais le niveau choisi n'est pas valide.\n");
}
} while(maxNumb==0);
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Ça n'aide pas vraiment les débutants de leur montrer le code final.
Deux raisons
Si ils tombent dessus alors qu'ils sont en train de faire mollement l'exercice, ils peuvent se dire "ah oui ok j'ai parfaitement compris", et passer au suivant.
Il y a un gouffre intersidéral entre avoir compris (en avoir l'impression) une solution, et faire l'effort d'obliger son cerveau à mettre en place les connexions qui vont bien pour être capable de faire des choses du même genre plus facilement dans l'avenir.
Si je vois quelqu'un jouer du saxo, je comprends bien qu'il s'agit de souffler dedans et bouger les doigts. De là à jouer petit papa Noél, c'est pas gagné.
C'est une solution acceptable en faisant avec ce qui est connu au moment où on fait l'exercice, mais en fait assez crado.
En réalité, une solution propre ferait apparaître, pour simplifier le code, l'utilisation de fonctions pour éviter les répétitions de code, de tableaux de coefficients pour les niveaux etc.
const int maxByLevel [] = { 0, 10, 100, 1000};
if (1 <= level && level <= 3) {
max = maxByLevel[level];
} else {
...
}
Bref, c'est un exercice pour appliquer ce qui a été vu avant, l'important est de chercher une solution pour se familiariser (péniblement) avec la programmation, et on peut apporter des commentaires sur une solution trouvée, ça permet d'introduire de nouvelles notions (ou d'insister sur celles qui sont présentées). Mais c'est pas une solution "standard", qui serait un chef d'oeuvre à reprendre tel quel.
Ça fait les notes de petit papa noël à peu près comme c'est écrit, mais y a pas les nuances, le phrasé etc et de toutes façons personne va jouer ça en concert. C'est un exercice à bosser, pour apprendre à faire.
le code çi dessus ne marche pas puisque ça ne me refait pas choisir le niveau en relançant la partie.
Quand tu relance la partie, tu reviens sur le while ligne 22, est-ce que à ce moment là la condition du while te permet de rentrer dans le bloc ?
PS : enlève ces deux define ligne 6 et 7 que tu ne sais probablement pas pourquoi tu les a mis !
...
Jeu du nombre aléatoire
× 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.
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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent