Bonjour, je souhaiterai amelioré mon programme du jeu plus ou moins. J'ai tout fait pour empêcher mon programme d'avoir des problème notamment sur quelque points. J'ai , de fait , modifié tout les entier par des caractère grâce au scanf() . en effet si par malheur vous tape un "a" a la place d'un chiffre de type int. le programme s'emballe et réalise une boucle infinis ce qui n'est pas voulu. Et je ne peux pas faire un tableau de char car si on dépasse le nombre maximum , le programme s'emballe aussi.
J'ai donc resolut une grande quantité de probleme , cependant j'ai lu que le fait que fait de depasser le nombe max d'une chaine de caratére pouvait pauser des souci.
Ainsi comment amelioré mon jeu plus ou moins pour le rendre encore plus performants. Merci d'avance.
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<conio.h>
#include <stdbool.h>
int main(void)
{
char Choose[30];
char Difficult[25];
char Max[6];
int Dmax;
int i=0;
int VA;
int ChercheVA;
char NbA[30];
int j=0;
int verifVAJ2=1;
char Valtape[30];
char Again[30];
int Cptessai=0;
bool Verif1=0;
srand(time(NULL));
do
{
Verif1=1;
Choose[1]='\0';
printf(" \n Si vous voulez jouer seul taper 1 sinon taper 2 \n ");
scanf("%30s",Choose);
getchar();
if(Choose[0] =='1' )
{
break;
}
if(Choose[0] =='2')
{
break;
}
else
{
printf(" \n vous avez mal compris! ");
Verif1=0;
}
}while( (Choose[0] !='1' || Choose[0] !='2') && (Verif1==0));
printf("\n Vous avez choisi %c joueur(s)",Choose[0]);
do{
do{ // boucle qui va decide de la difficulté du programme
Verif1=1;
printf("\n saississez le niveau de difficulte");
printf(" \n niveau 1 , le nombre est compris entre 1 et 100 ");
printf(" \n niveau 2 , le nombre est compris entre 1 et 1000 ");
printf(" \n niveau 3 , le nombre est compris entre 1 et 10000 \n");
printf("\n");
scanf("%25s",Difficult);
getchar();
if(Difficult[0]=='1')
{
Max[0]='1';
Max[1]='0';
Max[2]='0';
Max[3]='\0';
break;
}
if(Difficult[0]=='2')
{
Max[0]='1';
Max[1]='0';
Max[2]='0';
Max[3]='0';
Max[4]='\0';
break;
}
if(Difficult[0]=='3')
{
Max[0]='1';
Max[1]='0';
Max[2]='0';
Max[3]='0';
Max[4]='0';
Max[5]='\0';
break;
}
else
{
printf("\n Vous vous etes trompe");
Verif1=0;
}
}while( (Difficult[0] != '1' || Difficult[0] != '2' || Difficult[0] != '3') && (Verif1==0));
printf("\n votre niveau de difficulte est :%c ",Difficult[0]);
Dmax= atoi(Max);
printf("\n la valeur maximum au nv de difficulte %c est %d ",Difficult[0],Dmax);
if(Choose[0]=='1') // si il y a un joueur , l'ordinateur crée une variable aleatoire
{
VA=rand()%(Dmax);
}
i=0;
if(Choose[0]=='2') //si il y a 2 jjoueur , le joueur va devoir crée un nombre par rapport au niveau de diff
{
do{
do{
printf("\n taper un nombre entre 0 et %d ",Dmax);
scanf("%30s",NbA);
while(NbA[i] != '\0' )
{
verifVAJ2=1;
printf("\n %c",NbA[i]);
if( !(NbA[i]>=0x30 && NbA[i]<=0x39) )
{
verifVAJ2=0;
printf(" \n il y a erreur , veuiller retaper un nombre ");
break;
}
i++;
}
}while(verifVAJ2==0);
NbA[i+1]='\0';
VA =atoi(NbA);
}while(VA>Dmax);
printf(" \n l'unconnue que devra trouver l'autre joueur sera %d ",VA);
}
Cptessai=0;
i=0;
j=0;
do{ //creation d'une boucle qui va etudié le nombre tapé.
do{ //creation d'une bouce ui va créer le nombre tapé
printf("\n taper votre nombre entre 0 et %d \n:",Dmax);
scanf("%30s",Valtape);
while(Valtape[j] != '\0' )
{
verifVAJ2=1;
if( !(Valtape[j]>='0' && Valtape[j]<=0x39) )
{
verifVAJ2=0;
printf(" \n il y a erreur , veuiller retaper un nombre ");
break;
}
j++;
}
}while(verifVAJ2==0);
Valtape[j+1]='\0';
ChercheVA = (int) atoi(Valtape);
printf("\n tu as bien tape %d",ChercheVA);
if(ChercheVA > VA)
{
printf("\n Trop haut");
}
if(ChercheVA<VA)
{
printf("\n Trop bas");
}
if(ChercheVA==VA)
{
printf("\n bravo tu as reussi au bout de %d coup ",Cptessai+1);
break;
}
Cptessai++;
j=0;
}while(ChercheVA !=VA);
do{
Again[2]='\0';
printf("\n si vous voulez recommencer une partie tape 1, sinon tape 2");
printf("\n faites votre choix : \n");
scanf("%25s",Again);
}while((Again[0] !='2'|| Again[0] != '1')&& !(Again[2]=='\0'));
if(Again[0]=='1')
{
printf("\n Vous allez rejouez , preparez vous :");
system("pause");
system("cls");
}
}while(Again[0] =='1');
}
Le probleme a été justement resolut avec des scanf() , cependant , lorsque je tape plusieurs caractére , il passe deux fois dans ma boucles et non qu'une seule fois.... sinon tout les autres beug on été resolut
J'avais aussi cette question pourquoi lorsque je fais une scanf("%d",) et que je met une lettre par erreur le programme realise une boucle infinie ?
PierrotLeFou a écrit:
Tu trouveras une piste de solution dans le lien suivant:
Ce qui serai top aussi dans ton programme serai de parser ton code en plusieurs fonctions pour suivre le principe de responsabilité unique (une fonction qui réalise une tâche). C'est un petit plus mais pour la suite ça te sera très utile.
non je me suis arreter a SDL car pour l'instanst je prefere me consacrer a du langage C simple ett basique pour bien approfondir les bases . Mais en effet j'ai pensé a reliser des fonction cependant je voyais pas trop comment m'y prendre ...
Je pense déjà que tu pourrais améliorer ton programme en créant des fonctions qui réalisent chacune un travail spécifique: afficher, lire, calculer, parce que sinon on a du mal à lire ton code.
Sur le site, juste après le TP il y a le cours sur les fonctions, et juste après ils proposent de nouveau d'améliorer le TP.
Tu pourrais y jeter un œil, cela pourrait t'aider. J'ai fait hier le même TP, après je ne sais pas ce que cela vaut je débute.
Malgré tout pour les conditions pour m'assurer que la personne ne ce soit pas pas trompé, je propose de taper Y (pour YES) et je teste Y ou y mais pas plus. Si une autre touche est entrée je considère que l'on sort de la boucle. Cela permet d'avancer en débutant.
Je mets mon code ci-dessous, comme je disais je débute c'est à titre d'information (le programme est en C):
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int level ()
{
const int MIN = 1;
int mystery;
int go = 1;
int MAX = 1;
char level = 'a';
printf("Which level do you want to play ? \n");
printf("Easy, Medium or Hard \n");
printf("Enter E for Easy, M for Medium or H for Hard \n");
scanf("%s", &level);
while (go)
{
if (level == 'E' || level =='e' || level == 'M' || level == 'm' || level == 'H' || level == 'h')
{
go = 0;
if (level == 'E' || level == 'e')
MAX = 10;
else if (level == 'M' || level == 'm')
MAX = 100;
else if (level == 'H' || level == 'h')
MAX = 1000;
else
printf("Error");
}
else
{
printf("Wrong choice, enter again a level selection \n");
scanf("%s", &level);
}
}
srand((int)time(NULL));
mystery = (rand()% (MAX + 1 - MIN)) + MIN;
return mystery;
}
void game()
{
int mystery;
int go = 1;
int count = 0;
mystery = level();
do
{
int choice;
printf("Which is the correct number ? ");
scanf("%d", &choice);
++count;
printf("try %d", count);
if(mystery>choice)
printf("\t It is more \n\n");
else if (mystery<choice)
printf("\t It is less \n\n");
else
{
printf("\t Congratulation ! In %d times \n\n", count);
go = 0;
}
} while(go);
}
void multiplayer(int player)
{
for (int i = 0; i < player; i++)
{
printf("Player %d your turn ! Let's go ! \n", i + 1);
game();
}
}
int main(int argc, const char * argv[])
{
int newGame = 1;
char reply = 'y';
int player = 0;
printf("How many players ? \n");
scanf("%d", &player);
while(newGame)
{
multiplayer(player);
printf("Do you want to play a new game ? \n");
printf("If yes enter Y, otherwise enter N \n");
scanf("%s", &reply);
if ((reply =='Y') || (reply =='y'))
newGame = 1;
else
{
printf("See you soon ^_^ \n");
newGame = 0;
}
}
return 0;
}
Je n'avais pas vu encore les chaînes de caractère.
J'ai bien saisi la différence entre %c et %s, en cherchant sur internet j'ai compris que %s induit un pointeur.
Je n'avais pas vu ce chapitre encore. D'autre part je programme sur Xcode et le compilateur ne m'a mis aucun message d'erreur.
J'ai repris le code et je l'ai modifié: j'ai intégré un switch, j'ai remplacé une boucle while par un do...while et j'ai modifié les fonctions pour travailler sur ce sujet.
Par contre maintenant il y a une erreur que je n'arrive pas à trouver.
Quand le joueur souhaite refaire x parties, il clique chaque sur 1 pour rejouer dans la fonction newGame().
Quand il finit par cliquer sur 0 pour arrêter j'ai finalement x fois le message qui demande de choisir son choix pour arrêter, alors que normalement avec le premier 0 on devrait sortir de la boucle. Je n'arrive pas à trouver l'erreur. Si quelqu'un pourrait m'aider ? Merci par avance
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int numberGeneration(const int MIN, const int MAX);
void level(void);
void game(const int MIN, const int MAX);
void newGame(void);
void multiplayer(int player);
int numberGeneration(const int MIN, const int MAX)
{
srand((int)time(NULL));
return ((rand()% (MAX + 1 - MIN)) + MIN);
}
void level(void)
{
int level;
printf("===================================\n");
printf(" \n");
printf(" GAME \n");
printf(" \n");
printf("Which level do you want to play ? \n");
printf("Press: 1 for Easy (1 to 10) \n");
printf(" 2 for Medium (1 to 100) \n");
printf(" 3 for Hard (1 to 1000) \n");
printf(" \n");
printf("===================================\n");
printf("Select your choice here --> ");
scanf("%d", &level);
printf("\n");
switch (level)
{
case 1:
game(1,10);
break;
case 2:
game(1,100);
break;
case 3:
game(1,1000);
break;
default:
printf("Invalid key\n");
break;
}
}
void game(const int MIN, const int MAX)
{
int mystery;
int go = 1;
int count = 0;
mystery = numberGeneration(MIN,MAX);
do
{
int choice;
printf("Which is the correct number ? ");
scanf("%d", &choice);
++count;
printf("try %d", count);
if(mystery>choice)
printf("\t It is more \n\n");
else if (mystery<choice)
printf("\t It is less \n\n");
else
{
printf("\t Congratulation ! In %d times \n\n", count);
go = 0;
}
} while(go);
newGame();
}
void newGame()
{
int newGame = 1;
while(newGame)
{
printf("Do you want to play a new game ? \n");
printf("1 for yes, 0 for no \n");
printf("Select your choice here --> ");
scanf("%d", &newGame);
printf("\n");
if (newGame == 1)
level();
else
newGame = 0;
}
}
void multiplayer(int player)
{
for (int i = 0; i < player; i++)
{
printf("\nPlayer %d your turn ! Let's go ! \n", i + 1);
level();
}
}
int main(int argc, const char * argv[])
{
int player = 0;
printf("How many players ? Enter a number here --> ");
scanf("%d", &player);
multiplayer(player);
printf("See you soon ! \n\n");
return 0;
}
D'accord avec le principe. Mais comme il a déjà posté son code, se serait inutile de recommencer ailleurs.
@MathieuSeligmann:
C'est une bonne idée que de faire des fonctions. Mais il ne faut pas en faire pour le plaisir d'en faire.
Ta fonction numberGeneration est presque inutile si tu enlèves l'appel à srand().
Pour régler ton problème de récursivité et puisque game est toujours appelé avec MIN = 1, je suggère que level() n'appelle pas game mais retourne le maximum.
Je remplacerais l'appel à newGame par une boucle do ... while qui envelopperait celle qui est déjà là.
Je suis même surpris que le compilateur accepte un nom de fonction (newGame) et une variable de même nom dans son code.
Le Tout est souvent plus grand que la somme de ses parties.
Je n'avais pas vu encore les chaînes de caractère.
J'ai bien saisi la différence entre %c et %s, en cherchant sur internet j'ai compris que %s induit un pointeur.
Je n'avais pas vu ce chapitre encore. D'autre part je programme sur Xcode et le compilateur ne m'a mis aucun message d'erreur.
J'ai repris le code et je l'ai modifié: j'ai intégré un switch, j'ai remplacé une boucle while par un do...while et j'ai modifié les fonctions pour travailler sur ce sujet.
Par contre maintenant il y a une erreur que je n'arrive pas à trouver.
Quand le joueur souhaite refaire x parties, il clique chaque sur 1 pour rejouer dans la fonction newGame().
Quand il finit par cliquer sur 0 pour arrêter j'ai finalement x fois le message qui demande de choisir son choix pour arrêter, alors que normalement avec le premier 0 on devrait sortir de la boucle. Je n'arrive pas à trouver l'erreur. Si quelqu'un pourrait m'aider ? Merci par avance
salut,
Ton dernier code est bien mieux que le premier
Mais il y a encore quelles petites choses à virer du code (ou rajouter) :
- des booléens (stdbool existe !) : "newGame == 1" est à bannir de tous tes codes ! ça a aucun sens ! Alors qu'avec un booléen (le best) "newGame == false" est plus claire, avec une macro ou enum "newGame == NON" (pas d'idée de nom ^^') est aussi claire (mais un peu moins à mon goût)
- des macros (je ne sais si tu en avais besoin ici)
- des commentaires !! Personnellement je commente toujours mes prototypes au format doxygen pour que ce très clair pour moi et les utilisateurs de mon code. Et aussi je préfère envoyer balader mes définitions de fonctions en bas du fichier car on s'en fout de la définition d'une fonction (on va la voir seulement lors de sa création ou son débogage, autrement c'est le signe d'un code mal fait). Seul les prototypes, types et le main sont important, le reste on ira le chercher au ctr+F si besoin.
- Faire gaffe au nom des variables (newGame est à la fois une fonction et une variable).
- Avoir des noms de fonctions plus explicite (qui traduit plus une action que décrire à quoi elle se rapporte)
Sache que faire de l'optimisation de ressources est encore loin, ne t'embête avec ça. Un code lisible sera toujours meilleur qu'un code efficace, concentre toi là-dessus
À mon avis, quand on débute, on ne doit pas trop s'embêter à essayer de rendre son code parfait. Le principal est de comprendre ce qu'on a fait et de pouvoir le ré-utiliser. Il y a sûrement mille et une suggestion à faire pour MathieuSeligmann mais je lui conseillerais plutôt de passer au chapitre suivant...
À mon avis, quand on débute, on ne doit pas trop s'embêter à essayer de rendre son code parfait. Le principal est de comprendre ce qu'on a fait et de pouvoir le ré-utiliser. Il y a sûrement mille et une suggestion à faire pour MathieuSeligmann mais je lui conseillerais plutôt de passer au chapitre suivant...
Rendre son code parfait est une chose, le rendre lisible en est une autre. S'il peut apprendre à faire un code lisible et clair maintenant ça lui en serra que plus bénéfique
Rendre son code parfait est une chose, le rendre lisible en est une autre. S'il peut apprendre à faire un code lisible et clair maintenant ça lui en serra que plus bénéfique
aucoup , car je regarde tout vos messages , je n'ai pas encore ton niveau rouloute quoi que je m'en rapproche. Mais merci d'avoir partagé ton programme et ton evolutions. De cette manière j'arrive a voir la démarche a voir .
Merci a tous de me permettre d'evoluer, je ne pensais pas que beaucoup de personnes etait dans mon cas de recherches et j'avais oublié mon propre post. Cela m'as redonné espoir alors Merci Beaucoup.
Du coup si je comprend bien dans mon cas precis il faudrait que je realise des fonctions et que j'ameliore mes scanf(). je partagerais mon programme futur pour l'instant l est loin d'etre fini. Merci a tous pour vos retours.
Effectivement je n'ai pas utilisé les booléens, je ne savais pas qu'il fallait les appeler avec #include <stdbool.h>
D'autre part je ne connaissais pas non plus enum. J'ai lu une explication sur la toile.
J'ai bien saisi son intérêt, merci.
Après j'ai toujours un problème dans le code que je n'arrive pas à résoudre.
Si je fais jouer 2 personnes et que le premier joueur joue deux fois d'affilés, j'ai deux fois le message pour quitter qui apparait alors que j'ai déjà renseigné 0 pour sortir, or le choix apparait deux fois, ce qui n'est pas normal.
Do you want to play a new game ?
1 for yes, 0 for no
Select your choice here --> 0
Do you want to play a new game ?
1 for yes, 0 for no
Select your choice here -->
Avec l'appel de la fonction newGame(), puis level(), je reviens dans la boucle while pour jouer à nouveau mais à la fin, en tapant sur 0, je devrais sortir de la boucle while.
Une dernière chose pour rendre ton code encore plus lisible. Tu peux ajouter des modules (que tu verras plus tard dans le cours). En bref, tu decoupes ton code en plusieurs fichiers ayant chacun une fonction / utilité dans le code et à l'intérieur tu regroupes toutes les fonctions pour réaliser cette fonctionnalité.
Pour ton code tu aurais :
- main : appel la boucle principale du jeu
- module de jeu : réalise toute la partie technique du jeu (tirage du nombre, plus/moin, gestion des joueurs, ...)
- module d'affichage : affiche le jeu, les menus, ...
Je sais que ça peut paraître un peu compliqué à comprendre mais c'est le meilleur code que tu puisse faire (même s'il est lourd pour juste un +/-) car tu dissocie l'affichage du jeu. Par conséquent tu pourras plus facilement changer de méthode d'affichage (je penese a la SDL)
storyboard : dans la fonction 'NbrJoueur', à quoi correspondent 'c' et 'V' ? Ça peut être utile de le mettre en commentaire.
Il me semble que le but de cette fonction est de retourner le nombre de joueurs. Donc elle doit être de type 'int' (ou 'unsigned int', ou autre variante, peu importe) et non 'void', et doit se terminer par « return <un nombre> ».
while( (c[0] !='1' || c[0] !='2')
Tu es sûr du || ? Si je tape '1', c[0] sera égal à '1', mais sera différent de '2', donc la condition sera vérifiée. Est-ce vraiment le but ? (Pour qu'elle ne soit pas vérifiée il faudrait que sa négation soit vraie, et sa négation est : c[0] == 1 et c[0] == 2. Bizarre...)
&& (c==0));
Ça aussi c'est bizarre. Là, je n'ai pas la moindre idée de ce que tu veux faire. ('c' a été défini comme pointeur, donc tu veux que l'adresse du pointeur soit l'adresse 0 ?)
× 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.
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
Un bon dev est un dev qui sait Googler
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Un bon dev est un dev qui sait Googler
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.
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
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.