Apnée de Programmation numéro 1

Introduction au langage JAVA

1 - Ressources

2 - Exercice 1 : utilisation d'une classe de la bibliothèque standard

Dans cette partie, nous allons manipuler une classe de la bibliothèque standard nommée Scanner. Cette classe permet de lire des données de différent types sur un flux de caractères accessible en lecture.

  1. Découverte
    Commencez par saisir le programme suivant :
    import java.util.Scanner;
    
    class Essai_Scanner {
        public static void main(String [] args) {
            Scanner my_scanner;
            String ligne;
    
            my_scanner = new Scanner(System.in);
            System.out.println("Saisissez une ligne");
            ligne = my_scanner.nextLine();
            System.out.println("Vous avez saisi la ligne : " + ligne);
        }
    }
    
    compilez et exécutez ce code, vous pouvez constater qu'il vous demande simplement de saisir une ligne, puis affiche cette ligne.
  2. Compréhension
    Pour comprendre comment ce programme a été écrit, nous allons consulter la documentation de la classe Scanner, cherchez la dans la documentation sur l'API de java référencée ci-dessus. Nous pouvons y trouver: Vous pouvez aussi constater que les chaînes de caractères se concatènent à l'aide de l'opérateur +. A l'aide de ce même opérateur il est aussi possible de concaténer un entier ou tout autre type d'objet à une chaîne (l'objet à concaténer sera alors convertit en sa représentation textuelle).
  3. Entrée invalide
    exécutez le programme précédent en fermant l'entrée standard (Ctrl-D) avant d'avoir saisi le moindre caractère. Vous pouvez constater que le programme s'arrête brutalement suite à la levée d'une exception. Si vous consultez le détail de la documentation de la méthode nextLine vous pouvez constater qu'elle est susceptible de lever une exception de type NoSuchElementException (déclaré dans java.util). Modifiez votre programme pour qu'il affiche le message "Aucune ligne saisie" lorsque la méthode nextLine lève une exception.
  4. Lire un entier
    modifiez votre programme pour lire puis afficher un entier à la place d'une chaine. Votre programme devra redemander la saisie de l'entier tant que la saisie de l'utilisateur ne correspond pas à un entier valide. Pour cela, après avoir étudié la documentation de la fonction de lecture d'un entier, vous pourrez utiliser une boucle while autour d'une variable de type boolean (qui peut prendre l'une des valeurs true ou false) et vous attraperez l'exception levée par la lecture de l'entier pour détecter une lecture invalide. Attention : InputMismatchException est une sous classe de NoSuchElementException, il faut donc l'attraper en premier.
  5. Lire une structure de données
    récupérez la classe Brique qui modélise une brique dans un jeu de casse briques (et qui s'accompagne de l'interface ComposantGraphique). Vous pouvez constater qu'une brique contient des informations sur sa resistance et sa couleur (deux entiers) ainsi que sur sa position (deux nombres à virgule flottante). Utilisez un Scanner pour lire ces informations au clavier, créer une brique correspondante et l'afficher. Vous pouvez constater que la méthode System.out.println sait afficher une brique ! Cela vient du fait que cette méthode sait afficher tout objet qui définit la méthode toString qui est alors utilisée pour fabriquer la représentation textuelle de l'objet à afficher.

3 - Lire un niveau

Dans cette partie, nous allons lire la description textuelle des objets constituant un niveau dans un jeu de casse briques, à savoir briques, bonus et leur position dans le niveau. Pour décrire un niveau, nous avons choisi de structurer les données selon le format Yaml qui a l'avantage d'être très lisible. Dans ce format, les données sont organisées hiérarchiquement (de manière analogue à l'organisation dans d'autres formats comme Json ou xml) et c'est l'indentation qui délimite les différents niveaux de la hiérarchie. Nous n'utiliserons que les tables d'association clé:valeur, qui sont une des structures de données supportées par Yaml ainsi que le caractère | qui permet de marquer le début d'un bloc de texte brut utilisé comme valeur (en conservant les retours charriots).

Une section est constituée d'un nom et d'une table d'association (qui joue ici le rôle de valeur). Un fichier décrivant un niveau est composé des deux sections suivantes, présentes dans cet ordre :

Le fichier Niveau-1.txt contient une description dans ce format, tout comme le fichier Niveau-2.txt.

Votre travail est d'écrire une classe ChargeurNiveaux contenant les deux méthodes suivantes :

Pour analyser la description textuelle du niveau, vous pourrez vous servir des méthodes de la classe String comme charAt, split, trim, substring, equals ou encore de la méthode Integer.parseInt. Vous disposez également du programme Apnee1 pour tester votre solution. Ce programme doit, pour les deux fichiers de niveau donnés, afficher :
Niveau : Niveau 1, composé de 3 couches
Couche 0 :
Bonus en (16.0, 3.0), nature Elargit
Bonus en (16.0, 4.0), nature Retrecit
Bonus en (16.0, 5.0), nature Elargit
Bonus en (16.0, 6.0), nature Retrecit
Bonus en (16.0, 7.0), nature Elargit
Bonus en (16.0, 8.0), nature Retrecit
Bonus en (4.0, 9.0), nature Multiballes
Bonus en (8.0, 9.0), nature Laser
Bonus en (12.0, 9.0), nature Multiballes
Bonus en (16.0, 9.0), nature Elargit
Bonus en (20.0, 9.0), nature Multiballes
Bonus en (24.0, 9.0), nature Laser
Bonus en (28.0, 9.0), nature Multiballes
Le niveau a une largeur de 34 et une hauteur de 26
Couche 1 :
Bord Horizontal en haut de hauteur 0.0
Bord Vertical à gauche de position 0.0
Bord Vertical à droite de position 34.0
Brique en (4.0, 3.0), resistance 1, couleur 0
Brique en (6.0, 3.0), resistance 1, couleur 0
Brique en (8.0, 3.0), resistance 1, couleur 0
Brique en (10.0, 3.0), resistance 1, couleur 0
Brique en (12.0, 3.0), resistance 1, couleur 0
Brique en (14.0, 3.0), resistance 1, couleur 0
Brique en (16.0, 3.0), resistance 1, couleur 0
Brique en (18.0, 3.0), resistance 1, couleur 0
Brique en (20.0, 3.0), resistance 1, couleur 0
Brique en (22.0, 3.0), resistance 1, couleur 0
Brique en (24.0, 3.0), resistance 1, couleur 0
Brique en (26.0, 3.0), resistance 1, couleur 0
Brique en (28.0, 3.0), resistance 1, couleur 0
Brique en (2.0, 4.0), resistance 1, couleur 0
Brique en (4.0, 4.0), resistance 1, couleur 0
Brique en (6.0, 4.0), resistance 1, couleur 0
Brique en (8.0, 4.0), resistance 1, couleur 0
Brique en (10.0, 4.0), resistance 1, couleur 0
Brique en (12.0, 4.0), resistance 1, couleur 0
Brique en (14.0, 4.0), resistance 1, couleur 0
Brique en (16.0, 4.0), resistance 1, couleur 0
Brique en (18.0, 4.0), resistance 1, couleur 0
Brique en (20.0, 4.0), resistance 1, couleur 0
Brique en (22.0, 4.0), resistance 1, couleur 0
Brique en (24.0, 4.0), resistance 1, couleur 0
Brique en (26.0, 4.0), resistance 1, couleur 0
Brique en (28.0, 4.0), resistance 1, couleur 0
Brique en (30.0, 4.0), resistance 1, couleur 0
Brique en (2.0, 5.0), resistance 1, couleur 0
Brique en (4.0, 5.0), resistance 1, couleur 0
Brique en (6.0, 5.0), resistance 1, couleur 0
Brique en (8.0, 5.0), resistance 2, couleur 1
Brique en (10.0, 5.0), resistance 2, couleur 1
Brique en (12.0, 5.0), resistance 2, couleur 1
Brique en (14.0, 5.0), resistance 2, couleur 1
Brique en (16.0, 5.0), resistance 1, couleur 0
Brique en (18.0, 5.0), resistance 2, couleur 1
Brique en (20.0, 5.0), resistance 2, couleur 1
Brique en (22.0, 5.0), resistance 2, couleur 1
Brique en (24.0, 5.0), resistance 2, couleur 1
Brique en (26.0, 5.0), resistance 1, couleur 0
Brique en (28.0, 5.0), resistance 1, couleur 0
Brique en (30.0, 5.0), resistance 1, couleur 0
Brique en (2.0, 6.0), resistance 1, couleur 0
Brique en (4.0, 6.0), resistance 1, couleur 0
Brique en (6.0, 6.0), resistance 1, couleur 0
Brique en (8.0, 6.0), resistance 1, couleur 0
Brique en (14.0, 6.0), resistance 1, couleur 0
Brique en (16.0, 6.0), resistance 1, couleur 0
Brique en (18.0, 6.0), resistance 1, couleur 0
Brique en (24.0, 6.0), resistance 1, couleur 0
Brique en (26.0, 6.0), resistance 1, couleur 0
Brique en (28.0, 6.0), resistance 1, couleur 0
Brique en (30.0, 6.0), resistance 1, couleur 0
Brique en (2.0, 7.0), resistance 1, couleur 0
Brique en (4.0, 7.0), resistance 1, couleur 0
Brique en (6.0, 7.0), resistance 1, couleur 0
Brique en (14.0, 7.0), resistance 1, couleur 0
Brique en (16.0, 7.0), resistance 1, couleur 0
Brique en (18.0, 7.0), resistance 1, couleur 0
Brique en (26.0, 7.0), resistance 1, couleur 0
Brique en (28.0, 7.0), resistance 1, couleur 0
Brique en (30.0, 7.0), resistance 1, couleur 0
Brique en (4.0, 8.0), resistance 1, couleur 0
Brique en (6.0, 8.0), resistance 1, couleur 0
Brique en (8.0, 8.0), resistance 1, couleur 0
Brique en (10.0, 8.0), resistance 1, couleur 0
Brique en (12.0, 8.0), resistance 1, couleur 0
Brique en (14.0, 8.0), resistance 1, couleur 0
Brique en (16.0, 8.0), resistance 1, couleur 0
Brique en (18.0, 8.0), resistance 1, couleur 0
Brique en (20.0, 8.0), resistance 1, couleur 0
Brique en (22.0, 8.0), resistance 1, couleur 0
Brique en (24.0, 8.0), resistance 1, couleur 0
Brique en (26.0, 8.0), resistance 1, couleur 0
Brique en (28.0, 8.0), resistance 1, couleur 0
Brique en (4.0, 9.0), resistance 1, couleur 0
Brique en (8.0, 9.0), resistance 1, couleur 0
Brique en (12.0, 9.0), resistance 1, couleur 0
Brique en (16.0, 9.0), resistance 1, couleur 0
Brique en (20.0, 9.0), resistance 1, couleur 0
Brique en (24.0, 9.0), resistance 1, couleur 0
Brique en (28.0, 9.0), resistance 1, couleur 0
Le niveau a une largeur de 34 et une hauteur de 26
Les couleurs utilisées dans ce niveau sont :
0 - rgba(0,100%,0,1.0)
1 - rgba(100%,0,0,1.0)
2 - rgba(70%,70%,70%,1.0)
Prêt à jouer, en attente de balle !
Niveau : Niveau 2, composé de 3 couches
Couche 0 :
Bonus en (10.0, 5.0), nature Elargit
Bonus en (12.0, 5.0), nature Elargit
Bonus en (26.0, 5.0), nature Elargit
Bonus en (28.0, 5.0), nature Elargit
Bonus en (14.0, 6.0), nature Laser
Bonus en (16.0, 6.0), nature Laser
Bonus en (18.0, 6.0), nature Laser
Bonus en (20.0, 6.0), nature Laser
Bonus en (22.0, 6.0), nature Laser
Bonus en (24.0, 6.0), nature Laser
Bonus en (10.0, 7.0), nature Elargit
Bonus en (12.0, 7.0), nature Elargit
Bonus en (26.0, 7.0), nature Elargit
Bonus en (28.0, 7.0), nature Elargit
Le niveau a une largeur de 40 et une hauteur de 31
Couche 1 :
Bord Horizontal en haut de hauteur 0.0
Bord Vertical à gauche de position 0.0
Bord Vertical à droite de position 40.0
Brique en (2.0, 3.0), resistance 1, couleur 0
Brique en (4.0, 3.0), resistance 1, couleur 0
Brique en (34.0, 3.0), resistance 1, couleur 0
Brique en (36.0, 3.0), resistance 1, couleur 0
Brique en (6.0, 4.0), resistance 1, couleur 0
Brique en (8.0, 4.0), resistance 1, couleur 0
Brique en (30.0, 4.0), resistance 1, couleur 0
Brique en (32.0, 4.0), resistance 1, couleur 0
Brique en (10.0, 5.0), resistance 1, couleur 0
Brique en (12.0, 5.0), resistance 1, couleur 0
Brique en (26.0, 5.0), resistance 1, couleur 0
Brique en (28.0, 5.0), resistance 1, couleur 0
Brique en (14.0, 6.0), resistance 2, couleur 1
Brique en (16.0, 6.0), resistance 2, couleur 1
Brique en (18.0, 6.0), resistance 2, couleur 1
Brique en (20.0, 6.0), resistance 2, couleur 1
Brique en (22.0, 6.0), resistance 2, couleur 1
Brique en (24.0, 6.0), resistance 2, couleur 1
Brique en (10.0, 7.0), resistance 1, couleur 0
Brique en (12.0, 7.0), resistance 1, couleur 0
Brique en (26.0, 7.0), resistance 1, couleur 0
Brique en (28.0, 7.0), resistance 1, couleur 0
Brique en (6.0, 8.0), resistance 1, couleur 0
Brique en (8.0, 8.0), resistance 1, couleur 0
Brique en (30.0, 8.0), resistance 1, couleur 0
Brique en (32.0, 8.0), resistance 1, couleur 0
Brique en (2.0, 9.0), resistance 1, couleur 0
Brique en (4.0, 9.0), resistance 1, couleur 0
Brique en (34.0, 9.0), resistance 1, couleur 0
Brique en (36.0, 9.0), resistance 1, couleur 0
Le niveau a une largeur de 40 et une hauteur de 31
Les couleurs utilisées dans ce niveau sont :
0 - rgba(0,100%,0,1.0)
1 - rgba(100%,0,0,1.0)
2 - rgba(70%,70%,70%,1.0)
Prêt à jouer, en attente de balle !