1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
| import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;
public class DemoQVGM extends JPanel {
private final Random random = new Random();
private JLabel[] reponses;
private int etat;
private int bonneResponse;
public DemoQVGM() {
super(new GridLayout(0,2)); // je cherche pas à faire joli : je veux juste afficher
// je créé 4 réponses possibles
reponses = new JLabel[4];
for(int i=0; i<reponses.length; i++) {
reponses[i]=new JLabel("Reponse " + (i+1), JLabel.CENTER);
add(reponses[i]);
reponses[i].addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if ( etat==1 ) { // le joueur ne peut jouer que si l'état est 1
JLabel label = (JLabel)e.getSource(); // le label sur lequel on a cliqué
// on cherche quelle réponse correspond au label cliqué
for(int i=0; i<reponses.length; i++) {
if ( reponses[i]==label ) {
validationReponseJoueur(i);
}
}
}
}
}); // on met un écouteur pour tester la réponse de l'utilisateur
}
nouvelleQuestion(); // on affiche une nouvelle question (la première)
}
// on affiche une question
private void nouvelleQuestion() {
etat = 1; // on passe à l'état 1
bonneResponse = random.nextInt(reponses.length); // on tire au hasard la bonne réponse (c'est pour simplifier l'exemple)
// on "efface" les couleurs des réponses précédentes
for(JLabel label : reponses) {
label.setOpaque(true);
label.setForeground(null);
label.setBackground(null);
}
// pour pouvoir tricher et vérifier que ça marche ;)
reponses[bonneResponse].setForeground(Color.BLUE);
}
private void validationReponseJoueur(final int reponseJoueur) {
etat = 2; // on passe à l'état 2
// on passe la réponse en orange
reponses[reponseJoueur].setBackground(Color.ORANGE);
switch ( JOptionPane.showConfirmDialog(this, "C'est votre dernier mot ?", "Démo...", JOptionPane.YES_NO_OPTION )) {
case JOptionPane.YES_OPTION:
// le joueur a confirmé
// on va donc passer à l'état 3, mais avant on va attendre 3 secondes, pour faire durer le suspens
Timer timer = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// ici on fait le code qu'on veut faire (qui s'exécute 3 secondes après le timer.start() un peu plus loin
reponseCorrecteOuPas(reponseJoueur);
}
});
timer.setRepeats(false); // on veut faire ça qu'une seule fois
timer.start(); // on lance le compte à rebours de 3 secondes
break;
case JOptionPane.NO_OPTION:
// le joueur à changer d'avis
etat = 1;
reponses[reponseJoueur].setBackground(null);
break;
}
}
protected void reponseCorrecteOuPas(int reponseJoueur) {
etat = 3;
// la réponse est-elle correcte ?
if ( reponseJoueur==bonneResponse ) {
// oui
reponses[reponseJoueur].setBackground(Color.GREEN);
}
else {
// non
reponses[reponseJoueur].setBackground(Color.RED);
reponses[bonneResponse].setBackground(Color.GREEN);
}
// maintenant, on va lancer ce qui va faire continuer (la question suivante) par un timer (5 seconds)
Timer timer = new Timer(5000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// ici on fait le code qu'on veut faire (qui s'exécute 5 secondes après le timer.start() un peu plus loin
nouvelleQuestion();
}
});
timer.setRepeats(false); // on veut faire ça qu'une seule fois
timer.start(); // on lance le compte à rebours de 5 secondes
}
public static void main(String[] args) {
// je prépare une JFrame pour y afficher mon jeu, mes réponses, tout ça
// peu importe, ça ne concerne pas vraiment la question et c'est du standard
JFrame frame = new JFrame("Démo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new DemoQVGM());
frame.setSize(400, 600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
} |
Partager