Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeu du nombre aléatoire

    9 juin 2023 à 15:15:59

    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.

    • Partager sur Facebook
    • Partager sur Twitter
      9 juin 2023 à 16:50:35

      MuspelWolf a écrit:

      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

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        9 juin 2023 à 17:04:25

        Comment je fais pour retourner au début de la boucle et générer un nouveau nombre aléatoire sans goto?
        • Partager sur Facebook
        • Partager sur Twitter
          9 juin 2023 à 17:10:26

          Tu fais 2 boucles do ... while imbriquées:


          do {


              // choix de la difficulté


              // obetenir nombre random


              do {


                  // blablabla ...


              } while(input != random);


              // on demande si on veut rejouer


          } while(rejouer);

          En passant, le test input == random est inutile, fais simplement un else

          -
          Edité par PierrotLeFou 9 juin 2023 à 17:16:46

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            9 juin 2023 à 17:35:40

            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...

            -
            Edité par robun 9 juin 2023 à 17:38:02

            • Partager sur Facebook
            • Partager sur Twitter
              9 juin 2023 à 18:00:13

              Il faut changer la manière de voir les choses

                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.

              -
              Edité par michelbillaud 10 juin 2023 à 8:12:15

              • Partager sur Facebook
              • Partager sur Twitter
                9 juin 2023 à 18:28:16

                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!");
                			}
                	}
                	}
                }
                



                • Partager sur Facebook
                • Partager sur Twitter
                  9 juin 2023 à 19:21:16

                  Attention : ta variable random dans le bloc while ligne 40 n'est pas la même que celle de la fonction main car tu en créés une nouvelle dans le bloc.

                  Ensuite : si tu rejoues, tu vas entrer dans une boucle sans fin, car tu t'es compliqué la vie avec cette variable isGameStarted qui ne sert à rien.

                  -
                  Edité par rouIoude 9 juin 2023 à 19:29:34

                  • Partager sur Facebook
                  • Partager sur Twitter
                  ...
                    9 juin 2023 à 20:20:17

                    Et tu as plein de variable booléennes qui ne te servent à rien.


                    Pour savoir si tu as gagné, tu n'as qu'à tester si  input == random


                    La seule variable booléenne dont tu as besoin est de demander si on veut rejouer.


                    Reviens à mon ébauche de code pour les boucles imbriquées.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Le Tout est souvent plus grand que la somme de ses parties.

                      9 juin 2023 à 22:40:42

                      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);
                      }



                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 juin 2023 à 23:32:32

                        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);
                        • Partager sur Facebook
                        • Partager sur Twitter

                        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                          10 juin 2023 à 8:32:30

                          > voila du code qui marche

                          Ç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.

                          -
                          Edité par michelbillaud 10 juin 2023 à 8:54:35

                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 juin 2023 à 9:12:11

                            C'est bon, j'ai réussi! Merci beaucoup à ceux qui m'ont répondu! Maintenant je vais juste essayer de rendre le code moins "crado".

                            -
                            Edité par MuspelWolf 10 juin 2023 à 10:01:00

                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 juin 2023 à 10:06:16

                              MuspelWolf a écrit:

                              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 !

                              • Partager sur Facebook
                              • Partager sur Twitter
                              ...

                              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.
                              • Editeur
                              • Markdown