IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Crash sur jeu du nombre mystère


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Crash sur jeu du nombre mystère
    Bien le bonjour à tous,

    Je suis actuellement en train d'apprendre la programmation et plus précisément le C.
    Je fais un petit jeu console de nombre mystère (whaouuuuuu impressionnant d'innovation, n'est ce pas ?).

    Ce dernier compile parfaitement :
    " Build finished: 0 error(s), 0 warning(s) "

    De ce fait le problème vient probablement de mon algorithme, mais en retournant le code dans tous les sens je suis incapable de trouver une solution pour empêcher le crash, et retrouver le bon fonctionnement du dit-programme.
    Si quelqu'un pouvait m'aider à comprendre pourquoi ce problème et comment le résoudre.

    Ci-dessous le code en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    // premier programme C
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
     
    int main() {
     
    const int MIN = 1; //déclaration des constantes et variable minimum et maximum
    int	nb = 0;
    int nombreMystere = 0;
    int compteur = 0;
    int nbMax = 0;
    int lvl = 0;
    int continuerPartie = 1;
     
    	//on genere le nombre aléatoire
    srand(time(NULL)); //initialise le générateur de nombres aléatoires.
    nombreMystere = (rand() % (nbMax - MIN + 1)) + MIN;
     
    while (continuerPartie == 1) {
     
    do
    		{
    printf("choisir le niveau de jeu que vous souhaiter :\n");
    printf("1. de 1 à 100\n");
    printf("2. de 1 à 1000\n");
    printf("3. de 1 à 10000\n");
    printf("votre choix ?\n");
    scanf("%d", &lvl);
     
    compteur++;
     
    switch (lvl)
    {
    case 1:
        {
        printf("Vous avez choisi le premier niveau !\n");
        int nbMax = 100;
        break;
        }
    case 2:
        {
        printf("Vous avez choisi le 2eme niveau !\n");
        int nbMax = 1000;
        break;
        }
    case 3:
        {
        printf("Vous avez choisi le 3eme niveau !\n");
        int nbMax = 10000;
        break;
        }
    default:
        printf("Veuillez choisir un chiffre correct !\n");
        break;
    }
    	//recherche du nombre mystère
    		printf("Entrez une valeur comprise entre %ld et %d :\n", MIN, nbMax);
    		scanf("%d", &nb);
     
    		/*execution de la recherche du nombre*/
    			if (nb < nombreMystere) // test pour savoir si le nombreMystere est inférieur à nb
    				printf("c'est superieur a %d \n\n", nb);
     
    			else if (nb > nombreMystere) // test pour savoir si le nombreMystere est supérieur à nb
    				printf("c'est inferieur a %d \n\n", nb);
     
    			else
    				printf("Bravo, vous avez trouvez le nombre mystere en %d coups !\n", compteur);
     
            } while ( nb != nombreMystere); //condition de stop
     
            printf("Voulez-vous rejouer avec moi ce soir ?\n");
            printf("0. Non je souhaite arreter.\n");
            printf("1. Oui, continuons de nous amuser comme des fous.\n");
            printf("Alors on joue ? \n");
            scanf("%d", continuerPartie);
    }
    	return 0;
        }
    Merci à tous pour votre temps et vos connaissances.

  2. #2
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 562
    Points
    1 562
    Par défaut
    Hello,

    Le nombre mystère se génère après avoir demandé le niveau de jeu.

    À l'endroit où tu le génères, nbMax - MIN + 1 vaut 0, et un x%0 fait que le programme plante....
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci pour ton intervention !

    hmm d'accord je vois, donc il faut que je change la génération de 'nombreMystere' de place ?
    Mais il risque d'être régénéré à chaque itération dans la boucle si je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    srand(time(NULL));
    nombreMystere = (rand() % (nbMax - MIN + 1)) + MIN;
    Après avoir fait la sélection ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    printf("choisir le niveau de jeu que vous souhaiter :\n");
    printf("1. de 1 à 100\n");
    printf("2. de 1 à 1000\n");
    printf("3. de 1 à 10000\n");
    printf("votre choix ?\n");
    scanf("%d", &lvl);
     
    switch (lvl)
    {
    case 1:
        {
        printf("Vous avez choisi le premier niveau !\n");
        int nbMax = 100;
        break;
        }
    case 2:
        {
        printf("Vous avez choisi le 2eme niveau !\n");
        int nbMax = 1000;
        break;
        }
    case 3:
        {
        printf("Vous avez choisi le 3eme niveau !\n");
        int nbMax = 10000;
        break;
        }
    default:
        printf("Veuillez choisir un chiffre correct !\n");
        break;
    }
    Edit : Bon je rentre au moins dans le choix des niveaux, mais je crash après comme j'imaginais.

  4. #4
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 562
    Points
    1 562
    Par défaut
    Re,

    Lignes 13, 19 et 25: retire "int". nbMax est déjà déclaré ligne 13.

    Ce que tu fais, c'est déclarer une nouvelle une nouvelle variable nbMax, qui n'existera que dans le bloc où elle est déclarée, soit entre les { }. Donc la variable nbMax de la ligne 13, après ton switch, n'aura pas changé de valeur.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ce dernier compile parfaitement :
    " Build finished: 0 error(s), 0 warning(s) "
    Tu n'as peut-être pas assez de warnings activé chez toi

    Moi j'obtiens en prime :
    • warning: unused variable 'nbMax' [-Wunused-variable] (à plusieurs endroits)
    • warning: format '%ld' expects argument of type 'long int', but argument 2 has type 'int' [-Wformat=]
      printf("Entrez une valeur comprise entre %ld et %d :\n", MIN, nbMax);
    • warning: format '%d' expects argument of type 'int*', but argument 2 has type 'int' [-Wformat=] (sur le scanf)


    Le dernier me parait particulièrement suspect.

    PS : je viens de tester, tu n'as vraiment activé beaucoup de warning ! ces warnings sont émises avec juste -Wall de gcc !

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Ok je suis grand débutant comme vous le constatez,

    @bktero j'ai déjà modifié le %ld , j'avais fait un test et j'avais oublié, donc ce warning est ok.
    - les unused nbMax, ça venait du fait que je remettais int dans chaque case.
    - j'ai pas compris le dernier warning par contre.

    @edgarjacobs Ensuite j'ai retiré les int, ce qui fait que mon programme redevient fonctionnel, merci je ne savais pas que ça faisait de la nouvelle déclaration à la volée, merci pour l'info.

    Par contre la j'me rends compte que quelque chose cloche vraiment dans mon algo, car ça spam à chaque itération le choix du niveau.
    Le jeu ne peut donc se terminer, il va falloir que je change la boucle ou que je sépare un truc quelque part.

    Edit :

    Bon j'ai pu avancer un peu , par contre il y a des choses qui sont très mystérieuse pour moi à ce moment.
    Et j'ai des erreurs du coup que je ne comprends pas.

    Je met la version actuelle du code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
     
    int main() {
     
    const int MIN = 1; //déclaration des constantes et variable minimum et maximum
    int	nb = 0;
    int nombreMystere = 0;
    int compteur = 0;
    int nbMax = 0;
    int lvl = 0;
    int continuerPartie = 1;
     
    //on genere le nombre aléatoire
    //srand(time(NULL)); //initialise le générateur de nombres aléatoires.
    //nombreMystere = (rand() % (nbMax - MIN + 1)) + MIN;
    printf("choisir le niveau de jeu que vous souhaiter :\n");
    printf("1. de 1 a 100\n");
    printf("2. de 1 a 1000\n");
    printf("3. de 1 a 10000\n");
    printf("votre choix ?\n");
    scanf("%d", &lvl);
     
    while (continuerPartie == 1) {
     
    do
    		{
        compteur++;
     
        switch (lvl)
        {
        case 1:
        {
        printf("Vous avez choisi le premier niveau !\n");
        nbMax = 100;
        break;
        }
     
        case 2:
        {
        printf("Vous avez choisi le 2eme niveau !\n");
        nbMax = 1000;
        break;
        }
     
        case 3:
        {
        printf("Vous avez choisi le 3eme niveau !\n");
        nbMax = 10000;
        break;
        }
     
        default:
        printf("Veuillez choisir un chiffre correct !\n");
        break;
        }
     
    if (nbMax != 0) //boucle pour tester et rentrer dans le jeu.
        do{
            srand(time(NULL)); //initialise le générateur de nombres aléatoires.
            nombreMystere = (rand() % (nbMax - MIN + 1)) + MIN;
     
    	//recherche du nombre mystère
    		printf("Entrez une valeur comprise entre %d et %d :\n", MIN, nbMax);
    		scanf("%d", &nb);
     
    		/*execution de la recherche du nombre*/
    			if (nb < nombreMystere) // test pour savoir si le nombreMystere est inférieur à nb
    				printf("c'est superieur a %d \n\n", nb);
     
    			else if (nb > nombreMystere) // test pour savoir si le nombreMystere est supérieur à nb
    				printf("c'est inferieur a %d \n\n", nb);
     
    			else
    				printf("Bravo, vous avez trouvez le nombre mystere en %d coups !\n", compteur);
            }
        } while ( nb != nombreMystere); //condition de stop
     
            printf("Voulez-vous rejouer avec moi ce soir ?\n");
            printf("0. Non je souhaite arreter.\n");
            printf("1. Oui, continuons de nous amuser comme des fous.\n");
            printf("Alors on joue ? \n");
            scanf("%d", continuerPartie);
       }
    	return 0;
    }
    J'ai l'impression de pas être doué c'est rageant !

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Voici le résultat de la compilation de cette version de ton code :

    main.c: In function 'main':
    main.c:79:3: error: expected 'while' before '}' token
       } while ( nb != nombreMystere); //condition de stop
       ^
    main.c:85:11: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=]
       scanf("%d", continuerPartie);
              ~^
    main.c:85:11: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=]
    main.c:87:2: error: expected 'while' before 'return'
      return 0;
      ^~~~~~
    main.c:88:1: error: expected declaration or statement at end of input
     }
     ^
    L'erreur 1 est une } en trop. L'erreur 2 est une absence de while à la fin pour le do ouvert au début.

    Le warning est le même que précédemment : c'est le fait que scanf() attend des pointeurs vers les variables à modifier, a contrario de printf() qui attend directement les variables.

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Salut Salut,

    Déjà merci à tous pour votre temps, j'ai pu trouver où étaient mes erreurs mais surtout les comprendre.
    Pour le pointeur en effet il me manquait un '&' devant une variable dans un scanf, une bête erreur qui m'a coûtait un peu de temps.

    Le while a été fermé avec une condition de sortie (exactement la même, je ne pensait pas ça possible).

    Niveau algorithmique j'ai fait quelques modifications, comme sortir de la boucle le générateur de nombre aléatoire ( bonne chance pour trouver le bon nombre lol ).
    J'ai aussi remis dans le premier while le choix du niveau afin de pouvoir changer de niveau suite à un renouvellement de partie.

    Ci-dessous je met le dernier jet de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main() {
     
    const int MIN = 1; //déclaration des constantes et variable minimum et maximum
    int	nb = 0;
    int nombreMystere = 0;
    int compteur = 0;
    int nbMax = 0;
    int lvl = 0;
    int continuerPartie = 1;
     
    while (continuerPartie == 1) {
     
        printf("choisir le niveau de jeu que vous souhaiter :\n");
        printf("1. de 1 a 10\n");
        printf("2. de 1 a 100\n");
        printf("3. de 1 a 1000\n");
        printf("4. de 1 a 10000\n");
        printf("votre choix ?\n");
        scanf("%d", &lvl);
     
        do
    		{
        switch (lvl)
        {
        case 1:
        {
        printf("Vous avez choisi le premier niveau !\n");
        nbMax = 10;
        break;
        }
     
        case 2:
        {
        printf("Vous avez choisi le 2eme niveau !\n");
        nbMax = 100;
        break;
        }
     
        case 3:
        {
        printf("Vous avez choisi le 3eme niveau !\n");
        nbMax = 1000;
        break;
        }
     
        case 4:
        {
        printf("Vous avez choisi le 4eme niveau !\n");
        nbMax = 10000;
        break;
        }
     
        default:
        printf("Veuillez choisir un chiffre correct !\n");
        break;
        }
     
        srand(time(NULL)); //initialise le générateur de nombres aléatoires.
        nombreMystere = (rand() % (nbMax - MIN + 1)) + MIN;
     
    if (nbMax != 0) //boucle pour tester et rentrer dans le jeu.
        do  {
            compteur++;
     
    	//recherche du nombre mystère
    		printf("Entrez une valeur comprise entre %d et %d :\n", MIN, nbMax);
    		scanf("%d", &nb);
     
    		/*execution de la recherche du nombre*/
    			if  (nb < nombreMystere) {// test pour savoir si le nombreMystere est inférieur à nb
    				printf("c'est superieur a %d \n\n", nb);
    			}
    			else if (nb > nombreMystere) { // test pour savoir si le nombreMystere est supérieur à nb
    				printf("c'est inferieur a %d \n\n", nb);
    			}
    			else {
    				printf("Bravo, vous avez trouvez le nombre mystere en %d coups !\n", compteur);
    			}
            } while ( nb != nombreMystere);
        } while ( nb != nombreMystere); //condition de stop
     
            printf("Voulez-vous rejouer avec moi ce soir ?\n");
            printf("0. Non je souhaite arreter.\n");
            printf("1. Oui, continuons de nous amuser comme des fous.\n");
            printf("Alors on joue ? \n");
            scanf("%d", &continuerPartie);
       }
       return 0;
    }
    Du coup je clôture le sujet !
    Bonne journée à tous.

  9. #9
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 562
    Points
    1 562
    Par défaut
    Re,-

    Ça plantera si le joueur choisit un niveau <1 ou >4

    Et tu ferais bien d'indenter convenablement ton code.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Salut @Edgarjacobs,

    Yes exact, j'avais vu le problème et je l'ai corrigé dans la foulé !
    Ok pour l'indentation je vais voir pour faire plus conventionnelle.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Crash à l'exécution sur delete[]
    Par melleb dans le forum C++
    Réponses: 11
    Dernier message: 17/11/2009, 14h13
  2. Mini jeu avec quelques bugs
    Par fouedou77 dans le forum C
    Réponses: 12
    Dernier message: 27/06/2009, 09h07
  3. [68000] Création mini-jeu
    Par Hiike dans le forum Autres architectures
    Réponses: 0
    Dernier message: 13/04/2009, 20h21
  4. Mini jeu de rôle en php
    Par Sh4dow49 dans le forum Projets
    Réponses: 5
    Dernier message: 23/10/2008, 16h08
  5. mini jeu en construction (débutant)
    Par samy100 dans le forum C
    Réponses: 45
    Dernier message: 23/04/2006, 23h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo