Tour de hanoi en c

Description

Je sais quil existe de nombreuse sources sur les tours de Hanoi toutes les unes differentes des autres sur differents languages. J'apprend le C en ce moment est ceci est ma premiere source dans le domaine du C. Ce que j aimerais surtout c est avoir des conseils de personnes plus experimenter que moi dans ce domaine. N ayant pas encore apris le C++ ce n est pas la peine de m en parler j y viendrais une fois que j aurais bien integre le C (J ai encore beaucoup de boulot) je ne suis qu a la fin de mon apprentissage sur le mode console du C. J ai donc creer le jeu en mode console. Ce n est qu un petit projet donc j ai mis tout le code dans un fichier main.c sauf 2 3 fonctions que j utilise de facon general pour tout mes projets.
PS: J'ai code avec l IDE Code::blocks.

Source / Exemple :


#include "lecture.h"
//Iteration of the functions
void regles();
void disposeTour(int numTour[],int *niveau);
void recupere3firstNombre(int numTour[],int numMenu[],int *niveau);
void menuChoosePalette(int numMenu[],int *tourActuelle);
void menuWhere(int *tourActuelle,int numMenu[],int *newTour);
void deplacement(int *tourActuelle,int numMenu[],int numTour[],int *newTour);
void checkWin(int numTour[],int *rejouer,int *conitnuer,int *niveau,int *showLevel,int *coups,int *countTurns);
void level(int *niveau,int *coups);
void counter(int *niveau,int *coups,int *countTurns);

/*
This function give you the menu of show rules
@param *pause stop the screen after showing the rules
//*/
void regles()
{
    int rules=1;int pause=0;
    do
    {
        printf("Voulez vous connaitre les regles du jeu?\n\n");
        printf("0. NON\n");
        printf("1. OUI\n");
        rules=lireLong();
        if(rules < 0 || rules > 1)
            printf("Ce choix n'est pas dans le menu\n\n");
    }
    while(rules < 0 || rules > 1);
    if(rules)
    {
        printf("Le jeu est composer de 3 tours disposer les unes a cotes des autres.\n");
        printf("Au debut du jeu vous avez de 3 a 8 palettes sur la tour de gauche.\n");
        printf("Le but du jeu est de toutes les deplacer sur la tour de droite.\n");
        printf("Les palettes sont deplacable une par une.\n");
        printf("Mais attention vous n'avez pas le droit de poser une palette plus grande sur une palette plus petite.\n");
        printf("Donc dans la troisieme tour vous aurez vos palettes dans le meme ordre qu'au debut du jeu.\n");
        printf("Bonne chance!\n\n");
        pause=lireLong();
    }
}

/*
This functions is generating the draws of the towers with the discs
@param int numTour[] it s a table from 3 to 8 numbers that each one correspond to one disc and each number give the tower where the disc is
@param int niveau give the number of disc you want to play with.
//*/
void disposeTour(int numTour[],int *niveau)
{
        printf("Vos tours de Hannoi actuellement:\n\n");
        printf("\tTOUR 1\t\tTOUR 2\t\tTOUR 3\n\n");
        int i=0;
        while(i < *niveau)
        {
            switch(i)
            {
                case 1:
                    if(numTour[i] == 1)
                        printf("\t******222******\t\t*\t\t*\n");
                    else if(numTour[i] == 2)
                        printf("\t*\t\t******222******\t\t*\n");
                    else
                        printf("\t*\t\t*\t\t******222******\n");
                    i++;
                    break;
                case 2:
                    if(numTour[i] == 1)
                        printf("\t*****33333*****\t\t*\t\t*\n");
                    else if(numTour[i] == 2)
                        printf("\t*\t\t*****33333*****\t\t*\n");
                    else
                        printf("\t*\t\t*\t\t*****33333*****\n");
                    i++;
                    break;
                case 3:
                    if(numTour[i] == 1)
                        printf("\t****4444444****\t\t*\t\t*\n");
                    else if(numTour[i] == 2)
                        printf("\t*\t\t****4444444****\t\t*\n");
                    else
                        printf("\t*\t\t*\t\t****4444444****\n");
                    i++;
                    break;
                case 4:
                    if(numTour[i] == 1)
                        printf("\t***555555555***\t\t*\t\t*\n");
                    else if(numTour[i] == 2)
                        printf("\t*\t\t***555555555***\t\t*\n");
                    else
                        printf("\t*\t\t*\t\t***555555555***\n");
                    i++;
                    break;
                case 5:
                    if(numTour[i] == 1)
                        printf("\t**66666666666**\t\t*\t\t*\n");
                    else if(numTour[i] == 2)
                        printf("\t*\t\t**66666666666**\t\t*\n");
                    else
                        printf("\t*\t\t*\t\t**66666666666**\n");
                    i++;
                    break;
                case 6:
                    if(numTour[i] == 1)
                        printf("\t*7777777777777*\t\t*\t\t*\n");
                    else if(numTour[i] == 2)
                        printf("\t*\t\t*7777777777777*\t\t*\n");
                    else
                        printf("\t*\t\t*\t\t*7777777777777*\n");
                    i++;
                    break;
                case 7:
                    if(numTour[i] == 1)
                        printf("\t888888888888888\t\t*\t\t*\n\n");
                    else if(numTour[i] == 2)
                        printf("\t*\t\t888888888888888\t\t*\n\n");
                    else
                        printf("\t*\t\t*\t\t888888888888888\n\n");
                    i++;
                    break;
                default:
                    if(numTour[i] == 1)
                        printf("\t*******1*******\t\t*\t\t*\n");
                    else if(numTour[i] == 2)
                        printf("\t*\t\t*******1*******\t\t*\n");
                    else
                        printf("\t*\t\t*\t\t*******1*******\n");
                    i++;
                    break;
            }
        }
}

/*
This function save the numbers of the three discs of each tower that are the smallest (so the upper).
@param numTour[] view comments above
@param numMenu[] It is a table of 3 numbers that contain the number of the upper disc for each tower
@param niveau Number of dis you want to play with
//*/
void recupere3firstNombre(int numTour[],int numMenu[],int *niveau)
{
        int i=0;
        numMenu[0]=0;
        numMenu[1]=0;
        numMenu[2]=0;
        //loop for the first tower
        while(i < *niveau)
        {
            if(numTour[i] == 1)
            {
                numMenu[0]=i+1;
                break;
            }
            i++;
        }
        //initialise the counter
        i=0;
        //loop for the second tower
        while(i < *niveau)
        {
            if(numTour[i] == 2)
            {
                numMenu[1]=i+1;
                break;
            }
            i++;
        }
        //initialise the counter
        i=0;
        //loop for the third tower
        while(i < *niveau)
        {
            if(numTour[i] == 3)
            {
                numMenu[2]=i+1;
                break;
            }
            i++;
        }
}

/*
This function ask the player to choose the disc he want to move.
@param numMenu view comment above
@param tourActuelle it has the number of the tower where the disc the player want to move is.
//*/
void menuChoosePalette(int numMenu[],int *tourActuelle)
{
        //initialise the counter to 1
        int i=1;
        do
        {
            printf("Quels palette voulez vous deplacer ?\n\n");
            if(numMenu[0] != 0)
            {
                printf("1. palette numero %d.\n",numMenu[0]);
                i++;
            }
            if(numMenu[1] != 0)
            {
                printf("2. palette numero %d.\n",numMenu[1]);
                i++;
            }
            if(numMenu[2] != 0)
            {
                printf("3. palette numero %d.\n",numMenu[2]);
                i++;
            }

  • tourActuelle = lireLong();
if(*tourActuelle < 1 || *tourActuelle > 3) printf("Ce choix n'est pas dans le menu!\n\n"); } while(*tourActuelle < 1 || *tourActuelle > 3); } /* This function ask the player on wich tower he want to move the disc. @param tourActuelle view comment above @param numMenu[] view comment above @param newTour save the number of the tour the player want to move his disc on //*/ void menuWhere(int *tourActuelle,int numMenu[],int *newTour) { do { switch(*tourActuelle) { case 2: printf("Sur quels tour voulez vous deplacer la palette numero %d ?\n\n",numMenu[1]); printf("1. tour numero 1.\n"); printf("3. tour numero 3.\n"); break; case 3: printf("Sur quels tour voulez vous deplacer la palette numero %d ?\n\n",numMenu[2]); printf("1. tour numero 1.\n"); printf("2. tour numero 2.\n"); break; default: printf("Sur quels tour voulez vous deplacer la palette numero %d ?\n\n",numMenu[0]); printf("2. tour numero 2.\n"); printf("3. tour numero 3.\n"); break; }
  • newTour=lireLong();
if(*newTour < 1 || *newTour > 3) printf("Ce choix n'est pas dans le menu\n\n"); } while(*newTour < 1 || *newTour > 3); } /* This function move the disc place as the player wanted. @param tourActuelle view comment above @param numMenu view commment above @param numTour view comment above @param newTour view comment above //*/ void deplacement(int *tourActuelle,int numMenu[],int numTour[],int *newTour) { if(*tourActuelle == 1) { if(*newTour == 2) { if(numMenu[0] < numMenu[1] || numMenu[1] == 0) numTour[numMenu[0]-1] = 2; else { printf("Erreur, rappel: On ne peut deplacer une palette que sur une palette plus grande.\n\n"); } } else { if(numMenu[0] < numMenu[2] || numMenu[2] == 0) numTour[numMenu[0]-1] = 3; else { printf("Erreur, rappel: On ne peut deplacer une palette que sur une palette plus grande.\n\n"); } } } else if(*tourActuelle == 2) { if(*newTour == 1) { if(numMenu[1] < numMenu[0] || numMenu[0] == 0) numTour[numMenu[1]-1] = 1; else { printf("Erreur, rappel: On ne peut deplacer une palette que sur une palette plus grande.\n\n"); } } else { if(numMenu[1] < numMenu[2] || numMenu[2] == 0) numTour[numMenu[1]-1] = 3; else { printf("Erreur, rappel: On ne peut deplacer une palette que sur une palette plus grande.\n\n"); } } } else { if(*newTour == 1) { if(numMenu[2] < numMenu[0] || numMenu[0] == 0) numTour[numMenu[2]-1] = 1; else { printf("Erreur, rappel: On ne peut deplacer une palette que sur une palette plus grande.\n\n"); } } else { if(numMenu[2] < numMenu[1] || numMenu[1] == 0) numTour[numMenu[2]-1] = 2; else { printf("Erreur, rappel: On ne peut deplacer une palette que sur une palette plus grande.\n\n"); } } } //*/ } /* Check if the player win the game. if Yes ask if he want to restart the game. @param numTour view comment above @param rejouer A boolean if true replay the game if false stop the game @param continuer A boolean if true replay the game if false stop the game @param niveau Numbers of discs the player play with. @param showLevel A boolean if true (replay) so call the level function @param coups numbers of turn minimum you need to win the game @param countTurns numbers of turn you have done until now. //*/ void checkWin(int numTour[],int *rejouer,int *conitnuer,int *niveau,int *showLevel,int *coups,int *countTurns) { int i=0, y=0; while(i < *niveau) { //if one disc is not on the tower 3 so we continue a new turn of the game //else the geme is finished if(numTour[i] != 3) break; i++; } if(i == *niveau) { counter(&(*niveau),&(*coups),&(*countTurns)); disposeTour(&numTour,&(*niveau)); printf("\n\nBravo vous avez gagner\n\n"); //Special end when terminates the game in minimum of turns if(*countTurns-1 == *coups) { printf("\t\t*******************\n"); printf("\t\t* *\n"); printf("\t\t* You win in *\n"); printf("\t\t* the minimum of *\n"); printf("\t\t* %d coups *\n",(*coups)); printf("\t\t* *\n"); printf("\t\t*******************\n"); } //menu replay do { printf("Voulez vous rejouez?\n\n"); printf("0. NON\n"); printf("1. OUI\n");
  • rejouer = lireLong();
} while(*rejouer < 0 || *rejouer > 1); //exit the game if not replay the game if(*rejouer == 0)
  • conitnuer = 0;
//get bak the discs to the first tower while(y < *niveau) { numTour[y]=1; y++; }
  • showLevel=1;
} } /* This function ask with how much discs the player want to play and initialize the number minimum of turns to win @param niveau number of discs to play with @coups numbers of minimum turn to win //*/ void level(int *niveau,int *coups) { //menu number of discs do { printf("Choisissez le nombre de palette:\n\n"); printf("3. 3 Palettes\n"); printf("4. 4 Palettes\n"); printf("5. 5 Palettes\n"); printf("6. 6 Palettes\n"); printf("7. 7 Palettes\n"); printf("8. 8 Palettes\n");
  • niveau = lireLong();
if(*niveau < 3 || *niveau > 8) printf("\n\n\t\t----This answer is not in the menu----\n\n"); } while(*niveau < 3 || *niveau > 8); //initialise the minimum number of turn to win switch(*niveau) { case 4:
  • coups=15;
break; case 5:
  • coups=31;
break; case 6:
  • coups=63;
break; case 7:
  • coups=127;
break; case 8:
  • coups=255;
break; default:
  • coups=7;
break; } } /* This function count and show the numbers of turn you done. @param niveau number of discs to play with @param coups number of minimum turns to win @param countTurns number of turns played //*/ void counter(int *niveau,int *coups,int *countTurns) { printf("\n\nVous jouez avec %d Palettes.\n",*niveau); printf("Le jeu se joue en %d coups minimum\n",*coups); printf("Vous jouez votre %d coups\n\n",*countTurns); (*countTurns)++; } int main() { //welcome title printf("\t\tBienvenue au tour de Hannoi!\n\n"); int conitnuer=1,rejouer=1,niveau=3,showLevel=1,coups=7; int numTour[8]={1,1,1,1,1,1,1,1},tourActuelle=1,newTour=1; int numMenu[3]={0,0,0},countTurns=0; while(rejouer) { regles(); while(conitnuer) { if(showLevel) { level(&niveau,&coups); showLevel=0; countTurns=0; } counter(&niveau,&coups,&countTurns); disposeTour(&numTour,&niveau); recupere3firstNombre(&numTour,&numMenu,&niveau); menuChoosePalette(&numMenu,&tourActuelle); menuWhere(&tourActuelle,&numMenu,&newTour); deplacement(&tourActuelle,&numMenu,&numTour,&newTour); checkWin(&numTour,&rejouer,&conitnuer,&niveau,&showLevel,&coups,&countTurns); } } return 0; }

Conclusion :


C'est mon premier code en C donc je demanderais votre indulgence.
Je m'attaque tres prochainement a la bibliotheque SDL. Donc j espere pouvoir creer des petits logiciels en fenetre prochainement.
A bientot
Astro

Codes Sources

A voir également

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.