public Creature(Creature copie)
 {
     m_Couleur = copie.m_Couleur;
     m_CouleurDeFond = copie.m_CouleurDeFond;
     m_Defense = copie.m_Defense;
     m_DonneXP = copie.m_DonneXP;
     m_Espece = copie.m_Espece;
     m_Force = copie.m_Force;
     m_FrequenceApparition = copie.m_FrequenceApparition;
     m_Niveau = copie.m_Niveau;
     m_Vie = copie.m_Vie;
     m_VieMax = copie.m_VieMax;
 } // constructeur de copie, a partir d'un monstre original
        public void jouerPartie(bool nouvellePartie, Aventurier joueur, string nomPartie)
        {
            #region demmarrage d'une nouvelle partie
            if (nouvellePartie)
            {
                //On recupere la position de l'aventurier dans la map
                string positionInitialAventurier;
                string[] infosPremierNiveau = m_InfosCartes[0][3].Split(';'); // la position est sur la 4eme ligne de la première map
                positionInitialAventurier = infosPremierNiveau[infosPremierNiveau.Length - 1];
                //la position dans la map de l'aventurier est toujours le dernier element de la map
                joueur = new Vivant.Aventurier(positionInitialAventurier);
            }
            #endregion
            #region chargement des états de la partie en memoire sur le Dur
            else
            {
                m_EtatsDesCoffres = null; m_EtatsDesPieces = null; m_EtatsDesTorches = null;
                string coffreDecrypte = Fonctions.decryptage(nomPartie + "\\coffres.sav"),
                       torcheDecrypte = Fonctions.decryptage(nomPartie + "\\torches.sav"),
                       pieceDecrypte  = Fonctions.decryptage(nomPartie + "\\pieces.sav") ;
                #region chargement coffre
                XmlSerializer xs = new XmlSerializer(typeof(List<List<Objets.Coffres>>));
                using (StreamReader sw = new StreamReader(coffreDecrypte))
                { m_EtatsDesCoffres = xs.Deserialize(sw) as List<List<Objets.Coffres>>; }
                #endregion
                #region chargement torche
                xs = new XmlSerializer(typeof(List<List<Objets.Torches>>));
                using (StreamReader sw = new StreamReader(torcheDecrypte))
                { m_EtatsDesTorches = xs.Deserialize(sw) as List<List<Objets.Torches>>; }
                #endregion
                #region chargement pieces
                xs = new XmlSerializer(typeof(List<List<Objets.Pieces>>));
                using (StreamReader sw = new StreamReader(pieceDecrypte))
                { m_EtatsDesPieces = xs.Deserialize(sw) as List<List<Objets.Pieces>>; }
                #endregion
                File.Delete(coffreDecrypte); File.Delete(torcheDecrypte); File.Delete(pieceDecrypte);
            }
            #endregion
            const int tailleMaxCarteX = 100, tailleMaxCarteY = 100;
            List<List<affichage>> affichageMap = new List<List<affichage>>();
            #region première initialisation de affichageMap totalement vide
            for (int i = 0; i < tailleMaxCarteX; i++)
            {
                affichageMap.Add(new List<affichage>());
                for (int j = 0; j < tailleMaxCarteY; j++)
                    affichageMap[i].Add(new affichage());
            }
            #endregion
            while (true)
            {
                // on affiche la map avec comme arguments :
                /*
                 *  l'état du joueur
                 *  l'états des torches
                 *  l'états des pîeces
                 *  */
                m_Cartes[joueur.PositionZ].afficheMap(ref joueur,
                                                      m_EtatsDesTorches[joueur.PositionZ],
                                                      m_EtatsDesPieces[joueur.PositionZ],
                                                      ref affichageMap);
                bool apparitionMonstre = false; // un monstre peut il apparaitre, est mis a true si deplacement
                ConsoleKeyInfo touchePresse = Console.ReadKey();
                switch (touchePresse.Key)
                {
                    #region reaction mouvement
                    #region aller a gauche
                    case ConsoleKey.LeftArrow:
                        if (m_Cartes[joueur.PositionZ].m_Map[joueur.PositionX][(joueur.PositionY - 1)].estAtteignable)
                        { joueur.PositionY--; }
                        apparitionMonstre = true;
                        break;
                    #endregion
                    #region aller a droite
                    case ConsoleKey.RightArrow:
                        if (m_Cartes[joueur.PositionZ].m_Map[joueur.PositionX][(joueur.PositionY + 1)].estAtteignable)
                        { joueur.PositionY++; }
                        apparitionMonstre = true;
                        break;
                    #endregion
                    #region aller en haut
                    case ConsoleKey.UpArrow:
                        if (m_Cartes[joueur.PositionZ].m_Map[(joueur.PositionX - 1)][joueur.PositionY].estAtteignable)
                        { joueur.PositionX--; }
                        apparitionMonstre = true;
                        break;
                    #endregion
                    #region aller en bas
                    case ConsoleKey.DownArrow:
                        if(m_Cartes[joueur.PositionZ].m_Map.Count > (joueur.PositionX+2)) // tant que le joueur ne sort pas de la map
                                                                                // c'est +2 a cause d'une ligne suplémentaire dans la variable
                            if (m_Cartes[joueur.PositionZ].m_Map[(joueur.PositionX + 1)][joueur.PositionY].estAtteignable)
                            { joueur.PositionX++; }
                        apparitionMonstre = true;
                        break;
                    #endregion
                    #region changer de niveau -C
                    case ConsoleKey.C:
                        TypeDeLieu caseSousJoueur = m_Cartes[joueur.PositionZ].m_Map[joueur.PositionX][joueur.PositionY].TypeDeLaCase;
                        if (caseSousJoueur.Equals(TypeDeLieu.EscalierDescandant))
                        {
                            joueur.PositionZ--;
                            affichageMap = new List<List<affichage>>();
                            #region réinitialisation de affichageMap
                            for (int i = 0; i < tailleMaxCarteX; i++)
                            {
                                affichageMap.Add(new List<affichage>());
                                for (int j = 0; j < tailleMaxCarteY; j++)
                                    affichageMap[i].Add(new affichage());
                            }
                            #endregion
                        }
                        else if (caseSousJoueur.Equals(TypeDeLieu.EscalierMontant))
                        {
                            joueur.PositionZ++;
                            affichageMap = new List<List<affichage>>();
                            #region réinitialisation de affichageMap
                            for (int i = 0; i < tailleMaxCarteX; i++)
                            {
                                affichageMap.Add(new List<affichage>());
                                for (int j = 0; j < tailleMaxCarteY; j++)
                                    affichageMap[i].Add(new affichage());
                            }
                            #endregion
                        }
                        break;
                    #endregion
                    #endregion

                    #region actions dans le monde
                    #region allumer une torche - A
                    case ConsoleKey.A:
                        // si une des cases autour est une torche et qu'elle est eteinte
                        // on allume la torche => on change son état et sa couleur
                        foreach (Torches torche in m_EtatsDesTorches[joueur.PositionZ])
                        {
                            if (!torche.estAllume)
                            {
                                if (joueur.PositionX + 1 == torche.posX && joueur.PositionY     == torche.posY ||
                                    joueur.PositionX - 1 == torche.posX && joueur.PositionY     == torche.posY ||
                                    joueur.PositionX     == torche.posX && joueur.PositionY + 1 == torche.posY ||
                                    joueur.PositionX     == torche.posX && joueur.PositionY - 1 == torche.posY   )
                                {
                                    torche.estAllume = true;
                                    torche.couleurTorche = ConsoleColor.Yellow;
                                    break; // on sort de la boucle puisqu'on a trouvé la bonne torche
                        }   }   }
                        //sinon rien ne se passe
                        break;
                    #endregion
                    #region rammaser un objet - R
                    case ConsoleKey.R:
                        switch (m_Cartes[joueur.PositionZ].m_Map[joueur.PositionX][joueur.PositionY].TypeDeLaCase)
                        {
                            case TypeDeLieu.Piece:
                                foreach (Pieces piece in m_EtatsDesPieces[joueur.PositionZ])
                                {
                                    if (joueur.PositionX == piece.posX && joueur.PositionY == piece.posY && !piece.estPrise)
                                    {
                                        piece.estPrise = true;
                                        joueur.NombreDePiece++;
                                        break; // on sort de la boucle puisqu'on a trouvé la bonne piece
                                    }
                                }
                                break;
                            default: // si ce n'est pas l'un des cas si dessus
                                break; // on ne fais rien du tout
                        }
                        break;
                    #endregion
                    #region ouvrir un coffre - O
                    case ConsoleKey.O:
                        foreach(Coffres coffre in m_EtatsDesCoffres[joueur.PositionZ])
                        {
                            // si un coffre est a proximite
                            if (joueur.PositionX + 1 == coffre.posX && joueur.PositionY == coffre.posY ||
                                        joueur.PositionX - 1 == coffre.posX && joueur.PositionY == coffre.posY ||
                                        joueur.PositionX == coffre.posX && joueur.PositionY + 1 == coffre.posY ||
                                        joueur.PositionX == coffre.posX && joueur.PositionY - 1 == coffre.posY)
                            {
                                coffre.ouvert = true;
                                foreach (Objet obj in coffre.m_Contient)
                                {
                                    switch (obj.typeDeLObjet)
                                    {
                                        case TypeDObjet.Piece:
                                            joueur.NombreDePiece++;
                                            break;
                                        case TypeDObjet.Parchemin:
                                            joueur.nouveauSort((Parchemin)obj);
                                            break;
                                        case TypeDObjet.PotionMana:
                                            joueur.ajouterElement(obj);
                                            break;
                                        case TypeDObjet.PotionVie:
                                            joueur.ajouterElement(obj);
                                            break;
                                }    }
                                Console.SetCursorPosition(25, 10); Console.WriteLine("+---------------+");
                                Console.SetCursorPosition(25, 11); Console.WriteLine("| Coffre ouvert |");
                                Console.SetCursorPosition(25, 12); Console.WriteLine("+---------------+");
                                break;
                        }    }
                        break;
                    #endregion
                    #region ouvrir l'inventaire - I
                    case ConsoleKey.I:
                        joueur.afficherInventaire();
                        #region réinitialisation de affichageMap du fait des affichages précédents
                        affichageMap = new List<List<affichage>>();
                        for (int i = 0; i < tailleMaxCarteX; i++)
                        {
                            affichageMap.Add(new List<affichage>());
                            for (int j = 0; j < tailleMaxCarteY; j++)
                                affichageMap[i].Add(new affichage());
                        }
                        #endregion
                        break;
                    #endregion
                    #region menu(retour sauvegarde chargemment quitter) - ECHAP
                    case ConsoleKey.Escape:
                        bool choixMenu = false;
                        int choix = 0;
                        #region choix de l'action dans le menu
                        while (!choixMenu)
                        {
                            const int nombreAction = 4;
                            string[] action = new string[nombreAction];
                            action[0] = "   Retour  "; 
                            action[1] = "Sauvegarder";
                            action[2] = "  Charger  ";
                            action[3] = "  Quitter  ";
                            Console.ForegroundColor = ConsoleColor.Gray;
                            #region affichage
                            Console.SetCursorPosition(25, 10); Console.Write("+-------------------------------------+");
                            Console.SetCursorPosition(25, 11); Console.Write("|                                     |");
                            Console.SetCursorPosition(25, 12); Console.Write("|                                     |");
                            Console.SetCursorPosition(25, 13); Console.Write("|                                     |");
                            Console.SetCursorPosition(25, 14); Console.Write("|                                     |");
                            Console.SetCursorPosition(25, 15); Console.Write("|                                     |");
                            Console.SetCursorPosition(25, 16); Console.Write("|                                     |");
                            Console.SetCursorPosition(25, 17); Console.Write("+-------------------------------------+");
                            for (int i = 0; i < nombreAction; i++)
                            {
                                Console.ForegroundColor = (choix == i ? ConsoleColor.White : ConsoleColor.Gray);
                                Console.SetCursorPosition(30, i + 12); Console.Write(String.Format("{0,11}", action[i]));
                            }
                            #endregion
                            ConsoleKeyInfo presse = Console.ReadKey();
                            #region reaction
                            switch (presse.Key)
                            {
                                case ConsoleKey.UpArrow:
                                    if (choix == 0) choix = nombreAction;
                                    choix--;
                                    break;
                                case ConsoleKey.DownArrow:
                                    choix++;
                                    if (choix == nombreAction) choix = 0;
                                    break;
                                case ConsoleKey.Enter: choixMenu = true; break;
                                default: break;
                            }
                            #endregion
                        }
                        #endregion
                        #region reaction au choix
                        switch (choix)
                        {
                            case 0: break; // on ne fais rien
                            case 1: // sauvegarde
                                joueur.sauvegarder(m_EtatsDesCoffres, m_EtatsDesTorches, m_EtatsDesPieces); 
                                break;
                            case 2: // chargement
                                if(Fonctions.confirmationSauvegarde())
                                    joueur.sauvegarder(m_EtatsDesCoffres, m_EtatsDesTorches, m_EtatsDesPieces);
                                string nomPart;
                                Partie part = new Partie();
                                part.jouerPartie(false, Program.chargement(out nomPart), nomPart);
                                break;
                            case 3: // quitter
                                if (Fonctions.confirmationSauvegarde())
                                    joueur.sauvegarder(m_EtatsDesCoffres, m_EtatsDesTorches, m_EtatsDesPieces);
                                System.Diagnostics.Process.GetCurrentProcess().Kill();
                                break;
                        }
                        #endregion
                        #region réinitialisation de affichageMap du fait des affichages précédents
                        affichageMap = new List<List<affichage>>();
                        for (int i = 0; i < tailleMaxCarteX; i++)
                        {
                            affichageMap.Add(new List<affichage>());
                            for (int j = 0; j < tailleMaxCarteY; j++)
                                affichageMap[i].Add(new affichage());
                        }
                        #endregion
                        break;
                    #endregion
                    #endregion
                    #region aide declanchement d'action
                    #region combat -D niv,lettre carractéristique du monstre
                    case ConsoleKey.D: // test combat
                        Console.SetCursorPosition(0, 40);
                        string monstre = Console.ReadLine();
                        joueur.combat(new Creature(Int32.Parse(monstre.Split(',')[0]),
                                                               monstre.Split(',')[1],
                                                   (double)0
                                      )            );
                        #region réinitialisation de affichageMap du fait des affichages précédents
                        affichageMap = new List<List<affichage>>();
                        for (int i = 0; i < tailleMaxCarteX; i++)
                        {
                            affichageMap.Add(new List<affichage>());
                            for (int j = 0; j < tailleMaxCarteY; j++)
                                affichageMap[i].Add(new affichage());
                        }
                        #endregion
                        break;
                    #endregion
                    #region pause -P
                    case ConsoleKey.P: // test pause
                        string duree = Console.ReadLine();
                        Temps.Temps.pause(Int32.Parse(duree));
                        break;
                    #endregion
                    #region gain XP -G
                    case ConsoleKey.G: // test de gain de  niveau
                        joueur.gagneNiveau(true);
                        #region réinitialisation de affichageMap du fait des affichages précédents
                        affichageMap = new List<List<affichage>>();
                        for (int i = 0; i < tailleMaxCarteX; i++)
                        {
                            affichageMap.Add(new List<affichage>());
                            for (int j = 0; j < tailleMaxCarteY; j++)
                                affichageMap[i].Add(new affichage());
                        }
                        #endregion
                        break;
                    #endregion
                    #region torches allumées -T
                    case ConsoleKey.T:
                        foreach (Torches tor in m_EtatsDesTorches[joueur.PositionZ])
                        {
                            if (!tor.estAllume)
                            {
                                tor.estAllume = true;
                                tor.couleurTorche = ConsoleColor.Yellow;
                                break;
                        }    }
                        break;
                    #endregion
                    #region ajouter sort -S boule de feu (niv20) -15 mana
                    case ConsoleKey.S:
                        joueur.m_Grimmoire.Add(new Magie.Sort(Magie.Sorts.BouleDeFeu, 15, 20));
                        break;
                    #endregion
                    #region ajouter objet -B
                    case ConsoleKey.B:
                        string objet = Console.ReadLine();
                        switch (objet)
                        {
                            case "poso":
                                joueur.m_Sac.Add(new PotionSoin(0,0,25));
                                break;
                            case "poma":
                                joueur.m_Sac.Add(new PotionMana(0, 0, 25));
                                break;
                            case "piece" :
                                joueur.NombreDePiece++; break;
                            default: break;
                        }
                        break;
                    #endregion
                    #endregion
                    default :
                        break;
                } // fin switch
                if (joueur.Mort)
                    break;

                #region determination d'un combat
                if (apparitionMonstre)
                {
                    Random nombre = new Random();
                    // calculer et effectuer la probabilité d'apparition des monstres puis voir si le monstre apparais
                    List<Creature> monstrePouvantAttaquer = new List<Creature>();
                    // pour chaque créature, si il peut apparaitre (réussite du if)
                    foreach (Creature monstre in m_CreaturesDansMaps[joueur.PositionZ])
                        if (monstre.FrequenceApparition > (double)(100 * nombre.NextDouble()))
                            monstrePouvantAttaquer.Add(monstre);
                    bool vraiAttaque = false; // pour vérifier si un monstre attaque réellement
                    Creature monstreAttaquant = new Creature() ;
                    foreach (Creature monstre in monstrePouvantAttaquer)
                        if (monstreAttaquant.FrequenceApparition < monstre.FrequenceApparition)
                        { monstreAttaquant = new Creature(monstre); vraiAttaque = true; } // on determine quel monstre attaque et on déclare une vrai attaque
                    
                    if (vraiAttaque) joueur.combat(monstreAttaquant);
                    // enfin a la fin du combat, du fait des affichages, on réinitialise affichageMap a totalement vide
                    #region réinitialisation de affichageMap
                    affichageMap = new List<List<affichage>>(); for (int i = 0; i < tailleMaxCarteX; i++)
                    {
                        affichageMap.Add(new List<affichage>());
                        for (int j = 0; j < tailleMaxCarteY; j++)
                            affichageMap[i].Add(new affichage());
                    }
                    #endregion
                }
                #endregion

            } // fin while(true)
        } // fin fonction
        public void combat(Creature attaquant)
        {
            Random hasard = new Random();
            bool tourDeLAventurier = true; // on commence toujours avec l'initiative, sauf certains cas spéciaux, défini plus tards dans le temps
            const int nombreAttaqueMax = 14;
            int nombreAttaque = 0;
            string[] attaques = new string[nombreAttaqueMax];
            string[] barreManaAventurier = new string[10],
                     barreVieAttaquant   = new string[10],
                     barreVieAventurier  = new string[10];
            string[] attaque = new string[nombreAttaqueMax];
            while (attaquant.Vie > 0)
            {
                #region remplissage des barres
                {
                    int pourcentageVieAventurier = (int)(((float)m_Vie / (float)m_VieMax) * 100);
                    int pourcentageManaAventurier = (int)(((float)m_Mana / (float)m_ManaMax) * 100);
                    int pourcentageVieAttaquant = (int)(((float)attaquant.Vie / (float)attaquant.VieMax) * 100);
                    for (int i = 0; i < 100; i += 10)
                    {
                        if (i <= pourcentageManaAventurier) barreManaAventurier[(i / 10)] = "|";
                        else barreManaAventurier[(i / 10)] = " ";
                        if (i <= pourcentageVieAventurier) barreVieAventurier[(i / 10)] = "|";
                        else barreVieAventurier[(i / 10)] = " ";
                        if (i <= pourcentageVieAttaquant) barreVieAttaquant[(i / 10)] = "|";
                        else barreVieAttaquant[(i / 10)] = " ";
                    }
                }
                #endregion

                #region affichage
                Console.ForegroundColor = ConsoleColor.White;
                Console.SetCursorPosition(15, 12); Console.WriteLine("+------------------------------------------------+");
                Console.SetCursorPosition(15, 13); Console.Write("| "); Console.BackgroundColor = (tourDeLAventurier ? m_CouleurDeFond : ConsoleColor.Black); Console.ForegroundColor = m_Couleur; Console.Write(String.Format("{0,-15}", m_Nom)); Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; Console.Write("                "); Console.BackgroundColor = (tourDeLAventurier ? ConsoleColor.Black : attaquant.CouleurDeFond); Console.ForegroundColor = attaquant.Couleur; Console.Write(String.Format("{0,15}", attaquant.Espece)); Console.ForegroundColor = ConsoleColor.White; Console.BackgroundColor = ConsoleColor.Black; Console.Write(" |");
                Console.SetCursorPosition(15, 14); Console.Write("|                                                |");
                Console.SetCursorPosition(15, 15); Console.Write("|                                                |");
                Console.SetCursorPosition(15, 16); Console.Write("|                                                |");
                Console.SetCursorPosition(15, 17); Console.Write("|   "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAventurier[09]); Console.ForegroundColor = ConsoleColor.White; Console.Write("   "); Console.ForegroundColor = ConsoleColor.Blue; Console.Write(barreManaAventurier[09]); Console.ForegroundColor = ConsoleColor.White; Console.Write("                                     "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAttaquant[09]); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("  |");
                Console.SetCursorPosition(15, 18); Console.Write("|   "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAventurier[08]); Console.ForegroundColor = ConsoleColor.White; Console.Write("   "); Console.ForegroundColor = ConsoleColor.Blue; Console.Write(barreManaAventurier[08]); Console.ForegroundColor = ConsoleColor.White; Console.Write("                                     "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAttaquant[08]); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("  |");
                Console.SetCursorPosition(15, 19); Console.Write("|   "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAventurier[07]); Console.ForegroundColor = ConsoleColor.White; Console.Write("   "); Console.ForegroundColor = ConsoleColor.Blue; Console.Write(barreManaAventurier[07]); Console.ForegroundColor = ConsoleColor.White; Console.Write("                                     "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAttaquant[07]); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("  |");
                Console.SetCursorPosition(15, 20); Console.Write("|   "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAventurier[06]); Console.ForegroundColor = ConsoleColor.White; Console.Write("   "); Console.ForegroundColor = ConsoleColor.Blue; Console.Write(barreManaAventurier[06]); Console.ForegroundColor = ConsoleColor.White; Console.Write("                                     "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAttaquant[06]); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("  |");
                Console.SetCursorPosition(15, 21); Console.Write("|   "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAventurier[05]); Console.ForegroundColor = ConsoleColor.White; Console.Write("   "); Console.ForegroundColor = ConsoleColor.Blue; Console.Write(barreManaAventurier[05]); Console.ForegroundColor = ConsoleColor.White; Console.Write("                                     "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAttaquant[05]); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("  |");
                Console.SetCursorPosition(15, 22); Console.Write("|   "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAventurier[04]); Console.ForegroundColor = ConsoleColor.White; Console.Write("   "); Console.ForegroundColor = ConsoleColor.Blue; Console.Write(barreManaAventurier[04]); Console.ForegroundColor = ConsoleColor.White; Console.Write("                                     "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAttaquant[04]); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("  |");
                Console.SetCursorPosition(15, 23); Console.Write("|   "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAventurier[03]); Console.ForegroundColor = ConsoleColor.White; Console.Write("   "); Console.ForegroundColor = ConsoleColor.Blue; Console.Write(barreManaAventurier[03]); Console.ForegroundColor = ConsoleColor.White; Console.Write("                                     "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAttaquant[03]); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("  |");
                Console.SetCursorPosition(15, 24); Console.Write("|   "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAventurier[02]); Console.ForegroundColor = ConsoleColor.White; Console.Write("   "); Console.ForegroundColor = ConsoleColor.Blue; Console.Write(barreManaAventurier[02]); Console.ForegroundColor = ConsoleColor.White; Console.Write("                                     "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAttaquant[02]); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("  |");
                Console.SetCursorPosition(15, 25); Console.Write("|   "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAventurier[01]); Console.ForegroundColor = ConsoleColor.White; Console.Write("   "); Console.ForegroundColor = ConsoleColor.Blue; Console.Write(barreManaAventurier[01]); Console.ForegroundColor = ConsoleColor.White; Console.Write("                                     "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAttaquant[01]); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("  |");
                Console.SetCursorPosition(15, 26); Console.Write("|   "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAventurier[00]); Console.ForegroundColor = ConsoleColor.White; Console.Write("   "); Console.ForegroundColor = ConsoleColor.Blue; Console.Write(barreManaAventurier[00]); Console.ForegroundColor = ConsoleColor.White; Console.Write("                                     "); Console.ForegroundColor = ConsoleColor.Red; Console.Write(barreVieAttaquant[00]); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("  |");
                Console.SetCursorPosition(15, 27); Console.Write("| "); Console.Write(String.Format("{0,4}", m_Vie)); Console.Write(String.Format("{0,4}", m_Mana)); Console.Write("                                  "); Console.Write(String.Format("{0,4}", attaquant.Vie)); Console.WriteLine(" |");
                Console.SetCursorPosition(15, 28); Console.Write("|                                                |");
                Console.SetCursorPosition(15, 29); Console.Write("|                                                |");
                Console.SetCursorPosition(15, 30); Console.WriteLine("+------------------------------------------------+");
                for(int i = 0; i < nombreAttaque; i++)
                { Console.SetCursorPosition(25, (i + 15)); Console.Write(attaques[i]); }
                #endregion
                Temps.Temps.pause(1000);
                if (tourDeLAventurier)
                {
                    bool choixFait = false;
                    ConsoleKeyInfo touchePressee;
                    #region determination du choix
                    const int nombreActions = 4;
                    string[] actions = new string[nombreActions];
                    actions[0] = " Attaquer ";
                    actions[1] = "Sortileges";
                    actions[2] = "Inventaire";
                    actions[3] = "  Fuite   ";
                    bool actionChoisi = false; int choix = 0;
                    while (!actionChoisi)
                    {
                        #region affichage
                        Console.ForegroundColor = ConsoleColor.White;
                        Console.SetCursorPosition(5, 32); Console.Write("+-------------+");
                        Console.SetCursorPosition(5, 33); Console.Write("|             |");
                        Console.SetCursorPosition(5, 34); Console.Write("|             |");
                        Console.SetCursorPosition(5, 35); Console.Write("|             |");
                        Console.SetCursorPosition(5, 36); Console.Write("|             |");
                        Console.SetCursorPosition(5, 37); Console.Write("|             |");
                        Console.SetCursorPosition(5, 38); Console.Write("|             |");
                        Console.SetCursorPosition(5, 39); Console.Write("+-------------+");
                        for (int i = 0; i < nombreActions; i++)
                        {
                            Console.ForegroundColor = (i == choix) ? ConsoleColor.White : ConsoleColor.Gray;
                            Console.SetCursorPosition(7, i + 34); Console.Write(actions[i]);
                        }
                        #endregion
                        ConsoleKeyInfo touchePresse = Console.ReadKey();
                        #region reaction touche
                        switch (touchePresse.Key)
                        {
                            case ConsoleKey.UpArrow:
                                if (choix == 0) choix = nombreActions;
                                choix--;
                                break;
                            case ConsoleKey.DownArrow:
                                choix++;
                                if (choix == nombreActions) choix = 0;
                                break;
                            case ConsoleKey.Enter: actionChoisi = true;
                                break;
                            default: break;
                        }
                        #endregion
                    }
                    #endregion
                    #region reaction en fonction de l'action
                    switch (choix)
                    {
                        case 0:
                            #region attaque
                            // si notre attaque + notre force est plus importante que celle du monstre
                            if (((hasard.Next(1, 6) + hasard.Next(1, 6)) + attaquant.Force) <= ((hasard.Next(1, 6) + hasard.Next(1, 6)) + m_Force + 2)) // bénéficie d'un bonus de +2 du a l'initiative
                            {
                                // On a infligé 'force' degat a monstre
                                attaques[nombreAttaque] = m_Nom + " ► " + attaquant.Espece + " : -" + m_Force + "pdv";
                                attaquant.Vie -= m_Force;
                                if (attaquant.Vie < 0) attaquant.Vie = 0;
                            }
                            else // c'est que le monstre a été plus fort
                            {
                                // le monstre nous a infligé 'force' degats
                                attaques[nombreAttaque] = m_Nom + " ◄ " + attaquant.Espece + " : -" + attaquant.Force + "pdv";
                                m_Vie -= attaquant.Force;
                                if (m_Vie <= 0) mort();
                            }
                            nombreAttaque++;
                            if (nombreAttaque >= nombreAttaqueMax)
                                nombreAttaque = 0;
                            #endregion
                            break; // attaquer
                        case 1:
                            #region sortilege
                            if (m_Grimmoire.Count > 0)
                            {
                                #region affichage du grimoire
                                choix = 0;
                                while (!choixFait)
                                {
                                    Console.ForegroundColor = ConsoleColor.White;
                                    Console.SetCursorPosition(22, 32); Console.WriteLine("+--------------------------------------------------+");
                                    Console.SetCursorPosition(22, 33); Console.WriteLine("|                  Lancer le sort :                |");
                                    for (int i = 0; i < m_Grimmoire.Count; i++)
                                    {
                                        Console.SetCursorPosition(22, (34 + i));
                                        Console.Write("| ");
                                        Console.ForegroundColor = (i == choix ? ConsoleColor.Red : ConsoleColor.White);
                                        Console.WriteLine(m_Grimmoire[i].ToString());
                                        Console.ForegroundColor = ConsoleColor.White;
                                        Console.WriteLine(" |");
                                    }
                                    Console.SetCursorPosition(22, (m_Grimmoire.Count + 34)); Console.WriteLine("|                                                  |");
                                    Console.SetCursorPosition(22, (m_Grimmoire.Count + 35)); Console.WriteLine("+--------------------------------------------------+");
                                    touchePressee = Console.ReadKey();
                                    switch (touchePressee.Key)
                                    {
                                        case ConsoleKey.UpArrow:
                                            choix--;
                                            if (choix < 0) choix = m_Grimmoire.Count;
                                            break;
                                        case ConsoleKey.DownArrow:
                                            choix++;
                                            if (choix == m_Grimmoire.Count) choix = 0;
                                            break;
                                        case ConsoleKey.Enter: break;
                                        default: break;
                                    }
                                }
                                #endregion
                            }
                            #region si le joueur ne connais aucun sort
                            else
                            {
                                Console.SetCursorPosition(22, 32); Console.WriteLine("+--------------------------------------------------+");
                                Console.SetCursorPosition(22, 33); Console.WriteLine("|                                                  |");
                                Console.SetCursorPosition(22, 34); Console.WriteLine("|            Vous ne connaissez aucun sorts        |");
                                Console.SetCursorPosition(22, 35); Console.WriteLine("|                                                  |");
                                Console.SetCursorPosition(22, 36); Console.WriteLine("+--------------------------------------------------+");
                                Console.ReadKey();
                                continue;
                            }
                            #endregion
                            #endregion
                            break; // sortilege
                        case 2:
                            #region inventaire
                            choix = 0;
                            List<string> inventaireSac = new List<string>();
                            #region remplissage de inventaireSac
                            List<int> nombreValeurDejaUtilise = new List<int>();
                            for (int i = 0; i < m_Sac.Count; i++)
                            {
                                try
                                {
                                    foreach (int j in nombreValeurDejaUtilise)
                                        if (i == j) throw new Exception(); // on recomm la boucle
                                    int nombreObj = 1;
                                    for (int j = (i + 1); j < m_Sac.Count; j++) // on parcour le reste du sac
                                        if (m_Sac[i].EstEgalA(m_Sac[j]))
                                        {
                                            nombreValeurDejaUtilise.Add(j);
                                            nombreObj++;
                                        }
                                    inventaireSac.Add(String.Format("{0,-48}", (m_Sac[i].ToString() + " x" + nombreObj)));
                                }
                                catch (Exception ex) { } // si on attrape une excepetion, c'est qu'on a déjà vu l'objet, il faut recom la boucle
                            }
                            #endregion
                            if (inventaireSac.Count > 0)
                            {
                                while (!choixFait)
                                {
                                    #region affichage du sac
                                    Console.ForegroundColor = ConsoleColor.White;
                                    Console.SetCursorPosition(22, 32); Console.WriteLine("+--------------------------------------------------+");
                                    Console.SetCursorPosition(22, 33); Console.WriteLine("|                  Utiliser :                      |");
                                    for (int i = 0; i < inventaireSac.Count; i++)
                                    {
                                        Console.SetCursorPosition(22, (34 + i));
                                        Console.Write("| ");
                                        Console.ForegroundColor = (i == choix ? ConsoleColor.Red : ConsoleColor.White);
                                        Console.Write(inventaireSac[i]);
                                        Console.ForegroundColor = ConsoleColor.White;
                                        Console.WriteLine(" |");
                                    }
                                    Console.SetCursorPosition(22, (inventaireSac.Count + 34)); Console.WriteLine("|                                                  |");
                                    Console.SetCursorPosition(22, (inventaireSac.Count + 35)); Console.WriteLine("+--------------------------------------------------+");
                                    #endregion
                                    touchePressee = Console.ReadKey();
                                    #region reaction touche pressée
                                    switch (touchePressee.Key)
                                    {
                                        case ConsoleKey.DownArrow:
                                            choix++;
                                            if (choix == inventaireSac.Count) choix = 0;
                                            break;
                                        case ConsoleKey.UpArrow:
                                            if (choix == 0)
                                                choix = inventaireSac.Count;
                                            choix--;
                                            break;
                                        case ConsoleKey.Enter:
                                            choixFait = true;
                                            break;
                                        default: break;
                                    }
                                    #endregion
                                    #region réaction en fonction de l'élément selectionné
                                    #endregion
                                }
                            }
                            #region si le joueur a un inventaire vide
                            else
                            {
                                Console.SetCursorPosition(22, 32); Console.WriteLine("+--------------------------------------------------+");
                                Console.SetCursorPosition(22, 33); Console.WriteLine("|                                                  |");
                                Console.SetCursorPosition(22, 34); Console.WriteLine("|       Vous n'avez rien dans votre inventaire     |");
                                Console.SetCursorPosition(22, 35); Console.WriteLine("|                                                  |");
                                Console.SetCursorPosition(22, 36); Console.WriteLine("+--------------------------------------------------+");
                                Console.ReadKey();
                                continue;
                            }
                            #endregion
                            #endregion
                            break; // inventaire

                        case 3:
                        #region fuite

                        #endregion
                            break; // fuite
                    }
                    #endregion
                }
                else // ca veut dire que c'est l'autre qui a l'initiative
                {
                    #region attaque
                    // si notre attaque + notre force est plus importante que celle du monstre
                    if (((hasard.Next(1, 6) + hasard.Next(1, 6)) + attaquant.Force + 2) <= ((hasard.Next(1, 6) + hasard.Next(1, 6)) + m_Force)) // bénéficie d'un bonus de +2 du a l'initiative
                    {
                        // On a infligé 'force' degat a monstre
                        attaques[nombreAttaque] = m_Nom + " ► " + attaquant.Espece + " : -" + m_Force + "pdv";
                        attaquant.Vie -= m_Force;
                        if (attaquant.Vie < 0) attaquant.Vie = 0;
                    }
                    else // c'est que le monstre a été plus fort
                    {
                        // le monstre nous a infligé 'force' degats
                        attaques[nombreAttaque] = m_Nom + " ◄ " + attaquant.Espece + " : -" + attaquant.Force + "pdv";
                        m_Vie -= attaquant.Force;
                        if (m_Vie <= 0) mort();
                    }
                    nombreAttaque++;
                    if (nombreAttaque >= nombreAttaqueMax)
                        nombreAttaque = 0;
                    #endregion
                }
                #region si le joueur meurt au court du combat
                if (m_Mort)
                {
                    mort();
                    throw new Exception("Vous etes dead");
                }
                #endregion
                // on change l'initiative de coté
                tourDeLAventurier = !tourDeLAventurier;
            } // fin while
            //on gagne le nombre d'xp fois le rapport entre notre niveau et le niveau de l'attaquant
            m_XP += (int)(((float)attaquant.Niveau / (float)m_Niveau) * attaquant.DonneXP);
            #region affichage fin du combat
            Console.ForegroundColor = ConsoleColor.White;
            Console.SetCursorPosition(25, 18); Console.Write("                               ");
            Console.SetCursorPosition(25, 19); Console.Write("         Fin du Combat         ");
            Console.SetCursorPosition(25, 20); Console.Write("      Vous gagnez {0} xp       ", ((int)(((float)attaquant.Niveau / (float)m_Niveau) * attaquant.DonneXP)));
            Console.SetCursorPosition(25, 21); Console.Write("                               ");
            Console.ReadKey();
            #endregion
            while(gagneNiveau(false)); // on vérifie si on gagne un ou des niveau(x)
        } // fin fonction