Skip to content

Instantly share code, notes, and snippets.

@wRadion
Last active April 2, 2020 14:00
Show Gist options
  • Save wRadion/2df4936cc10fed46ebaae541592bb39b to your computer and use it in GitHub Desktop.
Save wRadion/2df4936cc10fed46ebaae541592bb39b to your computer and use it in GitHub Desktop.
Cours Jour 4 - Morpion (sans classes)
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