diff --git a/Program.cs b/Program.cs index 740fc6d..1c5cf73 100644 --- a/Program.cs +++ b/Program.cs @@ -1,5 +1,7 @@ namespace P4 { + + // Création d'un enum pour les jetons public enum Token { None, @@ -7,50 +9,84 @@ SecondPlayer, } + /// + /// Classe programme c'est la class qui est éxécutée par le programme + /// public class Program { - /*public readonly ConsoleColor FIRSTPLAYERCOLOR = ConsoleColor.Magenta; - public readonly ConsoleColor SECONDPLAYERCOLOR = ConsoleColor.DarkMagenta; - - const ConsoleColor backgroundColor = ConsoleColor.DarkYellow; - const ConsoleColor foregroundColor = ConsoleColor.Black;*/ - + // Déclaration des couleurs des joueurs public readonly ConsoleColor FIRSTPLAYERCOLOR = ConsoleColor.Red; public readonly ConsoleColor SECONDPLAYERCOLOR = ConsoleColor.Yellow; + // Déclaration des couleurs de la console const ConsoleColor BACKGROUND_COLOR = ConsoleColor.Black; const ConsoleColor FOREGROUND_COLOR = ConsoleColor.White; + /// + /// Méthode qui change les couleurs de la console + /// + /// couleur de fond + /// couleur du texte public void SetColor(ConsoleColor backgroundColor = BACKGROUND_COLOR, ConsoleColor foregroundColor = FOREGROUND_COLOR) { Console.ForegroundColor = foregroundColor; Console.BackgroundColor = backgroundColor; } + /// + /// Méthode Main la méthode qui s'éxécute au lancement du programme + /// + /// tableau des arguments données au programme static void Main(string[] args) { + // on définit les couleurs par défaut de la console new Program().SetColor(); + + // on vide la console Console.Clear(); + + // on dessine le titre new Draw().DrawTitle(); + + // on enleve le curseur Console.CursorVisible = false; + + // on récupère la taille du plateau int[] boardSize = new Board().BoardSize(); + + // on crée un tableau de jetons Token[,] board = new Token[boardSize[0], boardSize[1]]; + + // on lance le jeu new Game().Start(board); + + // on demande si les joueurs veulent rejouer new Game().Replay(); } } + /// + /// Classe Game qui contient tout les méthodes pour jouer + /// public class Game { + // on crée des instances d'autres classes private Draw _draw = new Draw(); private Program _program = new Program(); + /// + /// Méthode Replay qui demande si les joueurs veulent rejouer et relance le jeu si c'est le cas + /// public void Replay() { + // on demande si l'utilisateur veut rejouer Console.WriteLine("Voulez-vous rejouer ? (o/n)"); + + // on regarde quelle touche a été pressée switch (Console.ReadKey().Key) { case ConsoleKey.O: + // si c'est oui on relance le jeu new Program().SetColor(); Console.Clear(); new Draw().DrawTitle(); @@ -60,77 +96,112 @@ new Game().Replay(); break; case ConsoleKey.N: + // si c'est non on quitte le programme return; default: + // sinon on demande de réessayer Console.WriteLine("Entrée invalide"); Replay(); break; } } + + /// + /// Méthode Start qui lance la boucle principale du jeu + /// + /// tableau de jetons en 2 dimensions public void Start(Token[,] board) { - int currentPosition = 0; - Token currentPlayer = Token.FirstPlayer; - bool placed = false; + // initialisation des variables + int currentPosition = 0; // position actuelle + Token currentPlayer = Token.FirstPlayer; // joueur actuel + bool placed = false; // vérification s'il on peut placer un jeton + + // on vide la console Console.Clear(); + + // on efface le curseur au cas où la taille de la fenêtre aurait changé Console.CursorVisible = false; + + // on dessine le titre l'espace de jeu le plateau et l'aide _draw.DrawTitle(_draw.leftSpacing); _draw.DrawPlayGroundBorder(board); _draw.DrawBorder(board); _draw.DrawHelp(board); + // boucle principale du jeu while (!CheckWin(board)) { + // on check si c'est une égalité if (CheckDraw(board)) break; + + // on dessine les jetons dans l'espace de jeu et le plateau _draw.DrawBoard(board); _draw.DrawPlayGround(board, currentPlayer, currentPosition); + // on récupère la touche pressée ConsoleKey key = Console.ReadKey(true).Key; + + // on regarde si la touche est escape if (key == ConsoleKey.Escape) { + // s'il le joueur appuie sur escape il n'y a pas de gagnant donc on set le currentPlayer à None currentPlayer = Token.None; break; } + + // on regarde les actions des joueurs switch (key) { case ConsoleKey.RightArrow: + // on incrémente la position actuelle si elle est inférieure à la taille du plateau if (currentPosition < board.GetLength(0) - 1) currentPosition++; else + // on loop si on est à la fin du plateau currentPosition = 0; break; case ConsoleKey.LeftArrow: + // on decremente la position actuelle si elle est superieure à 0 if (currentPosition > 0) currentPosition--; else + // on loop si on est à le début du plateau currentPosition = board.GetLength(0) - 1; break; case ConsoleKey.Enter: case ConsoleKey.Spacebar: + // on place le jeton et on change de joueur placed = PlaceToken(board, currentPlayer, currentPosition); if (placed && currentPlayer == Token.FirstPlayer) currentPlayer = Token.SecondPlayer; else if (placed && currentPlayer == Token.SecondPlayer) currentPlayer = Token.FirstPlayer; - break; } } + + // on dessine les derniers jetons _draw.DrawBoard(board); _draw.DrawPlayGround(board, currentPlayer, currentPosition); + + // on reset les couleurs _program.SetColor(); - //Console.Clear(); + + // on place le curseur en bas du tableau avec le bon spacing Console.SetCursorPosition(0, board.GetLength(1) * 2 + _draw.topSpacing + 4); - // currentplayer est inversé + + // on verifie s'il y a une égalité if (CheckDraw(board)) Console.WriteLine("il y a eu une égalité"); else if (currentPlayer == Token.FirstPlayer) { + // si le joueur acctuel est le joueur 1 cela signifie que le joueur 2 a gagné Console.Write("Le "); _program.SetColor(foregroundColor: _program.SECONDPLAYERCOLOR); Console.Write("joueur 2"); @@ -140,19 +211,28 @@ } else if (currentPlayer == Token.SecondPlayer) { + // si le joueur acctuel est le joueur 2 cela signifie que le joueur 1 a gagné Console.Write("Le "); _program.SetColor(foregroundColor: _program.FIRSTPLAYERCOLOR); Console.Write("joueur 1"); _program.SetColor(); Console.WriteLine(" a gagné"); - } else if (currentPlayer == Token.None) + } + else if (currentPlayer == Token.None) { + // si le joueur acctuel est None cela signifie que la partie a été arrêtée Console.WriteLine("La partie à été arrêtée"); } + // on affiche le nombre de tours Console.WriteLine("La partie à duré " + Turn(board) + " tours"); } - static int Turn(Token[,] board) + /// + /// Méthode Turn qui compte le nombre de jetons sur le plateau + /// + /// tableau de jetons + /// nombre de jetons sur le plateau + int Turn(Token[,] board) { int count = 0; // compteur for (int y = 0; y < board.GetLength(1); y++) @@ -161,12 +241,19 @@ { if (board[x, y] != 0) { + // ajoute 1 s'il le jeton n'est pas égal à 0 count++; } } } return count; } + + /// + /// Méthode qui vérifie s'il y a une égalité + /// + /// tableau de jetons + /// return false t'en qu'il y a au moins 1 0 sur le plateau private bool CheckDraw(Token[,] board) { for (int y = 0; y < board.GetLength(1); y++) @@ -182,8 +269,14 @@ return true; } + /// + /// Méthode qui vérifie si un joueur a gagné + /// + /// tableau de jetons + /// return true s'il y a une combinaison gagnante private bool CheckWin(Token[,] board) { + // tableau des joueurs Token[] players = {Token.FirstPlayer, Token.SecondPlayer}; // boucle qui alterne entre les joueurs 1 et 2 foreach (var j in players) @@ -254,14 +347,27 @@ return false; } + /// + /// Méthode qui place un jeton sur le plateau + /// + /// plateau de jetons + /// joueur acctuel + /// position du joueur + /// private bool PlaceToken(Token[,] board, Token currentPlayer, int currentPosition) { for (int i = board.GetLength(1) - 1; i >= 0; i--) { + // si la case est déjà occupée on continue if (board[currentPosition, i] != Token.None) continue; + + // sinon on place le jeton board[currentPosition, i] = currentPlayer; + + // on revoie vrai s'il on a placé le jeton return true; } + // on revoie faux s'il on n'a pas placé le jeton return false; } } @@ -312,15 +418,27 @@ } } - + /// + /// Classe Draw qui contient toutes les méthodes pour render + /// public class Draw { + // on instancie la classe Program private Program _program = new Program(); + + // on définit les espacements public int topSpacing = 4; public int leftSpacing = 10; + + /// + /// Méthode DrawPlayGroundBorder qui dessine le terrain de jeu + /// + /// plateau de jetons public void DrawPlayGroundBorder(Token[,] board) { + // on place le curseur en haut du terrain de jeu après le titre Console.SetCursorPosition(leftSpacing, topSpacing); + // on dessine la première ligne du terrain de jeu Console.Write("╔═══"); for (int x = 0; x < board.GetLength(0) - 1; x++) { @@ -328,6 +446,8 @@ } Console.Write("╗"); + + // on dessine les autres lignes du terrain de jeu for (int y = 0; y < board.GetLength(1); y++) { for (int x = 0; x < board.GetLength(0); x++) @@ -338,6 +458,7 @@ Console.Write(" ║"); } + // on dessine la dernière ligne du terrain de jeu Console.SetCursorPosition(leftSpacing, topSpacing + 2); Console.Write("╚═══"); for (int x = 0; x < board.GetLength(0) - 1; x++) @@ -347,21 +468,38 @@ Console.Write("╝"); } + /// + /// Méthode DrawPlayGround qui dessine les jetons dans le terrain de jeu + /// + /// tableau de jetons + /// joueur acctuel + /// position du joueur acctuel public void DrawPlayGround(Token[,] board, Token currentPlayer, int currentPosition) { for (int x = 0; x < board.GetLength(0); x++) { + // on place le curseur dans chaque case du terrain de jeu Console.SetCursorPosition(leftSpacing + x * 4+2, topSpacing + 1); + // on dessine le jeton du joueur actuel si la position actuelle est égale à la position x sinon on ne dessine rien if (currentPosition == x) Console.Write(DrawToken(currentPlayer)); else Console.Write(DrawToken(Token.None)); } } + /// + /// Méthode DrawBorder qui dessine les bordures du plateau + /// + /// tableau de jetons public void DrawBorder(Token[,] board) { + // déclaration de l'espacement du plateau int playgroundSpacing = topSpacing + 3; + + // on place le curseur en haut du plateau Console.SetCursorPosition(leftSpacing, playgroundSpacing); + + // on dessine la première ligne du plateau Console.Write("╔═══"); for (int x = 0; x < board.GetLength(0) - 1; x++) { @@ -369,6 +507,7 @@ } Console.Write("╗"); + // on dessine les autres lignes du plateau for (int y = 0; y < board.GetLength(1); y++) { for (int x = 0; x < board.GetLength(0); x++) @@ -379,6 +518,7 @@ Console.Write(" ║"); } + // on dessine les interligne du plateau for (int y = 0; y < board.GetLength(1) - 1; y++) { Console.SetCursorPosition(leftSpacing, y * 2 + playgroundSpacing + 2); @@ -391,6 +531,7 @@ Console.Write("╣"); } + // on dessine la dernière ligne du plateau Console.SetCursorPosition(leftSpacing, board.GetLength(1) * 2 + playgroundSpacing); Console.Write("╚═══"); for (int x = 0; x < board.GetLength(0) - 1; x++) @@ -400,37 +541,61 @@ Console.Write("╝"); } + /// + /// Méthode DrawBoard qui dessine les jetons sur le plateau + /// + /// tableau de jetons public void DrawBoard(Token[,] board) { - int playgroundSpacing = topSpacing + 3; + // déclaration de l'espacement du plateau + int playgroundSpacing = topSpacing + 3 for (int y = 0; y < board.GetLength(1); y++) for (int x = 0; x < board.GetLength(0); x++) { + // on place le curseur dans chaque case du plateau Console.SetCursorPosition(leftSpacing + x * 4+2, y*2 + playgroundSpacing + 1); + // on dessine le jeton qui correspond à la case Console.Write("{0}", DrawToken(board[x, y])); } } + /// + /// Méthode DrawToken qui transforme un jeton en string + /// + /// jeton à transformer + /// jeton transformé public string DrawToken(Token token) { switch (token) { case Token.FirstPlayer: + // on set la couleur du premier joueur _program.SetColor(foregroundColor: _program.FIRSTPLAYERCOLOR); + // on retourne le jeton return "■"; case Token.SecondPlayer: + // on set la couleur du deuxième joueur _program.SetColor(foregroundColor: _program.SECONDPLAYERCOLOR); + // on retourne le jeton return "■"; case Token.None: + // on set la couleur par défaut _program.SetColor(foregroundColor: ConsoleColor.DarkGray); + // on retourne le jeton return "≡"; default: + // revoye le rest au cas où return default; } } + /// + /// Méthode DrawTitle qui dessine le titre du jeu + /// + /// espacement entre le bord et le titre public void DrawTitle(int spacing = 0) { + // on met le curseur à la bonne position avant d'écrire chaques lignes Console.SetCursorPosition(spacing, 0); Console.WriteLine("╔═══════════════════════════════════╗"); Console.SetCursorPosition(spacing, 1); @@ -441,8 +606,14 @@ Console.WriteLine("╚═══════════════════════════════════╝"); } + + /// + /// Méthode DrawHelp qui dessine l'aide du jeu + /// + /// tableau de jetons public void DrawHelp(Token[,] board) { + // on dessine l'aide relative au plateau et qu'avec des positions WriteHelp(board, 0, 0, "Mode d'utilisation"); WriteHelp(board, 0, 1, "-------------------"); WriteHelp(board, 4, 2, "Déplacement"); @@ -461,6 +632,13 @@ WriteHelp(board, 28, 6, " "); } + /// + /// Méthode WriteHelp qui écrit les phrases de l'aide + /// + /// tableau de jetons + /// position x + /// position y + /// text à écrire à cette position private void WriteHelp(Token[,] board, int x, int y, string text) { Console.SetCursorPosition(leftSpacing + board.GetLength(0) * 4 + 8 + x, topSpacing + y);