|
|||||||||||||||||
|
|||||||||||||||||
I. Objectif du Projet :
L’objectif du projet est de réaliser avec Java SWING une interface utilisateur permettant de jouer au taquin.
|
|||||||||||||||||
|
|||||||||||||||||
II. Réalisation :
L’interface générale est la suivante :
II.2. Composition de l’interface
La fenêtre est un JFrame, elle contient des composants suivants : 1- En haut, la barre de menu, y compris les menus Jeux, Option, Sauvegarde et A Propos.
2- Plus bas, un panneau d’information qui affiche des messages d’information concernant le jeu. Il affiche différemment selon l’état du jeu.
Composition Java Swing : un JLabel dans un JPanel.
3- Au centre, c’est un panneau de forme et de taille quelconque (selon l’image choisie ou l’utilisateur préfère) qui contient des pièces de taquin :
Initialement, les pièces du taquin sont en bon ordre, et ‘bloquer’ – elles ne peuvent pas se déplacer ; la case vide est en bas a droite ; les compteurs sont à zéro.
Composition Java Swing : des MonCadres (JButtons) dans un JPanel. (La classe MonCadre hérite la classe JButton.)
4- Plus bas, ce sont des boutons de contrôle : Undo, Redo, Start, Pause et Mélanger avec chacun sa fonction suivante :
Composition Java Swing : des JButtons dans un JPanel
Undo – permet à l’utilisateur de revenir en arrière dans la partie en annulant un certain nombre des derniers mouvements. START – annonce le commencement du jeu : débloquer les pièces, débuter le compteur du temps, activer le compteur de mouvements, mélanger les pièces. Redo – permet à l’utilisateur de repartir en avant en effectuant a nouveau les mouvements annulés. Pause – met le jeu en pause : stop le compteur du temps et bloque les pièces. Mélanger – mélange des pièces aléatoirement.
5- Le plus bas de la fenêtre, il y a 2 compteurs :
Composition Java Swing : 2 JLabels et 2 JPanels dans un JPanel
Compteur du temps : compter le temps écoulé à partir du moment où l’utilisateur a appuyé sur le bouton ‘Start’ ; Lorsque l’utilisateur a besoin de choisir une option ou de sauvegarder, le compteur du temps s’arrête. Jusqu’à l’utilisateur a termine son choix. Si l’utilisateur clique sur ‘Pause’, le compteur s’arrête, et quand il clique sur ‘Reprend’, le compteur recommence à partir du ‘temps’ où il s’est arrêté. Compteur du mouvement : compter chaque mouvement effectué par l’utilisateur en cliquant sur les pièces du taquin. Chaque clique sur ‘Undo’ diminue 1 sur le compteur ; et chaque clique sur ‘Redo’ augmente 1.
6- Une fenêtre ‘ScoreFrame’ s’affiche au milieu de l’écran avec le score final quand on a gagne la partie :
Composition Java Swing : JLabels (les info) et JButton (‘OK’) dans une nouvelle JFrame (ScoreFrame)
7- Quand on clique sur le menu Option->Choisir une image, une nouvelle fenêtre s’affiche avec une palette de couleurs.
Composition Java Swing : JColorChooser et 2 JButtons (‘OK’ et ‘Cancel’) dans une JFrame (ColorChooser)
II.3.
D’autres vues de l’interface
|
|||||||||||||||||
|
|||||||||||||||||
III. Le programme
III.1. Difficultés rencontrées
Pour faire fonctionner le Undo et Redo, j’utilise le Vector comme une pile (pileA) pour Undo, une fois qu’on appuie sur un bouton (une case du taquin), la pile empile le bouton (MonCadre) sur lequel qu’on vient de cliqué: il insère à la position [0] de la pile; mais en fait, le MonCadre empilé est en suite devient le Trou, c’est pourquoi la case numéro 9 est toujours en tête de la pile, et sur l’écran, on voit que le MonCadre cliqué, est stocké dans la position [1].
J’utilise une 2eme pile (pileB) pour Redo. Selon le fonctionnement de Undo, quand on appuie sur le bouton <Undo> une fois, dans la pileA, il faut échanger la case à la position [1] avec celle à la position [0](le Trou), puis enlever celle à la position [0](qui n’est plus le Trou) et de la mettre dans la position[0] de pileB. Jusqu’à la pileA n’a qu’un seul élément, on n’a plus de case dans la pileA peut être échange.
C’est pour cela, j’ai ‘inventé’ le trouDebut, jusqu’à la pileA n’a qu’un seul élément, celui-la qui reste peut échanger avec le trouDebut.
Même principe quand on appuie sur le bouton <Redo>
Pour la sauvegarde et la recharge d’une partie, j’ai choisi d’utiliser XMLEncoder et XMLDecoder. Comme j’ai vu que le XMLEncoder ne peut qu’encoder les classes Objets qui existent déjà dans l’API Java, quand je veux encoder un MonCadre qui hérite un JButton, il n’arrive pas.
Donc je crée une fonction qui transforme des MonCadres dans la grille en une matrice d’entiers (numéros du MonCadre), et aussi une fonction transformant un Vector (Undo) en une table d'entiers.
- Les parties recharges fonctionnent avec le Undo, mais pas le Redo, et qu’ils ne fonctionnent pas en mode ‘Appliquer l’image’. - Le programme ne peut qu’ouvrir les images de taille plus petite que l’écran, sinon la fenêtre de l’interface va être énorme.
|
|||||||||||||||||
|
|||||||||||||||||
IV. IV. Conclusions
Fonctionnalités à ajouter : - Sauvegarder le recharger une partie en ‘mode Applique l’image’. - Auto réduire ou agrandir la taille d’une image choisie. - Réduire ou agrandir l’image dans la case quand l’utilisateur change la taille de la fenêtre.
|
|||||||||||||||||
Copyright © 2004 AppleSpace. All Rights Reserved |