Fonction system("clr"); et return;

Résolu
BabyAzerty Messages postés 26 Date d'inscription dimanche 22 mars 2009 Statut Membre Dernière intervention 12 août 2010 - 24 nov. 2009 à 22:45
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 26 nov. 2009 à 16:21
Bonjour,


Je suis en train de programmer un pendu en C basé sur des fonctions gotoligcol (pour l'affichage du pendu, du mot a chercher, etc)


D'abord j'affiche une banniere de bienvenue et je souhaite que cette bannière reste pendant toute la durée du jeu !

Ensuite en dessous, il y a un menu qui apparait au début proposant le choix d'un niveau de difficulté

Puis lors du choix, je souhaite que tout le menu disparaisse MAIS que la bannière de bienvenue reste.

Comment je fais ?
Car avec system("clr"); j'ai tout qui disparait !!
Donc j'aimerais ciblé une zone à "clearer" et non tout le screen.



Pour la fonction return
Je pose par exemple un switch (pour le choix du niveau)
Avec case 1 = Niveau facile
Et case 2 = Niveau difficile
Puis j'ajoute un default = Erreur de saisie.
Mais j'aimerais bien qu'à la suite du default, le programme ne fasse rien (tout en laissant en place la bannière et le menu)
En gros je cherche une fonction "ignorer".


Cordialement,

B.A
Ensuite j'aimerai savoir comment faire
A voir également:

7 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
25 nov. 2009 à 18:53
Bah tu réappel ta fonction, c'est tout !

void banniere(void)
{
  printf("** Bannière **\n");
  printf("du texte \n");
  printf("du texte \n");
  printf("du texte \n");
}

int main(void)
{
  banniere();
  system("cls);
  banniere();
  banniere();

  return 0;
}


J'irais même plus loin et je ferais une fonction rafraichir:

void banniere(void)
{
  printf("** Bannière **\n");
  printf("du texte \n");
  printf("du texte \n");
  printf("du texte \n");
}

void refresh(void)
{
  system("cls);
  banniere();
}

int main(void)
{
  refresh();
  refresh();

  return 0;
}
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
25 nov. 2009 à 09:52
Evite les appels à system, tu tues la portabilité pour une fonctionnalité très discutable.
"Clearer" l'écran n'est pas forcément une bonne chose. tu embêtes généralement l'utilisateur qui n'a rien demandé. Un programme console ne réagit pas comme un programme fenêtré, tout ce qui est marqué reste, et c'est tout à fait normal.

Maintenant, si tu veux vraiment réaliser cela, il te suffit de "clearer" l'écran et de redessiner la bannière juste après.
Il n'y a pas de fonction ignorer, il suffit de ne rien faire. Si ta boucle est correctement construite, ça devrait fonctionner.
0
BabyAzerty Messages postés 26 Date d'inscription dimanche 22 mars 2009 Statut Membre Dernière intervention 12 août 2010
25 nov. 2009 à 18:49
Merci pour la réponse.


Mais pour la bannière suite au system("cls");
Est-ce que je dois obligatoirement réécrire (avec un copier-coller) le code ? Ou est-ce qu'il existe une fonction de renvoie/rappel vers le code de la bannière ?
0
BabyAzerty Messages postés 26 Date d'inscription dimanche 22 mars 2009 Statut Membre Dernière intervention 12 août 2010
26 nov. 2009 à 13:33
Omg !

Super, c'est exactement ce que j'essaie de comprendre depuis quelques jours : La création fd'une fonction ;)

Un grand merci !


Mais du coup j'ai une autre petite question :
J'ai délcaré cette fonction gotoligcol (que j'ai trouvé sur le web)
Jusqu'à la pas de problème, j'arrive à utiliser gotoligcol

//Fonction de déplacement automatique sur une case du tableau
void gotoligcol(int lig,int col)
{
    COORD mycoord;

    mycoord.X  = col;
    mycoord.Y  = lig;

    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ),mycoord);
}


Mais ensuite, j'ai pensé à créer ma petite fonction "Nettoyeur"
Par exemple, si je souhaites effacer qu'une petite ligne (ou une petite zone), au lieu de faire un refresh(); je pensais qu'il était plus sage de faire une fonction speciale

void Nettoyeur(int lig_depart, int lig_arrive, int col_depart, int col_arrive)
{
    for(lig_depart;lig_depart<=lig_arrive;lig_depart++)
    {
        for(col_depart;col_depart<=col_arrive;col_depart++)
        {
            gotoligcol(lig_depart,col_depart);
            puts(" ");
        }
    }
}


Concretement si je pose :
lig_depart 4, lig_arrive 20; col_depart = 0; col_arrive = 30;

La fonction Nettoyeur(); devrait m'éffacer (ou plutot afficher des " ") tout ce qu'il y a entre la ligne 4 à 20 et la colonne 0 à 30

Seul problème, ca ne marche pas ...
0

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

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
26 nov. 2009 à 14:13
C'est quelque chose de spécifique à Windows, ce n'est pas du vraiment du C.
Étant utilisateur de Linux, je ne peux malheureusement pas t'aider sur des API Windows.

Néanmoins, à ta place j'effacerais l'écran et à l'aide d'une fonction, réécrirais uniquement ce qui est nécessaire.
0
BabyAzerty Messages postés 26 Date d'inscription dimanche 22 mars 2009 Statut Membre Dernière intervention 12 août 2010
26 nov. 2009 à 16:16
Ok donc il est préférable d'effacer tout puis réecrire ?

Je pensais que ca consommer plus de ressources.

Enfin, merci pour ton aide !
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
26 nov. 2009 à 16:21
Ok donc il est préférable d'effacer tout puis réecrire ?

Généralement, non.

Je pensais que ca consommer plus de ressources.

C'est sans doute le cas.

Je ne dis pas qu'il faut tout effacer, mais que:
- La solution portable (c'est à dire qui peut fonctionner sous tout OS) est de faire des choses standards, comme ne pas utiliser d'outils spécifiques à une plateforme, donc de ne pas utiliser de "SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE )". Et donc de tout effacer.
- Si tu te destines à Windows spécifiquement, dans ce cas, oui, il vaut mieux effacer uniquement un morceau de l'écran avec le morceau de code que tu m'as montré.
- Je ne connais pas les API Windows, donc je ne peux t'aider sur ce point.
0
Rejoignez-nous