Fifteen, ou Fifteen, est un excellent exemple d'un jeu de logique simple populaire dans le monde entier. Afin de résoudre le puzzle, vous devez organiser les carrés avec des nombres dans l'ordre, du plus petit au plus grand. Ce n'est pas facile, mais intéressant.
Dans le tutoriel d'aujourd'hui, nous montrons comment développer Fifteen en Java 8 avec Eclipse. Pour développer l'interface utilisateur, nous utiliserons l'API Swing.
Nous vous rappelons: pour tous les lecteurs de «Habr» - une remise de 10 000 roubles lors de l'inscription à un cours Skillbox en utilisant le code promo «Habr».
Skillbox recommande: Le cours éducatif en ligne "Profession Java-developer" .
Conception du jeu
À ce stade, vous devez définir les propriétés:
- Taille - la taille du terrain de jeu;
- nbTiles - le nombre de spots sur le terrain. nbTiles = taille * taille - 1;
- Tiles est une balise, qui est un tableau unidimensionnel d'entiers. Chaque balise recevra une valeur unique dans la plage [0, nbTiles]. Zéro indique un carré vide;
- blankPos - position du carré vide.
Logique du jeu
Vous devez définir une méthode de réinitialisation utilisée pour initialiser une nouvelle position de jeu. Nous définissons donc la valeur de chaque élément du tableau de balises. Eh bien, nous mettons ensuite blankPos à la dernière position du tableau.
Vous avez également besoin de la méthode shuffle pour mélanger un tableau de balises. Nous n'incluons pas de balise vide dans le processus de mélange pour la laisser dans sa position précédente.
Étant donné que seulement la moitié des positions de départ possibles du puzzle ont une solution, vous devez vérifier le résultat de mélange résultant pour vous assurer que la disposition actuelle est généralement résolue. Pour ce faire, nous définissons la méthode isSolvable.
Si une balise spécifique est précédée d'une balise avec une valeur plus élevée, cela est considéré comme une inversion. Lorsque la balise vide est en place, le nombre d'inversions doit être égal pour que le puzzle soit résoluble. Donc, nous comptons le nombre d'inversions et retournons vrai si le nombre est pair.
Ensuite, il est important de définir la méthode isSolved pour vérifier si notre alignement Game Of Fifteen est résolu. Tout d'abord, nous regardons où se trouve la balise vide. Si dans la position initiale, l'alignement actuel est nouveau, ce qui n'a pas été décidé auparavant. Ensuite, nous itérons sur les tuiles dans l'ordre inverse, et si la valeur de la balise diffère de l'index +1 correspondant, retourne false. Sinon, il est temps de revenir vrai à la fin de la méthode, car le puzzle est déjà résolu.
Une autre méthode à définir est newGame. Il est nécessaire de créer une nouvelle instance du jeu. Pour ce faire, nous réinitialisons le terrain de jeu, puis le mélangeons et continuons jusqu'à ce que la position de jeu soit résoluble.
Voici un exemple de code avec une logique d'étiquette de clé:
private void newGame() { do { reset();
Enfin, vous devez programmer le mouvement des taches dans le tableau. Ce code sera appelé ultérieurement via un rappel pour répondre au mouvement du curseur. Notre jeu prendra en charge plusieurs mouvements de tuiles simultanément. Ainsi, après avoir converti la position appuyée sur l'écran en une balise, nous obtenons la position de la balise vide et recherchons la direction du mouvement pour prendre en charge plusieurs de ses mouvements en même temps.
Voici un exemple de code:
Nous développons l'interface utilisateur sur Swing API
Il est temps de faire l'interface. Nous prenons d'abord la classe Jpanel. Ensuite, nous dessinons des taches sur le terrain - pour calculer les tailles de chacun, nous utiliserons les données spécifiées dans le paramètre constructeur du jeu:
gridSize = (dim - 2 * margin); tileSize = gridSize / size;
La marge est également un paramètre spécifié dans le constructeur du jeu.
Vous devez maintenant définir la méthode drawGrid pour dessiner la grille et les points sur l'écran. Nous analysons le tableau de balises et convertissons les coordonnées en coordonnées de l'interface utilisateur. Dessinez ensuite chaque étiquette avec le numéro correspondant au centre:
private void drawGrid(Graphics2D g) { for (int i = 0; i < tiles.length; i++) {
Enfin, nous redéfinissons la méthode paintComponent, qui est un dérivé de la classe JPane. Ensuite, nous utilisons la méthode drawGrid, puis nous utilisons la méthode drawStartMessage pour afficher un message nous invitant à cliquer pour démarrer le jeu:
private void drawStartMessage(Graphics2D g) { if (gameOver) { g.setFont(getFont().deriveFont(Font.BOLD, 18)); g.setColor(FOREGROUND_COLOR); String s = "Click to start new game"; g.drawString(s, (getWidth() - g.getFontMetrics().stringWidth(s)) / 2, getHeight() - margin); } } private void drawCenteredString(Graphics2D g, String s, int x, int y) {
Nous répondons aux actions des utilisateurs dans l'interface utilisateur
Pour que le jeu suive son cours, il est nécessaire de traiter les actions des utilisateurs dans l'interface utilisateur. Pour ce faire, ajoutez l'implémentation MouseListener sur le Jpanel et le code pour déplacer les spots déjà indiqués ci-dessus:
addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) {
Nous plaçons le code dans le constructeur de la classe GameOfFifteen. À la toute fin, nous appelons la méthode newGame pour démarrer une nouvelle partie.
Code de jeu complet
La dernière étape, avant de voir le jeu en action, consiste à collecter tous les éléments de code ensemble. Voici le résultat:
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities;
Enfin, jouez!
Il est temps de démarrer le jeu et de le vérifier en action. Le champ doit ressembler à ceci:

Essayer de résoudre le puzzle. Si tout s'est bien passé, nous obtenons ceci:

C’est tout. Vous attendiez-vous à plus? :)
Skillbox recommande: