using CoreLibrary.Exceptions; namespace CoreLibrary { /// /// Implémente les règles du jeu. /// public class ReglesClassiques : IRegles { private int nbJoueurs = 0; private int? joueurCourant; private readonly Joueur[] joueurs; /// /// Obtient le nom des règles. /// public string Nom { get => "Règles classiques"; } /// /// Obtient le nombre maximum de tours. /// public int TourMaximum { get => 12; } /// /// Obtient la taille maximale d'un code. /// public int TailleCodeMaximum { get => 4; } /// /// Obtient le nombre de joueurs actuels dans le jeu. /// public int NbJoueurs { get => nbJoueurs; } /// /// Obtient le nombre maximum de joueurs possible pour le jeu. /// public int NbJoueursMaximum { get => 2; } /// /// Initialise une nouvelle instance de la classe en initialisant un tableau de joueurs avec la taille maximale de joueurs autorisée. /// public ReglesClassiques() { joueurs = new Joueur[NbJoueursMaximum]; } /// /// Ajoute un joueur avec le nom spécifié. /// /// Le nom du joueur à ajouter. /// Le joueur ajouté. public Joueur AjouterJoueur(string nom) { Joueur joueur = new Joueur(nom, new Plateau(TailleCodeMaximum, TourMaximum)); joueurs[nbJoueurs++] = joueur; return joueur; } /// /// Obtient le joueur dont c'est actuellement le tour. /// /// Le joueur actuel. /// Levée lorsqu'il n'y a pas de joueur courant. public Joueur JoueurCourant() { if (!joueurCourant.HasValue) throw new PartieNonCommenceeException(); return joueurs[joueurCourant.Value]; } /// /// Passe la main au joueur suivant. /// /// Levée lorsqu'il n'y a pas de joueur courant. public void PasserLaMain() { if (!joueurCourant.HasValue) { throw new PartieNonCommenceeException(); } joueurCourant++; if (joueurCourant >= joueurs.Length) { joueurCourant = 0; } } /// /// Génère un nouveau code. /// /// Le code généré public Code GenererCode() { return new Code(TailleCodeMaximum); } /// /// Initialise le premier joueur à jouer. /// public void CommencerLaPartie() { joueurCourant = 0; } /// /// Vérifie si la partie est terminée. /// /// True si la partie est terminée, sinon False. public bool EstTerminee() { if (!joueurCourant.HasValue || joueurCourant != 0) return false; if (JoueurCourant().Plateau.Tour > TourMaximum) return true; for (int i = 0; i < joueurs.Length; ++i) { if (joueurs[i].Plateau.Victoire) return true; } return false; } /// /// Obtient les joueurs gagnants de la partie. /// /// La liste des joueurs gagnants. public IEnumerable Gagnants() { Joueur[] gagnants = []; for (int i = 0; i < joueurs.Length; ++i) { if (joueurs[i].Plateau.Victoire) { gagnants = gagnants.Append(joueurs[i]).ToArray(); } } return gagnants; } /// /// Obtient les joueurs perdants de la partie. /// /// La liste des joueurs perdants. public IEnumerable Perdants() { Joueur[] perdants = []; for (int i = 0; i < joueurs.Length; ++i) { if (!joueurs[i].Plateau.Victoire) { perdants = perdants.Append(joueurs[i]).ToArray(); } } return perdants; } } }