/**
   * Launch game method is both designed to launch a game, to hand out territories as well as taking
   * care of the game itself and the win scenario
   *
   * @throws InterruptedException
   */
  public void initGame() throws InterruptedException {

    // init of the game by distributing the regions to the players
    // using a LinkedList and random number
    List<Region> listOfRegionsLeft = new LinkedList<Region>();
    int idRegion;

    for (Region regionToDistribute : this.gamingTray.gamingTrayRegions)
      listOfRegionsLeft.add(regionToDistribute);

    while (!(listOfRegionsLeft.isEmpty())) {
      for (Player playerToDistribute : this.getPlayerList()) {
        idRegion = Dice.throwDice(listOfRegionsLeft.size());
        try {
          listOfRegionsLeft.get(idRegion).conquest(playerToDistribute);
          listOfRegionsLeft.remove(idRegion);
        } catch (Exception e) {
          break;
        }
      }
    }

    Window.MAIN_GAMING_WINDOW.getContentPane().repaint();

    // once the Regions have been handed out, we just have to launch the
    // game
    launchGame();
  }
  /**
   * launchGame isn't less than the main turn method which will launch every player turn aswell as
   * taking care of who will be the winner and such
   *
   * @throws InterruptedException
   */
  public void launchGame() throws InterruptedException {

    // first reinforcement and capital choice turn for every players
    for (Player firstTurnOfPlayer : this.playerList) {
      this.setCurrentPlayer(firstTurnOfPlayer);
      firstTurnOfPlayer.reinforcementStep((int) (100 / this.playerList.size()));
      firstTurnOfPlayer.capitalAttribution();
      Window.MAIN_GAMING_WINDOW.getContentPane().repaint();
    }

    // all game turns in there
    while (
    /*this.playersStillAlive() >= 2*/ true) {
      for (Player currentPlayer : this.getPlayerList()) {
        this.setCurrentPlayer(currentPlayer);
        this.print("Tour de : " + currentPlayer.name);
        Window.MAIN_GAMING_WINDOW.getContentPane().repaint();
        currentPlayer.reinforcementStep(currentPlayer.unitReinforcements());
        Window.MAIN_GAMING_WINDOW.getContentPane().repaint();
        currentPlayer.attackStep();
        Window.MAIN_GAMING_WINDOW.getContentPane().repaint();
        currentPlayer.forceMouvementStep();
      }

      // check up of the players to see if one of them is dead (no
      // regions left)
      // for (Player isPlayerDead : this.getPlayerList()) {
      //	if (isPlayerDead.playerRegions().length == 0) isPlayerDead.setDead();
      // }

      // check up of the capitals to see if a player possess them all :
      // if it is the case, the player have won the game
      // for (Player playerToFetchCapitals : this.getPlayerList()) {
      //	if (playerToFetchCapitals.victoryByCapitals()) for (Player playerToSetDead :
      // this.getPlayerList())
      //		playerToSetDead.setDead();
      //	playerToFetchCapitals.setAlive();
      // }
    }

    // print of the name of the player
    // for (Player isPlayerTheWinner : this.getPlayerList())
    //	if (isPlayerTheWinner.isAlive()) this.print("Partie remportée par " +
    // isPlayerTheWinner.name);

  }
  /**
   * Static main that will launch the game after creating the players and the colors : it is also
   * meant to recreate a lost game in case the Serialisation methods find anything on disk
   * unfortunately, it is not working yet
   *
   * @param args
   * @throws FileNotFoundException
   * @throws IOException
   * @throws ClassNotFoundException
   * @throws InterruptedException
   */
  public static void main(String[] args)
      throws FileNotFoundException, IOException, ClassNotFoundException, InterruptedException {

    Window.colorList.add(new Color(150, 110, 80));
    Window.colorList.add(new Color(240, 190, 110));
    Window.colorList.add(new Color(100, 140, 220));
    Window.colorList.add(new Color(40, 50, 110));
    Window.colorList.add(new Color(110, 150, 130));

    // this.serialization(); to be fixed
    Window.MAIN_GAMING_WINDOW.print(
        "Merci d'entrer le nombre de joueurs puis de renseigner leurs pseudos !");
    int numberOfPlayers = 10;

    // creation of all the players using the WIndow JTextInput
    while (numberOfPlayers > Player.MAX_PLAYERS)
      numberOfPlayers = Window.MAIN_GAMING_WINDOW.selectNumber();
    Window.MAIN_GAMING_WINDOW.print("Entrez les pseudo des joueurs à créer :");
    for (int playerArrayCounter = 0; playerArrayCounter < numberOfPlayers; playerArrayCounter++)
      Window.MAIN_GAMING_WINDOW.playerList.add(Window.MAIN_GAMING_WINDOW.createPlayer());

    // once all the players have been set up, we launch the game
    Window.MAIN_GAMING_WINDOW.initGame();
  }
 @Override
 public void actionPerformed(ActionEvent e) {
   Window.MAIN_GAMING_WINDOW.setEnteredText(Window.MAIN_GAMING_WINDOW.getInput().getText());
   Window.MAIN_GAMING_WINDOW.getInput().selectAll();
 }
 /** @param numberToPrint will be printed on the JFrame console */
 public void print(int numberToPrint) {
   Window.MAIN_GAMING_WINDOW.setText(
       Integer.toString(numberToPrint) + "\n" + Window.MAIN_GAMING_WINDOW.getText());
 }
 /** @param textToPrint will be printed on the JFrame console */
 public void print(String textToPrint) {
   Window.MAIN_GAMING_WINDOW.setText(textToPrint + "\n" + Window.MAIN_GAMING_WINDOW.getText());
 }