Last active
April 2, 2020 14:00
-
-
Save wRadion/2df4936cc10fed46ebaae541592bb39b to your computer and use it in GitHub Desktop.
Cours Jour 4 - Morpion (sans classes)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
namespace CoursJour4 | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
// Déclare et initialise la grille | |
char[,] grid = new char[3, 3]; | |
// Rempli la grille de vide (espace) | |
for (int y = 0; y < grid.GetLength(1); ++y) | |
{ | |
for (int x = 0; x < grid.GetLength(0); ++x) | |
{ | |
grid[x, y] = (x + (y * 3) + 1).ToString()[0]; | |
} | |
} | |
// Génère un nombre aléatoire entre 0 et 1 | |
int random = new Random().Next(0, 1); | |
// Déclare la variable "joueur dont c'est le tour" | |
char currentPlayer; | |
// Initialise le "joueur dont c'est le tour" en fonction | |
// du nombre aléatoire | |
if (random == 0) | |
{ | |
currentPlayer = 'O'; | |
} | |
else // if (random == 1) | |
{ | |
currentPlayer = 'X'; | |
} | |
// Déclarer la variable qui va contenir le gagnant | |
char winner; | |
while (true) | |
{ | |
// Affiche la grille dans la console | |
ShowGrid(grid); | |
while (true) | |
{ | |
// Demande au "joueur dont c'est le tour" de rentrer/taper un index de case entre 1 et 9 | |
Console.Write("Joueur " + currentPlayer + ", entrez un index de case entre 1 et 9 : "); | |
string input = Console.ReadLine(); | |
int cellIndex = int.Parse(input); | |
// Récupère la case que le joueur vient de rentrer/taper | |
char targetCell = GetCell(grid, cellIndex); | |
// Si la case n'est pas vide | |
if (targetCell == 'O' || targetCell == 'X') | |
{ | |
// Dit au joueur que la case est déjà remplie | |
Console.WriteLine("Cette case est déjà remplie. Veuillez entrer une autre case."); | |
} | |
else // Sinon, si la case est vide | |
{ | |
// Met à jour la case avec le caractère du "joueur dont c'est le tour" | |
SetCell(grid, cellIndex, currentPlayer); | |
break; | |
} | |
} | |
// Récupère le gagnant (si gagnant il y a) | |
winner = GetWinner(grid); | |
// Si y'a un gagnant | |
if (winner != '\0') | |
{ | |
// On sort de la boucle | |
break; | |
} | |
else // Sinon, aucun gagnant pour le moment | |
{ | |
bool isGridFull = true; | |
// Vérifie si la grille est remplie | |
for (int y = 0; y < grid.GetLength(1); ++y) | |
{ | |
for (int x = 0; x < grid.GetLength(0); ++x) | |
{ | |
if (grid[x, y] != 'O' && grid[x, y] != 'X') | |
isGridFull = false; | |
} | |
} | |
// Si la grille est remplie | |
if (isGridFull) | |
{ | |
// On sort de la boucle | |
break; | |
} | |
else // Sinon (la grille n'est pas encore remplie) | |
{ | |
// Change le "joueur dont c'est le tour" | |
if (currentPlayer == 'O') | |
{ | |
currentPlayer = 'X'; | |
} | |
else // currentPlayer == 'X' | |
{ | |
currentPlayer = 'O'; | |
} | |
} | |
} | |
} | |
// On réaffiche la grille une dernière fois | |
ShowGrid(grid); | |
// Si y'a un gagnant | |
if (winner != '\0') | |
{ | |
// Affiche le joueur gagnant | |
Console.WriteLine("Le joueur " + winner + " a gagné la partie !"); | |
} | |
else | |
{ | |
// Affiche Match nul | |
Console.WriteLine("Match nul !"); | |
} | |
Console.ReadKey(); | |
} | |
// Transforme l'index donné par le joueur | |
// en deux coordonnées (x et y) | |
static Tuple<int, int> GetCoordinates(int index) | |
{ | |
--index; | |
return new Tuple<int, int>(index % 3, index / 3); | |
} | |
static void ShowGrid(char[,] grid) | |
{ | |
Console.WriteLine("┌───┬───┬───┐"); | |
for (int y = 0; y < grid.GetLength(1); ++y) | |
{ | |
Console.Write("│ "); | |
for (int x = 0; x < grid.GetLength(0); ++x) | |
{ | |
Console.Write(grid[x, y]); | |
if (x < grid.GetLength(0) - 1) | |
{ | |
Console.Write(" │ "); | |
} | |
} | |
Console.WriteLine(" |"); | |
if (y < grid.GetLength(1) - 1) | |
{ | |
Console.WriteLine("├───┼───┼───┤"); | |
} | |
} | |
Console.WriteLine("└───┴───┴───┘"); | |
} | |
// Récupère une case du tableau | |
static char GetCell(char[,] grid, int index) | |
{ | |
Tuple<int, int> point = GetCoordinates(index); | |
return grid[point.Item1, point.Item2]; | |
} | |
// Mettre à jour une case du tableau | |
static void SetCell(char[,] grid, int index, char value) | |
{ | |
Tuple<int, int> point = GetCoordinates(index); | |
grid[point.Item1, point.Item2] = value; | |
} | |
static char GetWinner(char[,] grid) | |
{ | |
// Première ligne | |
if (grid[0, 0] == grid[1, 0] && grid[1, 0] == grid[2, 0]) | |
{ | |
return grid[0, 0]; | |
} | |
// Deuxième ligne | |
else if (grid[0, 1] == grid[1, 1] && grid[1, 1] == grid[2, 1]) | |
{ | |
return grid[0, 1]; | |
} | |
// Troisième ligne | |
else if (grid[0, 2] == grid[1, 2] && grid[1, 2] == grid[2, 2]) | |
{ | |
return grid[0, 2]; | |
} | |
// Première colonne | |
else if (grid[0, 0] == grid[0, 1] && grid[0, 1] == grid[0, 2]) | |
{ | |
return grid[0, 0]; | |
} | |
// Deuxième colonne | |
else if (grid[1, 0] == grid[1, 1] && grid[1, 1] == grid[1, 2]) | |
{ | |
return grid[1, 0]; | |
} | |
// Troisième colonne | |
else if (grid[2, 0] == grid[2, 1] && grid[2, 1] == grid[2, 2]) | |
{ | |
return grid[2, 0]; | |
} | |
// Première diagonale | |
else if (grid[0, 0] == grid[1, 1] && grid[1, 1] == grid[2, 2]) | |
{ | |
return grid[0, 0]; | |
} | |
// Deuxième diagonale | |
else if (grid[2, 0] == grid[1, 1] && grid[1, 1] == grid[0, 2]) | |
{ | |
return grid[2, 0]; | |
} | |
return '\0'; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment