Fonction system("clr"); et return; [Résolu]

Messages postés
27
Date d'inscription
dimanche 22 mars 2009
Dernière intervention
12 août 2010
- 24 nov. 2009 à 22:45 - Dernière réponse :
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
- 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
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
- 25 nov. 2009 à 18:53
3
Merci
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;
}

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
- 25 nov. 2009 à 09:52
0
Merci
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.
Commenter la réponse de cptpingu
Messages postés
27
Date d'inscription
dimanche 22 mars 2009
Dernière intervention
12 août 2010
- 25 nov. 2009 à 18:49
0
Merci
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 ?
Commenter la réponse de BabyAzerty
Messages postés
27
Date d'inscription
dimanche 22 mars 2009
Dernière intervention
12 août 2010
- 26 nov. 2009 à 13:33
0
Merci
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 ...
Commenter la réponse de BabyAzerty
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
- 26 nov. 2009 à 14:13
0
Merci
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.
Commenter la réponse de cptpingu
Messages postés
27
Date d'inscription
dimanche 22 mars 2009
Dernière intervention
12 août 2010
- 26 nov. 2009 à 16:16
0
Merci
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 !
Commenter la réponse de BabyAzerty
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
- 26 nov. 2009 à 16:21
0
Merci
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.
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.