corrige
Transcription
corrige
L2 année 2015-2016 L2 - POO et langage JAVA Les interfaces graphiques, IHM, Programmation événementielle CORRIGE Exercice 1 : Le jeu du Pendu Consigne: Le jeu consiste pour le joueur A à trouver un mot en devinant les lettres qui le composent. Initialement le joueur B lui indique la longueur du mot à trouver. Ensuite pour chaque lettre proposée par le joueur A le programme lui indique les différentes places de celle-ci dans le mot. Si la lettre n'appartient pas au mot cela est considéré comme une erreur et le coup est comptabilisé. Si le nombre d'erreurs dépasse 10 le joueur A est pendu... Si le joueur A a trouve le mot en moins de 10 essais le joueur A a gagné la partie Le programme demande la saisie d'un mot qu'on appellera "secret". Le programme crée (et affiche) alors un mot "masque" c'est à dire une chaîne de caractère qui ne contient que des "-" et autant qu'il y a de lettres dans le mot secret. Exemple, si le mot secret est "toto", le mot masque est "----". 1 Le programme demande la saisie d'une lettre... 2 va vérifier si cette lettre est présente dans le mot secret 3 modifie en conséquence le mot masque, 4 affiche le mot masqué. Exemple (suite), si l'utilisateur saisie la lettre "t" le mot masque doit devenir "t-t-". Le programme regarde si toutes les lettres ont été devinées, dans ce cas il arrête le jeux par victoire et affiche le mot secret. Le programme regarde le nombre de tentatives ratées et arrête le jeu s'il atteint 10. Le programme reprend à l'étape de saisie d'une lettre, si le nombre de tentatives ratées est inférieur à 10. Ecrire l’algorithme correspondant en pseudo-code puis le transcrire en JAVA Dans un premier temps toutes ces étapes peuvent être d'abord toutes réalisées dans le main. Dans un deuxième temps découpez le code en des fonctions statiques de la classe principale, pour mieux organiser le code. 1/8 Corrigé Pendu Question 1 package pendu; import java.util.*; public static void main(String[] args) { int nbcoups=0; Scanner in = new Scanner(System.in); System.out.println("Hello Jeu du Pendu "); System.out.print("Donnez le mot secret ?"); String secret = in.nextLine(); // saisir au clavier le mot secret String masque=""; for(int i=0;i<secret.length();i++){ // initialiser le mot masqué à ------- masque=masque+"-"; } char tabMasque[]=masque.toCharArray(); // convertir la chaine mot masqué en tableau de char System.out.println("VOICI LE MOT MASQUE INIT while ((nbcoups<=10)&&(!masque.equals(secret))){ : "+masque); // tant que le nb de coups <=10 et mot secret!=mot masqué System.out.print("Donnez une lettre : "); Scanner sc = new Scanner(System.in); String str = sc.nextLine(); // saisir une lettre au clavier sous forme de chaine char lettre = str.charAt(0); // convertir la chaine en un seul caractère nbcoups++; for(int i=0;i<secret.length();i++) { if (lettre==secret.charAt(i)) { // chercher la lettre lue dans le mot secret tabMasque[i]= lettre; // si la lettre est trouvée la mettre dans le mot masqué } } masque=String.valueOf(tabMasque); // convertir le tableau masqué en chaine System.out.println("voici le mot masqué " +masque+" :") ; // afficher le mot masqué } // fin du while if (nbcoups>=10){ System.out.println("PENDU le mot secret est "+secret ) ; } else { System.out.println("Bravo jeu gagné en "+nbcoups+" coups" ) ; } } } 2/8 Corrigé Pendu Question 2 import java.util.*; /** Le programme demande la saisie d'un mot qu'on appellera "secret". Le programme crée (et affiche) alors un mot "masque" c'est à dire "----". 1 Le programme demande la saisie d'une lettre... 2 va vérifier si cette lettre est présente dans le mot secret 3 modifie en conséquence le mot masque, 4 affiche le mot masqué. Le programme regarde si toutes les lettres ont été devinées, dans ce cas il arrête le jeux par victoire et affiche le mot secret. Le programme regarde le nombre de tentatives ratées et arrête le jeu s'il atteint 10. Le programme reprend à l'étape de saisie d'une lettre, si le nombre de tentatives ratées est inférieur à 10. **/ public class Pendu2 { static String masque=""; static String secret=""; static char tabMasque[]; static int nbcoups=0; static char lettre; public static void Demarage() { Scanner in = new Scanner(System.in); System.out.println("Hello Jeu du Pendu Version 2"); System.out.print("Donnez le mot secret ?"); secret = in.nextLine(); // saisir au clavier le mot secret for(int i=0;i<secret.length();i++){//initialiser le mot masqué à masque=masque+"-"; } tabMasque=masque.toCharArray(); //convertir la chaine mot masqué //en tableau de char } public static void AfficheResultat() { if (nbcoups>=10){ System.out.println("PENDU le mot secret est "+secret ) ; } else { System.out.println("Bravo jeu gagné en "+nbcoups+" } } public static void CorrigeMotMasque() { for(int i=0;i<secret.length();i++) ------- coups" ) ; { if (lettre==secret.charAt(i)) {// chercher la lettre lue dans le mot secret tabMasque[i]= lettre; //si la lettre trouvée la mettre dans mot masqué } } masque=String.valueOf(tabMasque); // convertir le tableau masqué en chaine System.out.println("voici le mot masqué " +masque+" :") ; // afficher le mot masqué } 3/8 static void DemanderLettre(){ System.out.print("Donnez une lettre : "); Scanner sc = new Scanner(System.in); String str = sc.nextLine(); // saisir une lettre = str.charAt(0); lettre au clavier sous forme de chaine // convertir la chaine en un seul caractère } public static void main(String[] args) { Demarage() ; while ((nbcoups<=10)&&(!masque.equals(secret))){ // tant que le nb de coups <=10 et mot secret!=mot masqué nbcoups++; DemanderLettre(); CorrigeMotMasque() ; } // fin du while AfficheResultat(); } } 4/8 Exercice 2 : Les interfaces graphiques A - Comprendre la notion de programmation événementielle en réalisant l’exemple du timer vu en cours. Ici c'est l'objet t de type Timer qui générera un évènement toutes les secondes. Après avoir démarré le timer, et quelque soit la suite du programme, il affichera la date toutes les secondes. import java.awt.event.*; import java.util.*; import javax.swing.Timer; public class Timer { static public void main(String args[]) { TimerTask listener = new TimerTask(); Timer t = new Timer(1000,listener); t.start(); // t generera un événement toutes les 1000 milisec while(true); // boucle d'attente des événements } } class TimerTask implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println(new Date()); } } Résultat : Sat Mar 08 12:17:13 CET 2014 Sat Mar 08 12:17:14 CET 2014 Sat Mar 08 12:17:15 CET 2014 B- a) Créer une fenêtre appelée « Coucou» import java.awt.*; import java.util.*; import javax.swing.*; public class Coucou { JFrame fenetre; public Cocou() { // constructeur fenetre = new JFrame("Coucou"); // conteneur fenetre.setLayout(new BorderLayout()); // placement fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// fermeture fenêtre } public static void main(String[] args) { new Coucou().fenetre.show(); } } b) puis y insérer un bouton appelé « Hello » 5/8 import java.awt.*; import java.util.*; import javax.swing.*; public class BoutonHello { JFrame fenetre; Button bout; public BoutonHello() { // constructeur fenetre = new JFrame("Coucou"); // conteneur fenetre.setLayout(new BorderLayout()); // placement fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // fermeture fenêtre bout = new Button("Hello "); // composant fenetre.add(bout); // inclusion du bouton dans la fenêtre } public static void main(String[] args) { new BoutonHello().fenetre.show(); } } C- Associer une action au bouton « Hello » qui affiche le message «Hello, je suis un bouton » à la suite du clic sur le bouton « Hello» import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Coucou implements ActionListener { JFrame fenetre; Button bout; // attributs public Coucou() { // constructeur fenetre = new JFrame("Coucou"); // conteneur fenetre.setLayout(new BorderLayout()); // placement fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); bout = new Button("Hello"); // composant fenetre.add(bout); // inclusion... bout.addActionListener(this); // gestion évènement } public void actionPerformed(ActionEvent e) { // évènement System.out.println("Hello, je suis un bouton "); } static public void main(String[] args) { // test new Coucou().fenetre.show(); } } shell> java Coucou "Hello, je suis un bouton " "Hello, je suis un bouton " "Hello, je suis un bouton " D - Créer une deuxième fenêtre appelée « Deux boutons» et y mettre 2 boutons « Rouge » et « Blanc » 6/8 import java.awt.*; import javax.swing.*; public class DeuxBoutons { public JFrame fenetre; // attributs : une fenêtre et son contenu protected Button rouge, blanc; public DeuxBoutons() { // un constructeur fenetre = new JFrame("Deux boutons..."); fenetre.setLayout(new FlowLayout()); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // fermeture fenêtre rouge = new Button("Rouge"); blanc = new Button("Blanc"); fenetre .add(rouge); fenetre .add(blanc); } public static void main(String[] args) { new DeuxBoutons().fenetre.show(); } } E- Associer une action au bouton qui change la couleur des 2 boutons à la suite du clic sur l’un des deux boutons comme suit : Fenêtre initiale Après avoir pressé Blanc Après avoir pressé Rouge import java.awt.*; import java.awt.event.*; import javax.swing.*; public class DeuxBoutons implements ActionListener { public JFrame fenetre; // attributs : une fenêtre et son contenu protected Button rouge, blanc; public DeuxBoutons() { // un constructeur fenetre = new JFrame("Deux boutons..."); fenetre.setLayout(new FlowLayout()); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // fermeture fenêtre rouge = new Button("Rouge"); blanc = new Button("Blanc"); fenetre .add(rouge); fenetre .add(blanc); rouge.addActionListener(this); blanc.addActionListener(this); } public void actionPerformed(ActionEvent e) { // évènement Object src = e.getSource(); if(src==rouge) { rouge.setBackground(Color.RED); blanc.setBackground(Color.RED); } else { rouge.setBackground(Color.WHITE); blanc.setBackground(Color.WHITE); } } public static void main(String[] args) { new DeuxBoutons().fenetre.show(); } } 7/8 F- Créer une troisième fenêtre appelée « Voici un Label » et y mettre un message « je suis un label AWT ! » import java.awt.*; import javax.swing.*; public class VoiciLabel { public static void main(String[] args) { JFrame fenetre = new JFrame("Voici un Label"); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // fermeture fenêtre Label l = new Label("je suis un Label AWT !", Label.CENTER); fenetre.add(l); fenetre.show(); // ou bien fenetre.setVisible(true); } } G - Créer une quatrième fenêtre appelée « Voici un TextField » et y mettre une zone de texte initialisée à « zone de texte» import java.awt.*; import javax.swing.*; public class VoiciZoneTexte { public static void main(String[] args) { JFrame f = new JFrame("voici un TextField"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // fermeture fenêtre TextField t = new TextField("zone de texte", 30); f.add(t); f.show(); // ou bien fenetre.setVisible(true); } } 8/8