Programmation/ Langage C

Résolu/Fermé
Dark-Beta69 Messages postés 71 Date d'inscription dimanche 5 juillet 2009 Statut Membre Dernière intervention 14 octobre 2009 - 8 août 2009 à 23:14
Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014 - 10 août 2009 à 00:31
Bonjour,
Ou plutôt Bonsoir :) !

Je suis en train d'apprendre a programmer en C, j'ai commencé hier soir, et j'ai a l'esprit quelque questions !
Pour le moment le seul programme que j'ai réaliser est le jeu du Plus ou moins (connut !). Je précise que j'utilise l'IDE Code::Blocks sous Windows XP Ed. Familial.

Je voudrais alors savoir :

1) Comment changer les couleur de police et d'arrière plan de la console MS-DOS dans un programme en C.

2) Savoir comment mettre sur mon Bureau un raccourcis de l'exécutable de mon programme.


EDIT : J'ai trouver, c'est dans bin/debug/etvoila. mais lorsque je lance l'exe et que je fini le jeu (gagné ou perdu), dès que le programme lit l'instruction "return 0;" la fenêtre se ferme instentanément, du coup on ne peut même pas voir si j'ai gagné ou perdu..why ? Ne peut-on pas m'être "pause" comme en batch ?



3) Et dernièrement (pour l'instant :p ), comment créer une instruction qui propose de recommencer une partie (Rejouer).

Toutes mes questions concerne ce code source :

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

int main()
{
int choixMenu;
int nombreMystere = 0;
int essaie = 0;
int nombreDessai = 10;
int nombreDevine = 0;
int MAX = 0, MIN = 0;
int LOTO = 0;
int maxL = 0, minL = 0;
int nombreDessaiH = 1;

printf( "\t\t\t\t=== MENU ===\n\n\n" );
printf( "\n 1.Niveau debutant\n" );
printf( "\n 2.Niveau intermediaire\n" );
printf( "\n 3.Niveau expert\n" );
printf( "\n 4.Loto !\n" );
printf( "\n 5.Mode HARD\n");
printf( "\n\n Votre choix ?\n Entrez le chiffre correspondant : " );
printf( "\n" );
scanf( "%d", &choixMenu);
printf("\n");

switch (choixMenu)

{


    //-----------------------------------------------------------------------------------------------------------



    case 1:
    MAX = 100, MIN = 1;
    printf( "\n Vous avez choisit debutant, le nombre mystere est compris entre 1 et 100\n" );
    srand (time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
printf ("\nDevinez le nombre mystere ! Vous possedez 10 essaie\n\n");

while (nombreDessai > 0)
{
    scanf ("%d" , &nombreDevine);
    if (nombreMystere> nombreDevine) { printf("Plus !\n"); nombreDessai-- ; essaie++ ; }
    if (nombreMystere< nombreDevine) { printf("Moins !\n"); nombreDessai-- ; essaie++ ; }
    if (nombreMystere!= nombreDevine) { printf("Il ne vous reste que %d essaie!\n", nombreDessai); }
    if (nombreMystere == nombreDevine) { printf("Felicitations ! Vous gagnez en %d coup !\n\n", essaie); return 0; }
}
printf("\t\t\t\tVous avez perdu !\n\n");

    return 0;
    break;



    //-----------------------------------------------------------------------------------------------------------



    case 2:
MAX = 250, MIN = 1;
    printf( "\n Vous avez choisit intermediaire, le nombre mystere est compris entre 1 et 250\n" );
    srand (time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
printf ("\nDevinez le nombre mystere ! Vous possedez 10 essaie\n\n");

while (nombreDessai > 0)
{
    scanf ("%d" , &nombreDevine);
    if (nombreMystere> nombreDevine) { printf("Plus !\n"); nombreDessai-- ; essaie++ ; }
    if (nombreMystere< nombreDevine) { printf("Moins !\n"); nombreDessai-- ; essaie++ ; }
    if (nombreMystere!= nombreDevine) { printf("Il ne vous reste que %d essaie!\n", nombreDessai); }
    if (nombreMystere == nombreDevine) { printf("Felicitations ! Vous gagnez en %d coup !\n\n", essaie); return 0; }
}
printf("\t\t\t\tVous avez perdu !\n\n");

    return 0;
    break;



    //-----------------------------------------------------------------------------------------------------------



    case 3:
MAX = 500, MIN = 1;
    printf( "\n Vous avez choisit expert, le nombre mystere est compris entre 1 et 500\n" );
    srand (time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
printf ("\nDevinez le nombre mystere ! Vous possedez 10 essaie\n\n");

while (nombreDessai > 0)
{
    scanf ("%d" , &nombreDevine);
    if (nombreMystere> nombreDevine) { printf("Plus !\n"); nombreDessai-- ; essaie++ ; }
    if (nombreMystere< nombreDevine) { printf("Moins !\n"); nombreDessai-- ; essaie++ ; }
    if (nombreMystere!= nombreDevine) { printf("Il ne vous reste que %d essaie!\n", nombreDessai); }
    if (nombreMystere == nombreDevine) { printf("Felicitations ! Vous gagnez en %d coup !\n\n", essaie); return 0; }
}
printf("\t\t\t\tVous avez perdu !\n\n");

    return 0;
    break;



    //-----------------------------------------------------------------------------------------------------------



    case 4:
    maxL = 47, minL = 1;
    MAX = 1000, MIN = 1;
    printf( "\n\n\tVous avez choisit le mode LOTO\n\nVous possedez un nombre aleatoire d'essaie !\nLe nombre mystere est compris entre 1 et 1000\n" );
    srand (time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
LOTO = (rand() % (maxL - minL + 1)) + minL;
printf ("\nDevinez le nombre mystere ! Vous possedez %d essaie\n\n", LOTO);
while (LOTO > 0)
{
    scanf ("%d" , &nombreDevine);
    if (nombreMystere> nombreDevine) { printf("Plus !\n"); LOTO-- ; essaie++ ; }
    if (nombreMystere< nombreDevine) { printf("Moins !\n"); LOTO-- ; essaie++ ; }
    if (nombreMystere!= nombreDevine) { printf("Il ne vous reste que %d essaie!\n", LOTO); }
    if (nombreMystere == nombreDevine) { printf("Felicitations ! Vous gagnez en %d coup !\n\n", essaie); return 0; }
}
printf("\t\t\t\tVous avez perdu !\n\n");

    return 0;
    break;



    //-----------------------------------------------------------------------------------------------------------



    case 5:
MAX = 100, MIN = 1;
    printf( "\n Vous avez choisit le mode HARD\nLe nombre mystere est compris entre 1 et 100\nEt vous n'avez que un seul essaie !\n" );
    srand (time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
printf ("\nDevinez le nombre mystere ! Vous possedez 1 essaie\n\n");

while (nombreDessaiH > 0)
{
    scanf ("%d" , &nombreDevine);
    if (nombreMystere> nombreDevine) { printf("Plus !\n"); nombreDessaiH-- ; essaie++ ; }
    if (nombreMystere< nombreDevine) { printf("Moins !\n"); nombreDessaiH-- ; essaie++ ; }
    if (nombreMystere!= nombreDevine) { printf("Il ne vous reste que %d essaie!\n", nombreDessaiH); }
    if (nombreMystere == nombreDevine) { printf("Felicitations ! Vous gagnez en %d coup !\n\n", essaie); return 0; }
}
printf("\t\t\t\tVous avez perdu !\n\n");

    return 0;
    break;


    //-----------------------------------------------------------------------------------------------------------






    default:
    printf( "\n Vous n'avez pas rentre un nombre correct, vous ne voulez pas jouez c'est ca !!?" );
    break;



    printf( "\n\n");
}
return 0;

//-----------------------------------------------------------------------------------------------------------
}

 


Merci beaucoup !

Cordialement,
Dark-beta69.

PS : Quelqu'un peut m'expliquer ces instructions :
 srand (time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;


On me les as données, j'ai compris comment les réutiliser, mes je ne sais pas ce quelles signifient.

Merci encore !

9 réponses

Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014 8
9 août 2009 à 01:14
salut
alors en ce qui concerne la couleur tu doit utilser system("color 80") : ici j'ai mis 80 pour du gris ou du noir je sais plus, mais si tu veu savoir quel couleur iil faut utiliser il te suffit d'aller dans paint dans l'outil pou les couleurs. tu regles ta couleur a partir des couleurs primaires RGB (exemple R=0, V=0, B=0, la tu aura du noir).
en ce qui concerne le'instruction pour recommencer une partie ben je te propose de faire:
printf(" Voulez vous faire une autre partie?\n");
printf("oui(1) ou non(2)");
scanf("%d", &reponse);
fflush(stdin);
if(reponse==OUI)
{
system("cls"); // cette commande sert a effacer la console => pas de traces de la partie précedentes.
main();
}
le principe ici est de revenir au main de ton programme donc de le recommencer.. si il ya des trucs pas clair dis le moi
a+
2
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
9 août 2009 à 01:23
Salut,
Attention :
fflush(stdin);
Ca ne s'utilise pas, cela a un comportement indéterminé.
0
Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014 8 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
9 août 2009 à 01:37
excuse moi pour le fflush(stdin), j'ai juste fait un copier/coller de l'un de mes programmes et j'ai oublié de l'enlevé.
A+
PS : cela à un comportement indéterminé s'il est mal utilisé :)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014
9 août 2009 à 01:42
Je t'excuse ;-)).

PS : cela à un comportement indéterminé s'il est mal utilisé :)
Non ! Cela a un comportement indéterminé dès que tu l'utilises. fflush ne pas pas être utilisé sur une entrée. Juste sur les sorties.
0
Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014 8 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
9 août 2009 à 01:53
Oukey!!
Moi je l'avais utiliser a cause du scanf parceque j'ai créer un petit morpion (juste a la console) et si j'avais pas mis le fflush, je me retrouvais à devoir taper 2 fois les coordonnées de mon point pour qu'il puisse se placer.
On m'a expliqué pourquoi et on m'a dit comment ! lol
A+
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014
9 août 2009 à 02:06
Si tu souhaites vider le buffer clavier, il faut utiliser : int c; while((c=getchar())!='\n' && c!=EOF);

Cela t'évitera que le '\n' provoqué lors de ta validation soit pris en compte dans la prochaine lecture clavier.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
9 août 2009 à 14:32
Salut,
Les booléens n'existent qu'en norme C99. Il faut inclure le header stdbool.h et le type est _Bool.
En C89, il est d'usage de se créer son type avec des directives préprocesseurs #define.

Mais bon, on peut très bien utiliser des int pour stocker un 0 ou un 1. Ce ne sont pas des booléens mais des int. Mais à moins de faire de l'embarqué cela n'est absolument pas gênant.

Pour ce qui est de la génération d'un pseudo-aléatoire, il se fait dans tous les cas entre 0 et RAND_MAX.
C'est à toi de faire une règle de trois (et non un modulo sous peine de ne pas avoir une répartition équiprobable) suivi d'une translation (soustraction ou addition) pour obtenir un nombre dans l'ensemble désiré.
2
Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014 8
9 août 2009 à 17:41
Re.
Dis moi fiddy j'ai cru comprendre que la biliothèque conio.h n'existait pas sous linux. A la place il ya un truc comme "[n]curses, si tu as une doc ou un lien qui puisse me fournir les fonctions de cette bibliothèque, cela me servirait beaucoup. A+
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014
9 août 2009 à 18:12
Oui conio.h n'existe pas sur linux.
Tu peux utiliser ncurses sous Linux : http://www.faqs.org/docs/Linux-HOWTO/NCURSES-Programming-HOWTO.html

Cdlt
0
Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014 8 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
10 août 2009 à 00:31
merci ;)
0
Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014 8
9 août 2009 à 01:21
re :)
en ce qui concerne le fait que la console lise l'instruction return 0 et que la fenètre se ferme :
system("pause"); juste avant le return 0;
sa va stopper la lecture du programme ( sans effacer la console ne t'inquiete pas) et sa va le reprendre quand tu appuira sur une touche.
Voila pour le ptit plus lol :)
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
9 août 2009 à 01:28
Salut,

Alors le mieux pour les couleurs est l'utilisation des API : https://openclassrooms.com/fr/courses Evite d'utiliser la solution avec system, ce n'est vraiment pas top.

Pour reprendre ton programme, tout ceci est question de boucle. Tu peux faire un do while (rep=='o'); en demandant juste avant le while à l'utilisateur de rentrer o/n s'il souhaite continuer ou non.

Pour le raccourci, tu fais clique droit sur ton programme : envoyer vers, bureau (créer un raccourci).

cdlt
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014 8
9 août 2009 à 01:33
tu va croire que je suis collant :)

PS : Quelqu'un peut m'expliquer ces instructions :

srand (time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

en faite c'est une fonction hasard. la premiere ligne sert a initialiser le timer. et la seconde utilise la notion de modulo qui serait un peu compliquer à t'expliquer dans ce message ( à cette heure ci lol), mais je te file un exemple pour comprendre.
Je veux avoir un nombre au hasard entre 0 et 1 :
int i;
srand(time(0));
i=rand()%2+0;
return i;
ici "i" sera soit égal à 0 soit à 1, et c'est indépendant de l'utilisateur.
A+
1
Dark-Beta69 Messages postés 71 Date d'inscription dimanche 5 juillet 2009 Statut Membre Dernière intervention 14 octobre 2009 1
9 août 2009 à 12:56
Bonjour,

Merci beaucoup à tout les deux.
Alors hier soir avant d'aller dodo j'ai fait ça :

int rejouer()
{
    int choix = 0;

    while (choix < 1 || choix > 2)
    {
        printf("\t\t\t\t === REJOUER ? === \n");
        printf("1 : OUI\t\t\t\t\t\t\t\t\t2: NON\n");
        printf("Votre choix ? ");
        scanf("%d", &choix);
        if (choix == 1) { return main();}
        if (choix == 2) { return 0;}
    }

    return choix;
} 


Et j'ai modifié tout les return o; en return rejouer(); du coup la fênetre ne se ferme plus et pas besoin du system("pause")
:)

Mais l'instruction "system("cls");" m'intéresse je vais la mettre.

Aussi j'aimerais savoir si c'est possible de changer de couleur a chaque niveau : du genre a chaque fin de partie avant mon return rejouer(); je met system("cls");
puis une instruction pour changer la couleur ?

Merci a vous deux pour les explications/conseil et merci fiddy pour le lien !

Petite question :
printf(" Voulez vous faire une autre partie?\n");
printf("oui(1) ou non(2)");
scanf("%d", &reponse);

c'est ca une conditions Booléen ? parceque j'ai pas bien compris ce chapitre :s

Et j'aimerais rajouter une mode "spéciale" a mon code source, sa je sais comment faire mais j'aimerais qu'il génère un nombre mystère entre -500 et 500, c'est possible ?

Merci.
0
Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014 8
9 août 2009 à 14:17
salut.
alors non ce ne sont pas des booléens , les booléens sont des variables auxquels tu affectes une valeurs.
Mais cela dit tu peux en utiliser :
int oui= 1, non = 2; ( ici ce sont des booléens)

En ce qui concerne ton probleme de couleur je ne sais pas si tu as choisi la méthode de fiddy ou la mienne. Donc peut-être que ma solution ne te conviendrait pas.
Quant au nombre mystère entre -500 et 500 je ne sais pas si il est possible de sortir un nombre négatif dsl :s

Pour finir, j'aimerais savoir si tu n'as pas un " warning" avec ton return rejouer(), j'ai bien compris ce que tu voulais faire mais si tu regarde le prototype de ta fonction, ( int rejouer() ) tu doit normalement renvoyer un entier, mais là tu ne renvoie rien.
A+
0
Richard.M Messages postés 105 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 28 mars 2014 8
9 août 2009 à 14:43
sans vouloir t'offenser fiddy, Dark-Beta69 vient de commencer le C :) il faut pas trop l'embrouiller lol.
A+
0
Dark-Beta69 Messages postés 71 Date d'inscription dimanche 5 juillet 2009 Statut Membre Dernière intervention 14 octobre 2009 1
9 août 2009 à 16:14
D'accord j'ai pas tout compris mais j'irais chercher sur "google" donc sa ira, merci beaucoup !

Maintenant je voudrais savoir s'il est possible de modifier l'icône du raccourcis sur le bureau ?

et de changer le titre de la fenêtre du jeu, car la j'ai C:/Documents.../bureau/...

Merci encore.
Dark-Beta69
0