/**
   * Retourne les cases où l'on peut deplacer le personnage selectionné
   *
   * @param p personnage selectionné
   * @return les cases où l'on peut deplacer le personnage selectionné
   */
  public ArrayList<int[]> VoisinageCaseDeplacement(Personnage p) {
    boolean[] obstacle = {false, false, false, false, false, false, false, false};
    ArrayList<int[]> voisinage = new ArrayList<int[]>();
    int x = p.getPosition()[0];
    int y = p.getPosition()[1];
    int pm = p.getPointMouvement();
    int pmd = p.getPointMouvementDiagonale();

    for (int i = 1; i <= pm; i++) {
      if (x - i >= 0) {
        int[] positionCaseSelectionné = {x - i, y};
        if (!obstacle[0] && !this.getCase(positionCaseSelectionné).estVide()) obstacle[0] = true;
        else if (!obstacle[0] && this.getCase(positionCaseSelectionné).estVide())
          voisinage.add(positionCaseSelectionné);
        else if (p.getSaitVoler() && obstacle[0] && this.getCase(positionCaseSelectionné).estVide())
          voisinage.add(positionCaseSelectionné);
      }

      if (x + i < TaillePlateauX) {
        int[] positionCaseSelectionné = {x + i, y};
        if (!obstacle[1] && !this.getCase(positionCaseSelectionné).estVide()) obstacle[1] = true;
        else if (!obstacle[1] && this.getCase(positionCaseSelectionné).estVide())
          voisinage.add(positionCaseSelectionné);
        else if (p.getSaitVoler() && obstacle[1] && this.getCase(positionCaseSelectionné).estVide())
          voisinage.add(positionCaseSelectionné);
      }

      if (y - i >= 0) {
        int[] positionCaseSelectionné = {x, y - i};
        if (!obstacle[2] && !this.getCase(positionCaseSelectionné).estVide()) obstacle[2] = true;
        else if (!obstacle[2] && this.getCase(positionCaseSelectionné).estVide())
          voisinage.add(positionCaseSelectionné);
        else if (p.getSaitVoler() && obstacle[2] && this.getCase(positionCaseSelectionné).estVide())
          voisinage.add(positionCaseSelectionné);
      }

      if (y + i < TaillePlateauY) {
        int[] positionCaseSelectionné = {x, y + i};
        if (!obstacle[3] && !this.getCase(positionCaseSelectionné).estVide()) obstacle[3] = true;
        else if (!obstacle[3] && this.getCase(positionCaseSelectionné).estVide())
          voisinage.add(positionCaseSelectionné);
        else if (p.getSaitVoler() && obstacle[3] && this.getCase(positionCaseSelectionné).estVide())
          voisinage.add(positionCaseSelectionné);
      }
    }

    if (pmd != 0) {
      for (int i = 1; i <= pmd; i++) {

        int[] positionCaseSelectionné0 = {x - i, y - i};
        int[] positionCaseSelectionné1 = {x - i, y + i};
        int[] positionCaseSelectionné2 = {x + i, y + i};
        int[] positionCaseSelectionné3 = {x + i, y - i};
        if (x - i >= 0 && y - i >= 0) {
          if (!obstacle[4] && this.getCase(positionCaseSelectionné0).estVide())
            voisinage.add(positionCaseSelectionné0);
          else if (!obstacle[4] && !this.getCase(positionCaseSelectionné0).estVide())
            obstacle[4] = true;
          else if (obstacle[4]
              && p.getSaitVoler()
              && this.getCase(positionCaseSelectionné0).estVide())
            voisinage.add(positionCaseSelectionné0);
        }
        if (x - i >= 0 && y + i < TaillePlateauY) {
          if (!obstacle[5] && this.getCase(positionCaseSelectionné1).estVide())
            voisinage.add(positionCaseSelectionné1);
          else if (!obstacle[5] && !this.getCase(positionCaseSelectionné1).estVide())
            obstacle[5] = true;
          else if (obstacle[5]
              && p.getSaitVoler()
              && this.getCase(positionCaseSelectionné1).estVide())
            voisinage.add(positionCaseSelectionné1);
        }
        if (x + i < TaillePlateauX && y + i < TaillePlateauY) {
          if (!obstacle[6] && this.getCase(positionCaseSelectionné2).estVide())
            voisinage.add(positionCaseSelectionné2);
          else if (!obstacle[6] && !this.getCase(positionCaseSelectionné2).estVide())
            obstacle[6] = true;
          else if (obstacle[6]
              && p.getSaitVoler()
              && this.getCase(positionCaseSelectionné2).estVide())
            voisinage.add(positionCaseSelectionné2);
        }
        if (x + i < TaillePlateauX && y - i >= 0) {
          if (!obstacle[7] && this.getCase(positionCaseSelectionné3).estVide())
            voisinage.add(positionCaseSelectionné3);
          else if (!obstacle[7] && !this.getCase(positionCaseSelectionné3).estVide())
            obstacle[7] = true;
          else if (obstacle[7]
              && p.getSaitVoler()
              && this.getCase(positionCaseSelectionné3).estVide())
            voisinage.add(positionCaseSelectionné3);
        }
      }
    }
    return voisinage;
  }