Débutant, je suis en train de lire "Apprenez à programmer en C" de Mathieu NEBRA, et à toutes fins utiles je propose mon code pour le premier TP.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int nombreMystere = 0,nombreEntre = 0, compteur = 0 ,continuer = 1, nombreDeJoueurs =1, difficulte=1, max=10, min =1;
srand(time(NULL));
printf("*******Plus ou Moins*******\n\n");
printf("Choisissez la difficulte\n\n");
printf("1. Facile\n\n");
printf("2. Moyen\n\n");
printf("3. Difficile\n\n");
scanf("%d",&difficulte);
printf("Choisissez le nombre de joueurs\n\n");
printf("1. Un joueur \n\n", &nombreDeJoueurs);
printf("2. Deux joueurs \n\n", &nombreDeJoueurs);
scanf("%d",&nombreDeJoueurs);
if (difficulte==1)
{
max =10, min = 1;
}
if (difficulte==2)
{
max =100, min = 1;
}
if (difficulte==3)
{
max =1000, min = 1;
}
if (nombreDeJoueurs==1)
{
do
{
nombreMystere = (rand()%(max - min +1)) + min;
do
{
printf ("quel est le nombre mystere ?\n");
scanf("%d",&nombreEntre);
compteur++;
if (nombreEntre<nombreMystere)
printf("c'est plus\n") ;
else if(nombreEntre>nombreMystere)
printf("c'est moins\n") ;
else
printf("c'est bon ! De la %d eme fois !\n", compteur) ;
}
while (nombreEntre!=nombreMystere);
compteur-=compteur;
printf("Souhaitez vous rejouer ?\n\n");
printf("1.Continuer\n\n");
printf("2.Quitter\n\n");
scanf("%d",&continuer);
}
while(continuer==1);
}
else
{
do
{
if (difficulte==1)
{
printf("Veuillez entrer le nombre mystere entre 1 et 10 :",&nombreMystere);
scanf("%d",&nombreMystere);
do
{
printf("Veuillez entrer le nombre mystere entre 1 et 10 :",&nombreMystere);
scanf("%d",&nombreMystere);
}
while (nombreMystere>10);
}
if (difficulte==2)
{
printf("Veuillez entrer le nombre mystere entre 1 et 100 :",&nombreMystere);
scanf("%d",&nombreMystere);
do
{
printf("Veuillez entrer le nombre mystere entre 1 et 100 :",&nombreMystere);
scanf("%d",&nombreMystere);
}
while (nombreMystere>100);
}
if (difficulte==3)
{
printf("Veuillez entrer le nombre mystere entre 1 et 1000 :",&nombreMystere);
scanf("%d",&nombreMystere);
do
{
printf("Veuillez entrer le nombre mystere entre 1 et 1000 :",&nombreMystere);
scanf("%d",&nombreMystere);
}
while (nombreMystere>1000);
}
do
{
printf ("quel est le nombre mystere ?\n");
scanf("%d",&nombreEntre);
compteur++;
if (nombreEntre<nombreMystere)
printf("c'est plus\n") ;
else if(nombreEntre>nombreMystere)
printf("c'est moins\n") ;
else
printf("c'est bon ! De la %d eme fois !\n", compteur) ;
}
while (nombreEntre!=nombreMystere);
compteur-=compteur;
printf("Souhaitez vous rejouer ?\n\n");
printf("1.Continuer\n\n");
printf("2.Quitter\n\n");
scanf("%d",&continuer);
}
while(continuer==1);
}
return 0;
}
printf("1. Un joueur \n\n", &nombreDeJoueurs);
printf("2. Deux joueurs \n\n", &nombreDeJoueurs);
Ligne 62 je comprend pas la soustraction, j'aurai réinitialiser cette variable à la valeur 0.
Ligne 77, 90 et 103, je comprend pas l'affichage avec des adresses et ce que tu souhaites en faire.
- Edité par fred1599 18 mars 2023 à 16:40:58
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
> Débutant, je suis en train de lire "Apprenez à programmer en C" de Mathieu NEBRA, et à toutes fins utiles je propose mon code pour le premier TP.
Le mieux, c'est de commencer par demander l'avis du compilateur sur le code en question. Pour ça, il suffit de mettre les options à la compilation :
$ gcc -Wall -Wextra jeu.c
jeu.c: Dans la fonction « main »:
jeu.c:19:12: attention: trop d'arguments pour le format [-Wformat-extra-args]
19 | printf("1. Un joueur \n\n", &nombreDeJoueurs);
| ^~~~~~~~~~~~~~~~~~~
jeu.c:20:12: attention: trop d'arguments pour le format [-Wformat-extra-args]
20 | printf("2. Deux joueurs \n\n", &nombreDeJoueurs);
| ^~~~~~~~~~~~~~~~~~~~~~
jeu.c:77:20: attention: trop d'arguments pour le format [-Wformat-extra-args]
77 | printf("Veuillez entrer le nombre mystere entre 1 et 10 :",&nombreMystere);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jeu.c:81:28: attention: trop d'arguments pour le format [-Wformat-extra-args]
81 | printf("Veuillez entrer le nombre mystere entre 1 et 10 :",&nombreMystere);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jeu.c:90:20: attention: trop d'arguments pour le format [-Wformat-extra-args]
90 | printf("Veuillez entrer le nombre mystere entre 1 et 100 :",&nombreMystere);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jeu.c:95:28: attention: trop d'arguments pour le format [-Wformat-extra-args]
95 | printf("Veuillez entrer le nombre mystere entre 1 et 100 :",&nombreMystere);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jeu.c:103:20: attention: trop d'arguments pour le format [-Wformat-extra-args]
103 | printf("Veuillez entrer le nombre mystere entre 1 et 1000 :",&nombreMystere);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jeu.c:108:28: attention: trop d'arguments pour le format [-Wformat-extra-args]
108 | printf("Veuillez entrer le nombre mystere entre 1 et 1000 :",&nombreMystere);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Si il raconte des trucs, c'est pas par plaisir d'allumer des pixels sur l'écran. Ce sont des indications sur d'éventuels problèmes : à lire et à prendre en considération. Le compilateur est là pour AIDER.
Remarque : le cours n'attire pas l'attention là-dessus. Une des nombreuses raisons qui font que c'est un mauvais cours, malheureusement.
Fred, pour lignes 77, 90, 103 ainsi que les deux premières, les affichages de ces adresses sont des erreurs de ma part, ça ne sert en effet strictement à rien !
Pour la ligne 62 le but est en effet de remettre la variable à 0, c'est la solution que j'ai trouvée.
Michel, je ne connaissais pas cette utilisation du compilateur, je regarderai.
- Edité par Syntax_Error1978 18 mars 2023 à 17:29:23
Une autre chose importante est d'utiliser fréquemment le re-formattage de code, facilité désormais proposée par tout IDE de ce siècle.
Non, ça ne reformatte pas le disque dur : ça remet d'aplomb le code en décalant les lignes juste ce qu'il faut vers la droite. Ca donne du code qui est plus agréable à lire, et dans lequel il est beaucoup plus facile d'aller retrouver le { qui correspond au } 10 lignes plus loin (les deux choses sont liées).
if (nombreDeJoueurs==1)
{
do
{
nombreMystere = (rand()%(max - min +1)) + min;
do
{
printf ("quel est le nombre mystere ?\n");
scanf("%d",&nombreEntre);
compteur++;
if (nombreEntre<nombreMystere)
printf("c'est plus\n") ;
else if(nombreEntre>nombreMystere)
printf("c'est moins\n") ;
else
printf("c'est bon ! De la %d eme fois !\n", compteur) ;
}
while (nombreEntre!=nombreMystere);
compteur-=compteur;
printf("Souhaitez vous rejouer ?\n\n");
printf("1.Continuer\n\n");
printf("2.Quitter\n\n");
scanf("%d",&continuer);
}
while(continuer==1);
}
en
if (nombreDeJoueurs==1) {
do {
nombreMystere = (rand()%(max - min +1)) + min;
do {
printf ("quel est le nombre mystere ?\n");
scanf("%d",&nombreEntre);
compteur++;
if (nombreEntre<nombreMystere)
printf("c'est plus\n") ;
else if(nombreEntre>nombreMystere)
printf("c'est moins\n") ;
else
printf("c'est bon ! De la %d eme fois !\n", compteur) ;
} while (nombreEntre!=nombreMystere);
compteur-=compteur;
printf("Souhaitez vous rejouer ?\n\n");
printf("1.Continuer\n\n");
printf("2.Quitter\n\n");
scanf("%d",&continuer);
} while(continuer==1);
}
> Pour la ligne 62 le but est en effet de remettre la variable à 0, c'est la solution que j'ai trouvée.
En ayant l'esprit moins tordu, pour mettre une variable à zéro
@Syntax_Error1978: Tu ne trouves pas qu'il y a des choses qui se répètent dans ton code? Par exemple, la demande et l'assignation des difficultés. Ou le jeu lui-même? As-tu appris les fonctions? Ou les tableaux?
- Edité par PierrotLeFou 18 mars 2023 à 18:12:43
Le Tout est souvent plus grand que la somme de ses parties.
Dans le cours en question, les fonctions viennent après....
Mais même sans fonctions, les comparaisons dans les 3 niveaux de difficulté pourraient se faire avec la variable max, qui vaut 10, 100 ou 100 selon les cas.
Les 34 lignes 77 à 110 se ramèneraient à :
do {
printf("Entrez un nombre entre %d et %d\n", min, max);
scanf("%d", &nombre_mystere);
} while (nombre_mystere < min || nombre_mystere > max);
Je me demande si c'est le cours qui à la mauvaise idée de leur faire écrire
Il y aurait aussi besoin d'un do....while autour des lignes 132 à 135 pour vérifier l'entrée utilisateur. Car si on donne autre chose que 1, le programme s'arrête. Or tu spécifies 1 .... 2 .... , il n'y a donc qu'un de ces deux choix qui soit valide.
- Edité par edgarjacobs 18 mars 2023 à 20:27:01
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" conjugué à la 3ème personne de l'indicatif présent
Globalement le programme pourrait ressembler à ceci:
do { // Demander la difficulté et obtenir max (min vaut toujours 1) // Demander si un ou deux joueurs. // Si un joueur obtenir le nombre mystère avec rand() // Si deux joueurs, demander le nombre à l'autre joueur (pas besoin de if ici, on connait déjà max) // Faire le jeu // Demander si on veut continuer } while(continuer == 1);
En supposant que difficulte soit valide, on peut obtenir max sans if avec un tableau:
int tableauDifficultes[3] = {10, 100, 1000}; int max = tableauDifficultes[difficulte - 1]; // Si difficulte vaut 1, 2 ou 3
Le Tout est souvent plus grand que la somme de ses parties.
si pour les difficultés 1, 2 et 3 on a des limites de 10, 100 et 1000 alors on a :
max = 10^diffculté;
Il faut apprendre à voir quand une fonction mathématique de "base" est capable de répondre à tes besoins.
Quand on voit que le max est un 1 suivi d'autant de 0 que la difficulté, ça devrait interpeller.
Et si min vaut toujours 1, alors il suffit de le mettre à un au début une bonne fois pour toute, et même, si c'est une constante, alors on en fait une constante, les variables sont pour ce qui varie.
Tu peux factoriser un peu ton code et le réduire de moitié au moins. La boucle de jeu est la même qu'il y ait un ou 2 joueurs, la seule différence est la création du nombre mystère. Donc si tu générais le nombre mystère avant la boucle, tu n'en aurais qu'une sans avoir à faire la différence entre le nombre de joueurs.
J'ai suggéré un tableau où justement les valeurs ne seraient pas une puissance de 10. Pour une puissance de 10, on peut le faire facilement sans fonction (comme pow() ). int max = 10; for(int i = 1; i < difficulte; i++) max *= 10;
Le Tout est souvent plus grand que la somme de ses parties.
Les niveaux de difficulté étant fixés et en petit nombre, la meilleure solution me semble être celle du tableau.
Arguments
Le moins de code
Pas besoin de réfléchir pour les retrouver
Par ailleurs,
que ça soit des puissances de 10 successives, c'est fortuit. Les niveaux seraient 10, 20, 50, 100 200, 500... la solution calculatoire tombe direct à l'eau
Pour un jeu plus souple, on peut imaginer charger les coefficients (et le texte des messages ?) depuis un fichier de config.
Conseil :
À ce stade, se contenter de nettoyer le code
Pour une restructuration plus sérieuse, attendre d'avoir plus d'éléments du langage dans sa boite à outils. Découpage en fonctions surtout.
Avec les fonctions, un bon exercice sera d'extraire du code un maximum de fonctions qui réalisent une action
Significative
Non triviale.
Par exemple
int nombre_aleatoire_entre(int min, ont max);
int demander_entier(char message[], int min, int max);
Si on veut compliquer un peu l'algorithme du jeu : pour chaque niveau fixer une limite au nombre de tentatives.
Je l'ai nettoyé un peu hier j'ai trouvé des instructions qui doublonnaient, par exemple :
if (difficulte==2)
{
printf("Veuillez entrer le nombre mystere entre 1 et 100 :",&nombreMystere);
scanf("%d",&nombreMystere);
do
{
printf("Veuillez entrer le nombre mystere entre 1 et 100 :",&nombreMystere);
scanf("%d",&nombreMystere);
}
while (nombreMystere>100);
Je ferai évoluer mon code à mesure que j'avance dans le cours.
- Edité par Syntax_Error1978 20 mars 2023 à 12:21:35
Comme je l'ai mentionné, il est déjà possible de simplifier le code même si on ne connait pas les fonctions. Je pense que ce serait un bon exercice. Ce sera plus facile de passer aux fonctions quand le code sera bien structuré.
Le Tout est souvent plus grand que la somme de ses parties.
Non seulement ça doublons mais ça ne marche pas et ça pose la question de la manière de tester.
Solution : pour les tests de bon fonctionnement faire afficher le nombre aléatoire. Sinon on ne peut pas voir si les saisies et comparaisons ont fonctionné correctement.
On enlève cet affichage de tricheur APRES les tests, quand on en est à la livraison au client.
- Edité par michelbillaud 20 mars 2023 à 16:32:55
TP plus ou moins
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" conjugué à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
Bonhomme !! | Jeu de plateforme : Prototype.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.