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);