Comment retourner à une certaine ligne du code ? [Résolu]

BabyAzerty 27 Messages postés dimanche 22 mars 2009Date d'inscription 12 août 2010 Dernière intervention - 25 nov. 2009 à 19:18 - Dernière réponse : BabyAzerty 27 Messages postés dimanche 22 mars 2009Date d'inscription 12 août 2010 Dernière intervention
- 27 nov. 2009 à 18:51
Bonjour,


Je souhaiterai savoir comment retourner à un certain point du code ?
Par exemple :

Je lance un pendu (ou n'importe quel jeu)
Et lorsque je perds, j'affiche un menu avec (1) Retour au menu ou (2) Quitter le jeu.

Je pensais faire un switch (menu_perdu)
Puis avec case 2 : Exit(0);
Mais pour case 1: Je mets quoi pour retourner au début du jeu ??


Merci d'avance
Afficher la suite 

13 réponses

Répondre au sujet
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 26 nov. 2009 à 16:40
+3
Utile
Attention, non testé et fait un peu à l'arrache(le découpage de code est à revoir, c'est juste pour te donner une idée de ce que tu devrais commencer à faire). Une fonction ne devrait pas excéder 25 lignes, et plus ton code est découpé en petite fonction, plus il est aisé à comprendre et à débugger.


void menu()
{
    //Affichage du menu
    while (kbhit()) getch();                /* Vide le buffeur */
    gotoligcol(4,0);
    puts("Choix du niveau de difficulte");
    gotoligcol(6,0);
    puts("Niveau 1 : Facile       (1)");
    gotoligcol(7,0);
    puts("Niveau 2 : Difficile    (2)");
    gotoligcol(8,0);
    puts("Quitter le jeu          (q)");
}

int game_easy()
{
 /*Blabla à coups de gotoligcol, printf */
                    
                    //Compte à rebourd
                    temps_max=15;
                    do
                    {
                        pause=getch();         //Démarrage sur appuie de la barre d'espace
                        
                        //Progammation du jeu (Un Pendu)
                        /* Blabla */
                        
                        for(temps=0;temps<=temps_max;temps++)    //Debut du décompteur
                        {
                            gotoligcol(20,17);
                            printf("%d",temps_max-temps);
                            Sleep(1000);
                            if(temps>=5)                  //Bipage si temps<=10
                            {
                                gotoligcol(20,18);
                                puts(" \a");
                            }
                            if(temps==temps_max)             //Affichage du Game Over si temps=0
                            {
                                /* Affichage Game Over */
                                
                                while (kbhit()) getch();            //Vide le buffeur
                                gotoligcol(17,2);                   //Choix retour menu ou fin du jeu
                                puts("Retour au menu          (1)");
                                gotoligcol(18,2);
                                puts("Quitter le jeu          (2)");
                            
                                choix_gameover=getch();
                                switch (choix_gameover)
                                {
                                    case 1: //Quitter le jeu 
                                            /*Blabla */
                                            exit (1);
                                        
                                    case 2: //ICI JE VOUDRAIS RETOURNER A L'AFFICHAGE DU MENU INITIAL
                                        return 1;
                                }
                            }
                        }
                    }while(pause!=' ');
  return 0;
}

int launch_game()
{
    while (error_menu==0)              /*Ignore la saisie si mauvais choix effectué (j'ai déclaré error_menu=0) */ 
    {
        niveau=getch();
        switch (niveau)                 /*Si Saisie correcte */
        {
            case'1': return game_easy();
            case '2': /* Blabla : return game_medium() */
                break;
            case 'q': /* Blabla : return game_hard() */
                break;
            default:
                error_menu=0;
        }
    }
  return 0;
}

int main()
{
    //Déclaration des ressources
    /* blabla */
    
    //Affichage d'une bannière de bienvenue (qui reste afficher pendant toute la durée du programme avec la fonction gotoligcol)
    /* blabla */
   int result = 1;
   while (result != 0)
   {
     menu();    
     result = launch_game();
   }
    return 0;
}
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cptpingu
TychoBrahe 1310 Messages postés samedi 31 janvier 2009Date d'inscription 5 juin 2013 Dernière intervention - 25 nov. 2009 à 21:44
+1
Utile
Salut,

Le plus direct est un goto.

C'est également le chemin le plus direct vers les bugs mystiques, les prises de têtes, le code moche, incompréhensible et impossible à débugger. Lorsque l'on a fait un vrai bon découpage fonctionnel on ne doit même pas être amené à se poser la question initiale de ce sujet.
Commenter la réponse de TychoBrahe
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 25 nov. 2009 à 21:23
0
Utile
Le plus direct est un goto.


ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 25 nov. 2009 à 23:07
0
Utile
Je connais cette rengaine et je l'attendais.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 26 nov. 2009 à 00:17
0
Utile
goto fait partie du langage et est très pratique si utilisé avec parcimonie et intelligence.

Typiquement on est dans un cas ou:
- Le demandeur est un débutant, mieux vaut ne pas lui donner des outils dont il pourrait mal se servir. Il faut lui montrer cette fonctionnalité lorsqu'il aura de solide base.
- Il veut faire répéter un menu, donc un simple while suffit.

int main(void)
{
  int cont = 1;
  int menu_perdu = 0;
  while (cont)
  {
    scanf("%i", &menu_perdu);
    switch (menu_perdu)
    {
      case 1:
        /* Plein de chose */
        break;
      case 2:
        cont = 0;
        break;
    }
  }
  return 0;
}
Commenter la réponse de cptpingu
BabyAzerty 27 Messages postés dimanche 22 mars 2009Date d'inscription 12 août 2010 Dernière intervention - 26 nov. 2009 à 13:55
0
Utile
Goto est à proscrire ? Tant pis ...


Mais si je comprends bien, si j'en viens à utiliser goto, ca veut dire que j'ai mal codé mon programme ? Possible ... Mais je ne vois pas où :

//Bibliothèque
/* Blabla */
//Déclaration de la fonction gotoligcol
/* blabla */

int main()
{
    //Déclaration des ressources
    /* blabla */
    
    //Affichage d'une bannière de bienvenue (qui reste afficher pendant toute la durée du programme avec la fonction gotoligcol)
    /* blabla */
    
    //Affichage du menu
    while (kbhit()) getch();                /* Vide le buffeur */
    gotoligcol(4,0);
    puts("Choix du niveau de difficulte");
    gotoligcol(6,0);
    puts("Niveau 1 : Facile       (1)");
    gotoligcol(7,0);
    puts("Niveau 2 : Difficile    (2)");
    gotoligcol(8,0);
    puts("Quitter le jeu          (q)");
    
    while (error_menu==0)              /*Ignore la saisie si mauvais choix effectué (j'ai déclaré error_menu=0) */ 
    {
        niveau=getch();
    
        switch (niveau)                 /*Si Saisie correcte */
        {
            case'1': /*Blabla à coups de gotoligcol, printf */
                    
                    //Compte à rebourd
                    temps_max=15;
                    do
                    {
                        pause=getch();         //Démarrage sur appuie de la barre d'espace
                        
                        //Progammation du jeu (Un Pendu)
                        /* Blabla */
                        
                        for(temps=0;temps<=temps_max;temps++)    //Debut du décompteur
                        {
                            gotoligcol(20,17);
                            printf("%d",temps_max-temps);
                            Sleep(1000);
                            if(temps>=5)                  //Bipage si temps<=10
                            {
                                gotoligcol(20,18);
                                puts(" \a");
                            }
                            if(temps==temps_max)             //Affichage du Game Over si temps=0
                            {
                                /* Affichage Game Over */
                                
                                while (kbhit()) getch();            //Vide le buffeur
                                gotoligcol(17,2);                   //Choix retour menu ou fin du jeu
                                puts("Retour au menu          (1)");
                                gotoligcol(18,2);
                                puts("Quitter le jeu          (2)");
                            
                                choix_gameover=getch();
                                switch (choix_gameover)
                                {
                                    case 1: //Quitter le jeu 
                                            /*Blabla */
                                        
                                    case 2: //ICI JE VOUDRAIS RETOURNER A L'AFFICHAGE DU MENU INITIAL
                                }
                            }
                        }
                    }while(pause!=' ');
                break;
                
            case '2': /* Blabla */
                break;
            case 'q': /* Blabla */
                break;
            
            default:error_menu=0; 
        }
    }
    return 0;
}
    

(J'ai pas encore programmé le jeu, mais juste le menu et la mise en place)
Commenter la réponse de BabyAzerty
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 26 nov. 2009 à 14:21
0
Utile
Goto est à proscrire ? Tant pis ...

Dans 95% des cas, oui !
Mais si je comprends bien, si j'en viens à utiliser goto, ca veut dire que j'ai mal codé mon programme ? Possible ... Mais je ne vois pas où :

Ne confond pas le mot clé goto et ta fonction gotoligcol, ce sont des deux choses différentes. Tu n'as pas de goto dans ton code.
Commenter la réponse de cptpingu
BabyAzerty 27 Messages postés dimanche 22 mars 2009Date d'inscription 12 août 2010 Dernière intervention - 26 nov. 2009 à 16:18
0
Utile
Oui je sais que je n'ai pas de goto dans mon code, mais justement vers la fin du code j'ai écrit en Majuscule (commentaire) :

//ICI JE VOUDRAIS RETOURNER A L'AFFICHAGE DU MENU INITIAL

En clair, je pensais utiliser un goto à cet endroit pour retourner au menu du départ.

Parce que je vois pas vraiment comment faire avec des boucles ...
Commenter la réponse de BabyAzerty
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 26 nov. 2009 à 16:25
0
Utile
                                switch (choix_gameover)
                                {
                                    case 1: //Quitter le jeu 
                                            /*Blabla */
                                            exit(1);
                                        
                                    case 2: //ICI JE VOUDRAIS RETOURNER A L'AFFICHAGE DU MENU INITIAL
                                          error_menu = 0;
                                          pause = ' ';
                                }
Commenter la réponse de cptpingu
cs_Chouchou182 252 Messages postés vendredi 13 juin 2003Date d'inscription 25 avril 2011 Dernière intervention - 26 nov. 2009 à 22:35
0
Utile
Salut,
CptPingu a écrit:
Typiquement on est dans un cas ou:
- Le demandeur est un débutant, mieux vaut ne pas lui donner des outils dont il pourrait mal se servir. Il faut lui montrer cette fonctionnalité lorsqu'il aura de solide base.
- Il veut faire répéter un menu, donc un simple while suffit.


Suit un code non reproduit ici (voir plus haut).
Ce code est sans goto mais avec un appel à scanf dont la valeur de retour est ignorée. Une petite erreur de saisie à l'exécution (un 'a' à la place d'un '1') et le menu se répète...à l'infini.

Et puis hélas, on peut écrire du code mystique impossible à débugger même sans utiliser goto.

Une lecture intéressante sur le sujet: David R. Tribble

Vus les mésusages du goto, des langages sans goto ont été conçus; mais tant que l'on programmera en C, il restera de bons usage du goto.

Bonne prog,
Commenter la réponse de cs_Chouchou182
BabyAzerty 27 Messages postés dimanche 22 mars 2009Date d'inscription 12 août 2010 Dernière intervention - 27 nov. 2009 à 09:27
0
Utile
Super c'est exactement ça ! Et il marche !

Merci CptPingu !

Par contre, je ne comprends pas le "return 1;"

switch (choix_gameover)
                                {
                                    case 1: //Quitter le jeu 
                                            /*Blabla */
                                            exit (1);
                                        
                                    case 2: //ICI JE VOUDRAIS RETOURNER A L'AFFICHAGE DU MENU INITIAL
                                        return 1;
                                }


Le return 1 renvoie où ?
Et exit 1 renvoie où ?
Commenter la réponse de BabyAzerty
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 27 nov. 2009 à 09:51
0
Utile
@Chouchou182: Merci pour le liens, c'est très intéressant.

@BabyAzerty:

Le return 1 renvoie où ?

Return sert à quitter une fonction, en renvoyant quelque chose (ou non). Ici, ta fonction peut retourner un entier, donc return 1, veut dire: quitter la fonction et retourner 1. Donc l'appel de cette fonction est remplacé par 1.
return game_easy(); équivaudra dont à return 1; puisque tu quitteras la fonction game_easy() en renvoyant 1.
De même launch_game() est remplacé par 1, puisque return game_easy() équivaudra à 1.
Donc tu auras: result launch_game(); qui équivaut à result 1;.
Comme tu as while (result != 0) alors tu continueras de faire un tour de boucle (et donc tu reviens au début).

Et exit 1 renvoie où ?

Exit(1) veut dire quitter le programme, en renvoyant le code d'erreur 1.
Commenter la réponse de cptpingu
BabyAzerty 27 Messages postés dimanche 22 mars 2009Date d'inscription 12 août 2010 Dernière intervention - 27 nov. 2009 à 18:51
0
Utile
Et bien là ...

Wouhou ...

Je sais pas quoi dire !

Un énorme MERCI pour m'avoir aider à casiment compléter mon jeu ^^
(D'ailleurs, j'ai découvert où beugger la fonction Nettoyeur que j'avais créée)

Merci aux autres aussi ;)
Commenter la réponse de BabyAzerty

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.