Rechercher : dans
Par :

[langage C] jeu mastermind

Dernière réponse le 3 avr 2008 à 19:19:48 Fragma, le 22 nov 2006 à 15:11:00 
 Signaler ce message aux modérateurs

Salut :)

En fait, je suis débutante en C et on nous a demandé de coder un jeu (mastermind) .. j'avoue que je perds un peu pied :)))

En fait, au début du jeu, il faut choisir le nombre de chiffres de la combinaison à deviner. Ensuite, pour la saisie de la combinaison, j'ai opté pour la chaine de caractère: convertir la combinaison saisie en une chaine de caractère pour la comparer après avec la combinaison générée aléatoirement. En ce qui concerne la chaine de caractères, je voudrai savoir comment faire pour que cette chaine n'accepte que les chiffres (et non les caractères et symboles)



Merci à vous!

Meilleures réponses pour « [langage C] jeu mastermind » dans :
Langage C - Les chaînes de caractères Voir Qu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

kij_82, le 22 nov 2006 à 15:22:20

Tu dois pouvoir comparé chaque caractère avec leur valeur dans la table ASCII pour savoir s'il s'agit effectivement d'un chiffre, ou non.

Pour ce qui est des valeurs a tester regarde ici, ce qui correspond en Hexa aux différents chiffres : http://www.table-ascii.com/

Tu test si ta valeur est comprise entre \30 et \39.
~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

2

Fragma, le 22 nov 2006 à 16:04:45

Bon, si on prend par exemple une combinaison à 4 chiffres.
Faudrait que je mette chaque chiffre dans une case d'un tableau pour que je puisse les comparer avec le code ASCII ? :s


Ahhh ces boucles!!!

Répondre à Fragma

3

kij_82, le 22 nov 2006 à 16:16:39

Etant donné que ta chaine de caractère est un tableau, tu n'as pas à mettre ce qui est saisit par ton utilisateur, tu testes directement dessus de la facon suivante :

for (int i = 0; i < 4; i++ ){
  if ( chaine[i] < '\30' && chaine[i] > '\39' ){
        /// --- ERREUR SAISIE
  }
  else {
    /// --- faire traitement
  }
}


Mais je ne suis plus tres sur que ce soit comme ca qu'on teste la valeur ACSII :s, faudrait que quelqun qui passe par là atteste ou non.

~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

4

Fragma, le 22 nov 2006 à 16:31:11

Humm en fait le problème, c'est que quand on saisit des symboles ou des caractères au lieu des chiffres, y a une boucle infinie qui se crée.. je sais pas vraiment la nature du problème .. la boucle ou le test !?


du coup j'ai envie de mettre tout le code pour qu'on me corrige les fauteuuu :((

je désespère :p

Répondre à Fragma

5

kij_82, le 22 nov 2006 à 16:48:17

Heu... je peux pas te dire comment.

Met ton code qui est concerné en entier ici et je te dirais.
~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

6

Fragma, le 22 nov 2006 à 17:03:23
  • +1

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<string.h>

int main()

{
    int i,j,x,val,resultat,valide,nb_tentatives=0,nb_tentatives_max=4,trouve;
    char combinaison[4],combinaison_gagnante[4];
    
    trouve=0;
    resultat=0;
    
    for (i=0; i<4; i++)
        srand(time(0));
        do { {x=rand()%(10000);
           itoa(x,combinaison_gagnante,10);}
    
           valide=1;
           i=1;
     
           while (i<4 && valide==1)
           {j=0;
           while (j<i && valide==1)
           { if (combinaison_gagnante[i]==combinaison_gagnante[j])
           valide=0;
           else j++;
     }
     
     if (valide==1) i++;
     } } while((valide==0) && (strlen(combinaison_gagnante)!=4));
     
     printf("la combinaison gagnante est: %s",combinaison_gagnante);
    
    
    while ((nb_tentatives<nb_tentatives_max) && (trouve==0))
    { do {printf("\nPour jouer a Mastermind, vous devez choisir 4 chiffres. \nVeuillez donner votre combinaison: ");
    
    scanf("%d",&val);
    itoa(val,combinaison,10);
    
    } while ((strlen(combinaison)!=4));
    
    if (strcmp(combinaison,combinaison_gagnante)==0)
    
    {printf(" TROUVE!");
    trouve=1;}
    
    else 
    {j=0;
    for (i=0; i<=4; i++)
    {if (combinaison[i]==combinaison_gagnante[j])
        
        {resultat++;
        nb_tentatives++;
        j++;}
    
    }
    
    printf("\nresultat: %d X",resultat);}}
    
    
    
    system("pause");
    return 0;
}


ça c'est pour une combinaison à 4 chiffres ..

(y a plein de fautes :p et il manque le chrono (paske le temps de saisie est limité) et le score .. )

et l'affichage de la combinaison gagnante c'est euh juste pour tester hein!


Hummmm ...

Répondre à Fragma

7

kij_82, le 22 nov 2006 à 17:24:04

Oups, j'ai rien dit ^^ j'ai mal lu :s

Je regarde.
~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

8

Fragma, le 22 nov 2006 à 17:42:03

EDIT: euh j'ai rien dit aussi :))



sinooon ben cette partie-là est sûrement fausse >__<

if (strcmp(combinaison,combinaison_gagnante)==0)
    
    {printf(" TROUVE!");
    trouve=1;}
    
    else 
    {j=0;
    for (i=0; i<=4; i++)
    {if (combinaison[i]==combinaison_gagnante[j])
        
        {resultat++;
        nb_tentatives++;
        j++;}
    
    }
    
    printf("\nresultat: %d X",resultat);}}



le X, c'est un chiffre commun à la combinaison saisie par l'utilisateur et la combinaison gagnante, et qui est à sa place.

Répondre à Fragma

9

kij_82, le 22 nov 2006 à 17:44:27

Bon sinon, la partie :

for (i=0; i<4; i++)
  srand(time(0));
  do{ 
  	x=rand()%(10000);
    itoa(x,combinaison_gagnante,10);
    
    valide=1;
    i=1;


je me suis dit que tu voulais peut etre plutot faire un truc du genre :
for (i=0; i<4; i++){
  srand(time(0));
  do{ 
  	x=rand()%(10000);
    itoa(x,combinaison_gagnante,10);
    
    valide=1;
    i=1;


et dans ce cas, faudrait renommé ton deuxieme i en autre chose sinon ca boucle. ~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

11

Fragma, le 22 nov 2006 à 17:54:25

EDIT: euh atta' que je lise l'aut' message d'abord :))

Répondre à Fragma

10

kij_82, le 22 nov 2006 à 17:49:50

Bon sinon, la partie :

for (i=0; i<4; i++)
  srand(time(0));
  do{ 
  	x=rand()%(10000);
    itoa(x,combinaison_gagnante,10);
    
    valide=1;
    i=1;


je me suis dit que tu voulais peut etre plutot faire un truc du genre :
for (i=0; i<4; i++)<b>{</b>
  srand(time(0));
  do{ 
  	x=rand()%(10000);
    itoa(x,combinaison_gagnante,10);
    
    valide=1;
    i=1;


et dans ce cas, faudrait renommé ton deuxieme i en autre chose sinon ca boucle. ~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

12

Fragma, le 22 nov 2006 à 18:04:37

En fait le srand ça sert à éviter qu'il y ait la même suite de nombres successivement .. m'enfin .. euh peut-être qu'il faut qu'elle soit hors boucle ...

Répondre à Fragma

13

kij_82, le 23 nov 2006 à 10:48:05

Généralement le srand est mis hors boucle !
En fait le srand n'est pas vraiment aléatoire il me semble, il peut te faire la même suite de nombre d'un coup à l'autre, donc mieux vaut l'initialiser une fois au départ, puis demander un chiffre à chaque passage de boucle.

Toujours est-il que ton code est louche... ta boucle for (i = 0; i < 4; i++ ) ne doit-elle pas englober la partie juste en dessous servant à initialiser ta solution de départ. Enfin... c'est ce qui me semble etre le plus logique apres je me trompe peut etre aussi.
Pour ce qui est de la syntaxe, ca fait un bail que j'ai pas fais de C donc je peux pas dire grand chose la dessus, mais pour ce qui est de l'algo...

Un petit coup de pouce, faut que tu mettes des commentaires dans ton code (anglais c'est mieux, mais francais ca passe aussi) afin que ceux qui reprennent ton code derrière (ou ceux qui veulent t'apporter de l'aide ;) ) puissent comprendre assez facilement de quoi il retourne et pourquoi tu as choisi tel algo et pas un autre par exemple.

Ensuite, pour ce qui est du débugage, rien de tel qu'une bonne méthode maison pour tracer d'ou viens l'erreur :
Dans chaque passage (if , else, while, etc...) tu met une trace évoquante
De cette manière, en lancant ton appli, tu peux suivre ou en est ton prog lors de l'execution, et dans ton cas présent, connaitre la dernière trace avant l'erreur ou la boucle infinie :)
Donc écrit tout ca, lance ton programme (et fais ctrl+C ou D je sais plus, pour l'arreter dans sa boucle infinie), regarde les traces et vois ou la boucle se produit (affiche les valeurs en meme temps pour voir a quoi est du le bouclage (genre variable qui ne s'incrément pas).

Bon courage :)
++
~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

14

emsiste, le 15 mai 2007 à 01:46:18
  • +1

Ben voila pr que la chaine n'accepte que des chiffres , voila le traitement
for(i=0;i<n;i++)
{if(isdigit (ch[i])
//traitement
else
//error
}
un ptit exemple qui repd a ta question may be :d

Répondre à emsiste

15

 hajine, le 3 avr 2008 à 19:19:48

Svp vous pouvez m'aider à écrire le programme en langage c du jeu mastermind

Répondre à hajine