// Ce programme implémente le jeu X-O.
// Demande l’usager de jouer (c’est possible de jouer plusieurs fois)
// Un tableau de jeu est affiché et chaque joueur peut placer X ou O 
// Quand un gagnant ou match nul est détecté, le program affiche un 
// message et demande l’usager s’il veut commencer un autre jeu.


class D4Q2TTT
{
  /*
   * Methode: main
   * 
   * controle le jeu: la boucle extérieure pour commencer un autre jeu
   * la boucle intérieure pour les étapes de même jeu.
   */
  public static void main (String[] args)
  {
    // DECLARE DES VARIABLES 
    
    char [] [] tableau;  // reference au tableau de jeu
    char [] reponse;     // reponse de l’usager
    boolean gagnant;     // true quand il y a un gagnant
    
    
    // Créer le tableau de jeu
    tableau = new char[3][3];  // la seule matrice utilise dans le programme.
    
    System.out.println ("Voulez-vous commencer une nouvelle partie (O ou N):");
    reponse = ITI1520.readCharLine();    
    while ( (reponse[0] == 'o') || (reponse[0] == 'O') ) 
    {
      D4Q2Lib.effaceTableau(tableau);  // prepare le tableau de jeu
      gagnant = false;  // initialise la variable gagnant
      while(!gagnant)
      {
        afficheTableau(tableau);  // affiche le tableau de jeu
        joue(tableau,'X');  // demande joueur X de jouer
        gagnant = D4Q2Lib.verifieQuiAGagne(tableau);  // il a gagne?
        if(!gagnant) 
        {  // pas de gagnant, l’autre joueur peut jouer
          afficheTableau(tableau); // affiche le tableau
          joue(tableau,'O');  // demande joueur O de jouer
          gagnant = D4Q2Lib.verifieQuiAGagne(tableau);  // il a gagne?
        }
      }
      afficheTableau(tableau); // affiche le résultat du jeu
      System.out.println ("Voulez-vous commencer une nouvelle partie (O ou N):");
      reponse = ITI1520.readCharLine(); 
    }
  }
  
  /*
   * METHODE:  void afficheTableau(char [][])
   *  affiche le tableau de jeu
   * 
   * DONNEE:  char [][] tab:  une référence a une matrice 3X3 qui contient '-', 'X' ou 'O'
   * 
   * Le format est:
   *    0 1 2
   *  0 - - O
   *  1 - X -
   *  2 - - X
   */   
  public static void afficheTableau ( char [] [] tab)
  {
    // DECLARE DES VARIABLES  
    int l;  // index pour les lignes
    int c;  // index pour les colonnes
    
    // MODULE DE L’ALGORITHME
    System.out.println("  0 1 2");
    for(l = 0 ; l < tab.length ; l++) 
    {
      System.out.print(l);
      for(c = 0 ; c < tab[l].length ; c++) 
      {
        System.out.print(" " + tab[l][c]);
      } 
      System.out.println();
    }
  }
  
  /*
   * METHODE:  void joue(char [][] tab, char joueur) 
   * 
   *  Cette méthode joue une étape de jeu
   * 
   *  DONNEE: char [][] tab:  une référence a une matrice 3X3
   *          char joueur:  X ou O pour indiquer qui joue
   *  MODIFIEE: tab (un élément de la matrice est changé)
   *
   */
  public static void joue ( char [] [] tab, char joueur)
  {
    // DECLARE DES VARIABLES     
    int [] place;  // variable reference, pour la position l and c, dans un tableau de 2 elements
    
    // MODULE DE L’ALGORITHME
    do  // trouve une position qui n’est pas occupée, qui contient '-‘
    {
      do  // prends de valeurs valides pour l et c 
      {
        System.out.println ("Joueur " + joueur + 
                            ", SVP SVP indiquez une ligne et une colonne de 0 a 2: ");
        place = ITI1520.readIntLine(); // créer un tableau avec deux éléments
      }
      while( place.length != 2 || // quand ce test est faux, les autre testes
                                  // ne sont pas exécutés
            ! ((0 <= place[0]) && (place[0] <= 2)) ||
            ! ((0 <= place[1]) && (place[1] <= 2))  );
      
      if(tab[place[0]][place[1]] != '-')
      {
        System.out.println("La position " + place[0] + " " + place[1] + " est occupee");
      }
    }
    while(tab[place[0]][place[1]] != '-');
    
    // met le joueur dans la matrice
    //
    tab[place[0]][place[1]] = joueur ;
    // pas de resultat
  }
}

