Exercice Java corrigé placement sans recouvrement – tableaux et modularisation

import java.util.Scanner;
class Recouvrement {
    private static Scanner scanner = new Scanner(System.in);

  public static void main(String[] args) {
    boolean [][] grille = new boolean [10][10];
    initGrille(grille);
    ajouterElements(grille);
    System.out.println("\nMerci d'avoir joué!");
  }

  /**
   * Essaie de remplir la grille avec un objet de longueur donnée
   * dans une direction donnée en partant des coordonnées 
   * (targetRow, targetCol). 
   * @param grille
   * @param targetRow
   * @param targetCol
   * @param direction
   * @param longueur
   * @return true si le placement est réussi et false sinon
   */
  static boolean remplitGrille(boolean [][] grille, int targetRow, 
                   int targetCol, char direction, 
                   int longueur) {

    int deltaRow = 0, deltaCol = 0;
    int dim = grille.length;

    // On calcule ici la direction dans laquelle aller depuis 
    // les coordonnées indiquées par l'utilisateur.
    // Ex: pour aller au nord, il faut monter d'une 
    // ligne en restant sur la
    // même colonne.
    switch (direction) {
    case 'N':
      deltaRow = -1;
      deltaCol = 0;
      break;
    case 'S':
      deltaRow = 1;
      deltaCol = 0;
      break;
    case 'E':
      deltaRow = 0;
      deltaCol = 1;
      break;
    case 'O':
      deltaRow = 0;
      deltaCol = -1;
      break;
    }

    // On se place sur la case de départ
    int tempRow = targetRow;
    int tempCol = targetCol;

    // Est-il possible de placer l'élément ?
    boolean possible = true;

    // Avant de modifier la grille il faut vérifier s'il est 
    // possible de mettre tout l'objet
    for (int i = 0; (i < longueur && possible); i++) {
      if ((tempRow < 0) || (tempRow >= dim)) {
        possible = false;
      }
      else if ((tempCol < 0) || (tempCol >= dim)) {
    possible = false;
      } else  if (grille [tempRow][tempCol]) {
        possible = false;
      }

      // On se déplace sur la case suivante
      tempRow += deltaRow;
      tempCol += deltaCol;
    }

    // Le placement est possible, et on peut donc mettre
    // à jour la grille
    if (possible) {
      tempRow = targetRow;
      tempCol = targetCol;

      for (int i = 0; i < longueur; i++) {
        grille [tempRow][tempCol] = true;
        tempRow += deltaRow;
        tempCol += deltaCol;
      }
    }

    return possible;
  }

  /**
   * Initialise toutes les cases de la grille à false
   * @param grille
   */
  static void initGrille(boolean[][] grille) {
    int dim = grille.length;
    for (int row = 0; row < dim; row++) {
      for (int col = 0; col < dim; col++) {
        grille[row][col] = false;
      }
    }
  }

  /**
   * Permet à l'utilisateur de demander le placement d'objets
   * sur la grille.
   * @param grille
   */
  static void ajouterElements(boolean[][] grille) {
    int col, row;
    char dir;
    int length;
    System.out.print("Entrez la taille  " +
             "(négative pour arrêter le programme): ");
    length = scanner.nextInt();
    // L'utilisateur signifie qu'il veut arrêter 
    // d'introduire des objets en spécifiant une 
    //longueur négative
    while (length >= 0) {
      do {
        System.out.print("Entrez coord. x : ");
        col = scanner.nextInt();
      } while ((col < 0) || (col >= grille.length));

      do {
        System.out.print("Entrez coord. y : ");
        row = scanner.nextInt();
      } while ((row < 0) ||(row >= grille.length));

      do {
        System.out.print("Entrez direction (N,S,E,O) : ");
        dir = scanner.next().charAt(0);
      } while ((dir != 'N') && (dir != 'S') && (dir != 'E') && (dir != 'O'));

      System.out.print("Placement en (" + col + "," + row + ") direction " 
               + dir + " longueur " + length + " -> ");

      if (remplitGrille(grille, col, row, dir, length)) {
        System.out.println("Succès");
        afficheGrille(grille);
      } else {
        System.out.println("Echec");
      }
      System.out.println(); 
      System.out.print("Entrez la taille " +
               "(négative pour arrêter le programme): ");
      length = scanner.nextInt();

    }
  }

  /**
   * Affichage de la grille
   * @param grille
   */
  static void afficheGrille(boolean[][] grille) {
    int dim = grille.length;
    for (int row = 0; row < dim; row++) {
      for (int col = 0; col < dim; col++) {
        if (grille[row][col])
          System.out.print("#");
        else
          System.out.print(".");
      }
      System.out.println();
    }
  }
}

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *