Sommaire 

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 :

 

 

 II.1 L’Interface Générale

 

L’interface générale est la suivante :

Taquin 3 x 3 avec l’image

 

 

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.


 

Menu Jeux

Composition Java Swing :

JMenuItems dans JMenu (Jeux).


Menu Option
Composition Java Swing :
JMenu(Taille), JMenuItems, et JCheckBoxMenuItem (Appliquer l’image) dans JMenu (Option),
JRadioButtonMenuItems (t x t) dans JMenu (Taille).


Menu Sauvegarde
Composition Java Swing :
JMenuItems dans JMenu (Sauvegarde).


Menu A Propos
Composition Java Swing :
JMenuItems dans JMenu (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.


Taquin image 3 x 3


Taquin image 3 x 3 


Taquin image 10 x 10


Taquin chiffré 10 x 10


Taquin chiffré 6 x 6

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
 


Taquin avec image en état initial

 


Taquin avec image après le mélange

 


Taquin chiffré en état terminé 

 


Taquin chiffré après le mélange

 

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.

 

 

 III.2.Limites & bugs

 

- 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.

 

 

 


      

主页 | 上一层 | Sujet du projet | Rapport du projet

Copyright © 2004 AppleSpace. All Rights Reserved