Plusieurs remarques, certaines mineures, d'autres moins, en vrac :
#define nocurseur _setcursortype(_NOCURSOR)
#define curseur _setcursortype(_NORMALCURSOR)
#define solide _setcursortype(_SOLIDCURSOR)
#define champ textbackground(CYAN)
#define champnormal textbackground(BLUE) |
Les identifiants débutant par un underscore (car. _ ) sont réservés.
Il est donc déconseillé de les utiliser, surtout en leur attribuant des noms pouvant potentiellement se retrouver dans un bon millier de bibliothèques différentes.
Une autre convention presque universellement utilisée, est celle disant que les macros sont en majuscules. Comme ça on sait qu'il s'agit d'une macro, et non d'une variable (ex : FILENAME_MAX dans stdio.h).
Evite également les mélanges français/anglais, déstabilisant. Ca paraît mineur, mais en fait ça ne l'est pas : lorsque tu as une bonne convention de nommage, le programme devient beaucoup plus lisible, et ça, c'est important.
Et à propos de lisibilité dans le code, par pitié, soigne tes indentations !
Certaines portions de ton code sont illisibles juste à cause de cela, on perd un temps précieux à déchiffrer !
struct joueur
{
char nom[20],prenom[20];
int age;
long score;
}; |
Utilise plutôt :
typedef struct {
char nom[20],prenom[20];
int age;
long score;
} joueur;
Ce qui te permettra d'utiliser le type "joueur" directement, plutôt que "struct joueur".
De même, pense mieux tes typages : un âge ne peut être négatif, donc unsigned semble plus indiqué. Et un nom de plus de vingt caractères, j'en connais plusieurs dans mon entourage.
Surement pas.
main() a deux prototypes définis par la norme :
int main(void);
et
int main (int, char**);
La fonction main() doit obligatoirement retourner un entier (le code retour du programme, idéalement zéro pour indiquer que tout s'est bien déroulé).
Si ton compilateur l'accepte (et s'il est bien réglé, il devrait néanmoins émettre un warning), alors il ajoute pour toi un retour à zéro.
Deux constantes sont définies par la norme, afin de standardiser tout ça, dans stdlib.h : EXIT_SUCCESS et EXIT_FAILURE.
if (level==1) //commencer
{
id(&info); //saisie des donnees du joueur
infojeux(); //information du deroulement de jeux
commencer(&info,&newquestion); //debut du jeux
}
if(level==2) //ajouter des questions
{
question(&newquestion);
}
if(level==3)
{
highscore();
} |
switch...case for teh win !
switch(level)
{
case 1 :
id(&info);
...
break;
case 2 :
...
break;
default :
...
}
char min[27]={'a','z','e','r','t','y','u','i','o','p','q','s','d','f','g','h','j','k','l','m','w','x','c','v','b','n',' '}; |
const char *min = "aertyuiopqsdfghjklmwxcvbn";
(je ne m'étendrais pas sur les choix douteux de l'algorithme )
Spoiler :
while(!feof(randomquestion) && sw==0) |
Non.
feof() sert simplement à l'identification de la fin d'une lecture de flux. Elle ne sert pas à détecter une fin de lecture, pour cela, il faut tester le code retour des fonctions de lecture (dans ton cas, fread() ).
randomquestion=fopen("quest.duf","rb" );
if(randomquestion) |
Comme ça, au pif et au hasard, je dirais : "mets un else avec un printf() d'erreur, parce que s'il n'ouvre pas le fichier, il reviendra au début sans rien te dire".
Ce qui, bizarrement, est le symtome de ton problème.
(ton fichier est-il trouvé par le programme ? y a-t-il les droits de lecture, etc ?)
Bref, il manque aussi une bonne gestion d'erreur à ton code source.
Dans l'ensemble il reste énormément de choses à dire, mais cela demandrait beaucoup de temps de décortiquer intégralement ton programme pour t'expliquer tes erreurs. Temps nécessaire principalement par le côté fouilli du dit programme, mais bon, on a tous commencé par ce genre d'horreur (ne le prend pas mal, si je te montrais mes premiers codes sources... )