Signaler

Mon nouveau jeu [Résolu]

Posez votre question jeandchanel 115Messages postés vendredi 10 juin 2016Date d'inscription 25 novembre 2016 Dernière intervention - Dernière réponse le 25 nov. 2016 à 07:28
Bonjour,
je suis entrain de coder un nouveau jeu dont voici le principe :

L'ordinateur génère une combinaison de 5 chiffres. Le joueur choisit un nombre entre 1 et 5, l'ordinateur vérifie si ce nombre figure dans la combinaison :
1. Si le chiffre ne s'y trouve pas, le jeu s’arrête.
2. Si le chiffre s'y trouve, le jeu peut continuer. L'ordinateur demande au joueur le nombre de fois que le chiffre figure dans la combinaison :
3. Si la proposition du joueur est fausse, le jeu s’arrête et on lui dévoile la bonne réponse,
4. Si elle est bonne, le jeu peut continuer. L'ordinateur demande alors au joueur d'indiquer la ou les positions respectives du chiffre dans la combinaison :
5. Si la proposition du joueur est fausse, le joueur perd la partie, on lui indique cela et on lui dévoile la bonne réponse,
6.Si c'est bon, le joueur gagne et on le lui fais savoir !

j'ai implémenté tout cela mais j'ai un soucis au niveau des points 4, 5 et 6. Ici, quand on a le cas "location[i] == position[i]" le message affiché est "Désolé, vous avez perdu !" et non pas "Bravo, vous avez gagne !"
voici d'ailleurs le déroulement d'une partie :


Running "/home/ubuntu/workspace/Le_Jeu_De_Cinq/cinq.c"

25154 ==> la combinaison du jeu.

Entrez le chiffre a rechercher : 4 ==> le chiffre choisit par le joueur.

Le chiffre 4 figure t-il dans la combinaison ?
1. Oui
Votre reponse : 1

Bien joue, passons a l'etape suinvante !

Le chiffre 4 figure combien de fois dans la combinaison ?
Votre reponse : 1

Bien joue, passons a l'etape suivante !

Quelle(s) est la (sont les) position(s) (respectives) du chiffre 4 ? :
5 ==> proposition du joueur (bonne proposition, voir combinaison : 25154).

Desole, vous avez perdu ! ==> Message de l'ordinateur !

Sa (ses) position(s) (respectives) est (sont) :
5 ==> affichage de la bonne position par l'ordinateur !

Voulez-vous reessayer ou quitter ?
1. Reessayer
2. Quitter

Votre choix ? :




EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 
Utile
+1
moins plus
Salut Jean,

L'algorithme tu l'as déjà, c'est la description de ton programme, de sa logique et de son déroulement avec les 8 étapes que tu décris dans ton poste initial.

Si je devais écrire un tel programme, je simplifierai considérablement ton code :

- avec
int tirage[5];
comme seul tableau contenant le tirage
- sans utiliser malloc

Pour faire les opérations de 1 à 8, tes fonctions peuvent très bien travailler sur ce seul tableau où se trouve stocké le tirage aléatoire et renvoyer les résultats des vérifications.

A première vue, je verrai bien des fonctions avec les prototypes suivants :

- avec
int existe(int * tirage, int chiffre);
pour savoir si le chiffre proposé est présent ou pas
- avec
int nb_repetitions(int * tirage, int chiffre, int nbrep);
pour vérifier si pour le chiffre proposé, le nombre de répétitions est le bon
- avec
int emplacements(int * tirage, int chiffre, char places[10]);
pour vérifier les propositions, à saisir par l'utilisateur sous la forme d'une chaîne contenant 5 positions maximum, les positions étant séparées par des espaces (ou autre chose, mais c'est assez simple de demander à l'utilisateur de saisir "1 2 5" s'il veut proposer ces 3 emplacements)

Ces fonctions renvoient int, et donc 0 si la proposition est fausse, et 1 ou une autre valeur que 0 si le résultat est exact.


Dal
jeandchanel 115Messages postés vendredi 10 juin 2016Date d'inscription 25 novembre 2016 Dernière intervention - 4 nov. 2016 à 17:26
Merci pour tous tes conseils Dal, j’écris les codes de toutes ces fonctions, je compile le tout et je te rend compte.
Répondre
[Dal] 4052Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 6 décembre 2016 Dernière intervention - 4 nov. 2016 à 17:48
OK, ait à l'esprit que ce sont des fonctions qui font des choses simples, chacune ne devrait pas faire plus de 5 à 6 lignes pour faire le boulot, hein :-)

en fait, le plus compliqué dans ton programme est de traiter la saisie de l'utilisateur et de vérifier qu'elle est cohérente par rapport à ce qui est attendu, sécurisée, sans erreurs,...

aussi, à la réflexion, pour la fonction emplacements(), on peut rendre plus générique le prototype en faisant :
int emplacements(int * tirage, int chiffre, char * places);
ce qui évite d'avoir à changer le prototype si tu changes ta taille maximale dans ton programme.
Répondre
[Dal] 4052Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 6 décembre 2016 Dernière intervention - 4 nov. 2016 à 18:38
en fait
int emplacements(int * tirage, int chiffre, int nbrep, char * places);
avec quelques lignes de plus de code pour vérifier que tous les emplacements ont bien été trouvés

enfin bon... pour gagner à ton jeu il faut avoir beaucoup de chance ou être un peu voyant :-P
Répondre
jeandchanel 115Messages postés vendredi 10 juin 2016Date d'inscription 25 novembre 2016 Dernière intervention - 7 nov. 2016 à 12:23
Bonjour Dal,

Il s'agit ici d'un jeu en construction. L'essentiel pour moi est que la boucle principale du jeu fonctionne correctement ensuite apres je pourrais faire des petites modifications pour que le joueur puisse gagner sans etre un "voyant" !!! A bientot .
Répondre
Ajouter un commentaire
Utile
+1
moins plus
Salut Jean,

J'avais fait un code rapide il y a deux semaines, le voici un peu adapté, avec quelques commentaires, avec des fonctions
affiche_tirage()
et
perdu()
permettant d'éviter des répétitions. Pour cet exemple, il n'y pas les fonctions de saisie (tu peux faire varier les données initialisées pour tester le comportement, ou rajouter ces fonctions si tu veux).

#include <stdio.h>
#include <stdlib.h>

#define TAILLE 5

int existe(int * tirage, int chiffre);
int nb_repetitions(int * tirage, int chiffre, int nbrep);
int emplacements(int * tirage, int chiffre, int nbrep, char * places);
void affiche_tirage(int * tirage);
void perdu(int * tirage, char * motif);

int main(void) {
    int tirage[TAILLE] = { 2, 5, 1, 5, 4 };
    int chiffre = 5;
    int nbrep = 2;
    char places[TAILLE*2] = "2 4";

    /* on devine le chiffre */
    if (existe(tirage, chiffre))
        printf("Oui, le chiffre %d existe bien dans le tirage\n",
                chiffre);
    else
        perdu(tirage, "ce chiffre n'existe pas dans le tirage");

    /* on devine le nombre de répétitions */
    if (nb_repetitions(tirage, chiffre, nbrep))
        printf("Oui, le chiffre %d est bien répété %d fois "
                "dans le tirage\n", chiffre, nbrep);
    else
        perdu(tirage, "ce n'est pas le bon nombre de répétitions");

    /* on devine les emplacements */
    if (emplacements(tirage, chiffre, nbrep, places))
        printf("Oui, vous avez bien deviné les emplacements %s\n",
                places);
    else
        perdu(tirage, "ce ne sont pas les emplacements corrects "
                "de ce chiffre");

    /* féliciter le joueur pour ses dons de voyance */
    printf("Bravo !\nLe tirage était : ");
    affiche_tirage(tirage);
    printf("\n... vos dons de voyance sont impressionnants !\n");

    return 0;
}

/* --------- fonctions --------- */

/* pour savoir si le chiffre proposé est présent ou pas */
int existe(int * tirage, int chiffre) {
    int i;

    for (i=0; i < TAILLE; i++)
        if (tirage[i] == chiffre)
            return 1;
    return 0;
}

/* pour vérifier si pour le chiffre proposé, le nombre de 
 * répétitions est le bon */
int nb_repetitions(int * tirage, int chiffre, int nbrep) {
    int i;
    int n = 0;

    for (i=0; i < TAILLE; i++)
        if (tirage[i] == chiffre)
            n++;
    return (n == nbrep);
}

/* pour vérifier les propositions, à saisir par l'utilisateur 
 * sous la forme d'une chaîne contenant 5 positions maximum, 
 * les positions étant séparées par des espaces */
int emplacements(int * tirage, int chiffre, int nbrep, char * places) {
    int trouves = 0;

    while (*places) {
        if ((*places != ' ') && (tirage[*places-'0'-1] != chiffre))
            return 0;   /* l'emplacement proposé est incorrect */
        if ((*places != ' ') && (tirage[*places-'0'-1] == chiffre))
            trouves++;  /* l'emplacement proposé est correct */
        places++;
    }
    if (trouves != nbrep)
        return 0;       /* on n'a pas trouvé tous les emplacements */
    return 1;
}

void affiche_tirage(int * tirage) {
    int i;

    for (i=0; i < TAILLE; i++)
        printf("%d", tirage[i]);
}

void perdu(int * tirage, char * motif) {
    printf("Perdu : %s\nLe tirage était : ", motif);
    affiche_tirage(tirage);
    printf("\n");
    exit(1);
}

donne :
$ gcc -Wall jeude5.c 
$ ./a.out
Oui, le chiffre 5 existe bien dans le tirage
Oui, le chiffre 5 est bien répété 2 fois dans le tirage
Oui, vous avez bien deviné les emplacements 2 4
Bravo !
Le tirage était : 25154
... vos dons de voyance sont impressionnants !

Dal
jeandchanel 115Messages postés vendredi 10 juin 2016Date d'inscription 25 novembre 2016 Dernière intervention - 24 nov. 2016 à 16:39
Bonsoir Dal,
Grâce a vous j'ai enfin réussi a réaliser mon jeu, Merci beaucoup !
Voici le déroulement d'une partie :

LE JEU DES DEVINETTES
Code par Jean Dechanel


Le tirage du jeu : XXXXX

Entrez le chiffre a rechercher : 1

Oui, le chiffre 1 existe bien dans le tirage


Quel est le nombre de repetitions de ce chiffre ? : 2

Oui, le chiffre 1 est bien répété 2 fois dans le tirage


Quels sont les emplacements de ce chiffre : 12


Perdu : ce ne sont pas les emplacements corrects de ce chiffre !

Le tirage était : 31133


Voulez-vous reessayer ou quitter ?
1. Reessayer
2. Quitter

Votre choix ?
Répondre
[Dal] 4052Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 6 décembre 2016 Dernière intervention - 24 nov. 2016 à 19:15
champagne !
Répondre
jeandchanel 115Messages postés vendredi 10 juin 2016Date d'inscription 25 novembre 2016 Dernière intervention - 25 nov. 2016 à 07:28
Grand Merci a vous.
Répondre
Ajouter un commentaire
Utile
-1
moins plus
Avec quel code ?
[Dal] 4052Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 6 décembre 2016 Dernière intervention - 3 nov. 2016 à 12:40
aussi, tu n'utilises pas le fichier .h de façon très orthodoxe

L'entête (header en anglais) ne devrait pas contenir l'implémentation des fonctions.. juste leur prototype, l'implémentation étant dans un fichier .c correspondant, de façon à constituer un module.

Le document suivant est une bonne source pour appendre à concevoir et utiliser correctement les .h

http://casey.brown.edu/grads/valecofershabica/resources/CHeaderFileGuidelines.pdf


Dal
Répondre
jeandchanel 115Messages postés vendredi 10 juin 2016Date d'inscription 25 novembre 2016 Dernière intervention - 3 nov. 2016 à 14:18
bonjour Dal,
j'ai fait toutes les corrections par rapport a vos remarques. Je suis maintenant entrain de parcourir le code ligne par ligne avec un débogueur, je vous tiendrai au courant a la fin.
Pour ce qui est du fichier .h, j'utilise un IDE qui s'appelle CLOUD9 (c'est un IDE en ligne) qui n'accepte pas l'utilisation simultanée des fichiers .h et .c
Répondre
[Dal] 4052Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 6 décembre 2016 Dernière intervention - 3 nov. 2016 à 14:56
Ah .. il est bizarre alors ton IDE :-)
Répondre
jeandchanel 115Messages postés vendredi 10 juin 2016Date d'inscription 25 novembre 2016 Dernière intervention - 4 nov. 2016 à 09:09
Bonjour Dal,

j'ai fais toutes les vérifications et j'ai corrigé les erreurs trouvées par le débogueur mais hélas mon programme ne marche toujours pas comme je le souhaite.
pourrais tu s'il te plait me proposer un algorithme de ce programme pour que je puisse l’interpréter et le traduire en langage C? Merci d'avance pour ta bonne compréhension.
Répondre
jeandchanel 115Messages postés vendredi 10 juin 2016Date d'inscription 25 novembre 2016 Dernière intervention - 16 nov. 2016 à 07:28
Bonjour Dal,

J'ai écrit toutes les fonctions dont vous m'avez donne les prototypes, mais la dernière ne marche pas correctement :
int emplacements(int * tirage, int chiffre, int nbrep, char * places);
Répondre
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !