add some comment

This commit is contained in:
bwbl 2024-10-24 01:15:18 +02:00
parent 51a28c132c
commit 1bf04420a8

View File

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