Fonction system("clr"); et return;

Résolu
Signaler
Messages postés
26
Date d'inscription
dimanche 22 mars 2009
Statut
Membre
Dernière intervention
12 août 2010
-
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
-
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

7 réponses

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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;
}
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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.
Messages postés
26
Date d'inscription
dimanche 22 mars 2009
Statut
Membre
Dernière intervention
12 août 2010

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 ?
Messages postés
26
Date d'inscription
dimanche 22 mars 2009
Statut
Membre
Dernière intervention
12 août 2010

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 ...
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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.
Messages postés
26
Date d'inscription
dimanche 22 mars 2009
Statut
Membre
Dernière intervention
12 août 2010

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 !
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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.