Cet article décrit le code de jeu des échecs Gozi implémenté en Java. Il est partagé avec vous pour votre référence. Le code spécifique est le suivant
1. Objectifs pratiques
1. Maître la conception de l'interface Javagui
2. Maître la surveillance des événements de la souris (MouseListener, MouseMotionListener)
2. Contenu pratique
Concevez un programme Gochi simple qui peut réaliser le processus de jeu d'échecs Gochi. Comme indiqué dans la figure ci-dessous
1. Board d'échecs Gozi
Package Cn.edu.ouc.fiveChess; import java.awt.color; import java.awt.cursor; import java.awt.dimension; import java.awt.graphics; import java.awt.graphics2d; import java.awt.image; Importer java.awt.radialgradientpaint; Importer java.awt.RenderingHints; import java.awt.toolkit; Importer java.awt.event.mousevent; Importer java.awt.event.mouseListener; Importer java.awt.event.mousmotionListener; import java.awt.geom.ellipse2d; importer javax.swing. *; / ** * GOZIQI-CHESS-CHESS-BOARD CLASSE * / CLASSE PUBLIQUE ÉCHECTURE Étend Jpanel implémente MouseListener {public static final int margin = 30; // margin public static final int grid_span = 35; // grid espacement public static static int troncs = 15; // arme bossboard poitrinet static coles = 15; // numéro de cocher Point [(lignes + 1) * (Cols + 1)]; // initial Chaque élément de tableau est null booléen isBlack = true; // La valeur par défaut commence par les échecs noirs First Boolean Gameover = false; // est le jeu fini int chessCount; // le nombre actuel de pièces d'échecs int xindex, yindex; // l'index de la pièce de calche juste joué d'image Img Img; Ombres d'image; Color ColorTEMP; public ChessBoard () {// SetBackground (Color.Blue); // Définissez la couleur d'arrière-plan sur Orange IMG = Toolkit.getDefaultToolkit (). GetImage ("Board.jpg"); shadows = toolkit.getDefaultToolkit (). getImage ("shadows.jpg"); AddMouseListener (this); AddMousMotionListener (new MousMotionListener () {public void MouseDragged (MouseEvent E) {} public void MouseMoved (Mouseevent E) {int x1 = (e.getx () - margin + grid_span / 2) / grid_span; // convertir la position coordonnée de la souris cliquez sur l'indice Grid index intime de Grid y1 = (e.gety () - margin + grid_span / 2) / grid_span; setCursor (nouveau curseur (cursor.default_cursor)); } // dessiner public void paintComponent (graphiques g) {super.paintComponent (g); // dessiner des échecs int imgwidth = img.getWidth (this); int imgheight = img.getheight (this); // obtenez la largeur et la hauteur de l'image int fwidth = getWidth (); int fheight = getheight (); // obtenir la largeur et la hauteur de la fenêtre int x = (fwidth-imgwidth) / 2; int y = (fheight-iMgheight) / 2; G.DrawImage (img, x, y, null); pour (int i = 0; i <= lignes; i ++) {// dessiner la ligne horizontale g.drawline (margin, margin + i * grid_span, margin + cols * grid_span, margin + i * grid_span); } pour (int i = 0; i <= cols; i ++) {// dessiner la ligne verticale g.drawline (margin + i * grid_span, margin, margin + i * grid_span); } // dessiner des pièces d'échecs pour (int i = 0; i <ChessCount; i ++) {// Intersection de grille x, y coordonnée int xpos = ChessList [i] .getx () * grid_span + margin; int ypos = ChessList [i] .gety () * grid_span + margin; g.setColor (ChessList [i] .getColor ()); // Définir Color // G.FillOval (xpos-Point.Diamet / 2, ypos-Point.Diamet / 2, //point.Diamet, Point.Diamet); //g.Drawimage(Shadows, xpos-point.diamètre / 2, ypos-point.diamètre / 2, point.diamètre, point.diamètre, null); colortemp = ChessList [i] .getColor (); if (Colortemp == Color.Black) {RadialgradIentPaint Paint = New RadialgradIentPaint (xpos-point.Diamet / 2 + 25, ypos-point.diamètre / 2 + 10, 20, nouveau float [] {0f, 1f}, new Color [] {Color.White, Color.Black}); ((Graphics2d) g) .setpaint (peinture); ((Graphics2d) g) .setRenderingHint (renderinghints.key_antialiasing, renderingHint.value_antialias_on); ((Graphics2d) g) .setRenderingHint (RenderingHint.key_alpha_interpolation, renderingHint.value_alpha_interpolation_default); } else if (ColOremp == Color.White) {RadialgradIentPaint Paint = New RadialgradIentPaint (xpos-point.Diamet / 2 + 25, ypos-point.diamètre / 2 + 10, 70, nouveau flotteur [] {0f, 1f}, new Color [] {Color.white, Color.Black}); ((Graphics2d) g) .setpaint (peinture); ((Graphics2d) g) .setRenderingHint (renderinghints.key_antialiasing, renderingHint.value_antialias_on); ((Graphics2d) g) .setRenderingHint (RenderingHint.key_alpha_interpolation, renderingHint.value_alpha_interpolation_default); } Ellipse2d e = new ellipse2d.float (xpos-point.diamètre / 2, ypos-point.diamètre / 2, 34, 35); ((Graphics2d) g) .Fill (e); // la boîte rectangulaire rouge marquant la dernière pièce d'échecs if (i == ChessCount-1) {// Si c'est la dernière pièce d'échecs g.setColor (Color.red); G.Drawrect (xpos-point.diamètre / 2, ypos-point.diamètre / 2, 34, 35); }}} public void Mousreprim (MouseEvent e) {// La souris est appelée lorsqu'elle est appuyée sur le composant // Le jeu ne peut plus jouer si (gameover) return; String Colorname = IsBlack? "Black": "Échecs blanc"; // Convertissez la position de coordonnée du clic de souris dans l'index de la grille xindex = (e.getx () - margin + grid_span / 2) / grid_span; yindex = (e.gety () - margin + grid_span / 2) / grid_span; // Si vous tombez en dehors de l'échecteur, vous ne pouvez pas le dire si (xindex <0 || xindex> lignes || yindex <0 || yindex> cols) return; // S'il y a une pièce d'échecs dans la position x et y, vous ne pouvez pas le dire si (findchess (xindex, yindex)) retourne; // Si vous pouvez le faire lorsque cela est fait, vous ne pouvez pas le dire quand il est fait. Point (xindex, yindex, Isblack? Color.black: Color.white); ChessList [ChessCount ++] = ch; repent (); // informez le système pour redémarrer // si vous gagnez, donnez un message rapide et ne pouvez pas continuer à jouer aux échecs if (iswin ()) {String msg = string.format ("Félicitations,% s won!", Colorname); JOptionPane.showMessageDialog (this, msg); gameOver = true; } isBlack =! IsBlack; } // Méthode pour écraser MouseListener Public void MouseClicked (Mouseevent E) {// appelé lorsque le bouton de la souris clique sur le composant} public void muouseentered (Mouseevent e) {// appelé lorsque la souris entre dans le composant} public Void Mouseexite MouseLelent (Mouseevent e) {// appelé lorsque le bouton de la souris est libéré sur le composant} // appelé dans le réseau d'échecs pour voir s'il y a des pièces d'échecs avec l'index x et y qui existent une finition booléenne privée (int x, int y) {pour (point C: ChessList) {if (c! = null && c.getx () == x && c.gety () == y) retourne; } return false; } private boolean iswin () {int continuCount = 1; // Le nombre de pièces d'échecs continues // look horizontalement vers l'ouest pour (int x = xindex-1; x> = 0; x -) {couleur c = isBlack? Color.black: colore.white; if (getChess (x, yindex, c)! = null) {continuCount ++; } else se briser; } // Regardez horizontalement vers l'est pour (int x = xindex + 1; x <= cols; x ++) {Color c = isBlack? Color.black: colore.white; if (getChess (x, yindex, c)! = null) {continuCount ++; } else se briser; } if (continuCount> = 5) {return true; } else continueCount = 1; // Continue une autre recherche verticalement // Recherche vers le haut (int y = yindex-1; y> = 0; y -) {Color c = IsBlack? Color.Black: Color.white; if (getChess (xindex, y, c)! = null) {continuCount ++; } else se briser; } // Regardez vers le bas pour (int y = yindex + 1; y <= lignes; y ++) {Color c = IsBlack? Color.Black: Color.white; if (getChess (xindex, y, c)! = null) continuCount ++; d'autre se casse; } if (continuCount> = 5) return true; else continuCount = 1; // Continuer la recherche d'une autre situation: obliquement // Recherche nord-est pour (int x = xindex + 1, y = yindex-1; y> = 0 && x <= cols; x ++, y -) {Color c = IsBlack? Color.Black: Color.white; if (getChess (x, y, c)! = null) {continuCount ++; } else se briser; } // Southwest Recherche for (int x = xindex-1, y = yindex + 1; x> = 0 && y <= lignes; x -, y ++) {couleur c = isBlack? Color.black: color.white; if (getChess (x, y, c)! = null) {continuCount ++; } else se briser; } if (continuCount> = 5) return true; else continuCount = 1; // Continuer la recherche dans une autre situation: oblique // Recherche nord-ouest (int x = xindex-1, y = yindex-1; x> = 0 && y> = 0; x -, y -) {Color c = isBlack? Color.Black: Color.white; if (getChess (x, y, c)! = null) continuCount ++; d'autre se casse; } // Southeast Recherche pour (int x = xindex + 1, y = yindex + 1; x <= cols && y <= lignes; x ++, y ++) {couleur c = isBlack? Color.black: colowhite; if (getChess (x, y, c)! = null) continuCount ++; d'autre se casse; } if (continuCount> = 5) return true; else continuCount = 1; retourne false; } Private Point GetChess (int xindex, int yindex, couleur couleur) {pour (point p: ChessList) {if (p! = null && p.getx () == xindex && p.gety () == yindex && p.getColor () == Color) return p; } return null; } public void restartGame () {// Clear Chess Pièces pour (int i = 0; i <ChessList.length; i ++) {ChessList [i] = null; } // Restaurer la valeur de variable liée au jeu isBlack = true; gameover = false; // est le jeu terminant ChessCount = 0; // le nombre actuel de manèques et de pièces repeinait (); } // Répondre à Chess public void goback () {if (ChessCount == 0) return; ChessList [ChessCount-1] = null; ChessCount--; if (ChessCount> 0) {xIndex = ChessList [ChessCount-1] .getX (); yindex = ChessList [ChessCount-1] .gety (); } isBlack =! IsBlack; repeindre(); } // Dimension rectangle Dimension publique getPreferRedSize () {return new dimension (margin * 2 + grid_span * cols, margin * 2 + grid_span * lignes); }} 2. Pièces d'échecs
Package Cn.edu.ouc.fiveChess; import java.awt.color; / ** * Classe d'échecs * / Point de classe publique {private int x; // x index dans la carte d'échecs private int y; // y index dans la carte d'échecs couleur privative couleur; // Couleur publique statique final final diamètre = 30; // diamètre public Point (int x, int y, couleur couleur) {this.x = x; this.y = y; this.color = couleur; } public int getX () {// Obtenez l'index de x dans la carte d'échecs renvoie x; } public int gety () {return y; } Couleur publique getColor () {// Obtenez la couleur de la couleur de retour de la pièce d'échecs; }} 3. Classe de cadre principal de Gozi
Package Cn.edu.ouc.fiveChess; import java.awt.event. *; import java.awt. *; importer javax.swing. *; / * Goji principal Framework, programme * / classe publique startChessJFrame étend JFrame {Échecs d'échecs privés; barre d'outils JPanel privée; Le soldat Jbutton Startbutton, Backbutton, EXITBUTTON; Private JMenubar Menubar; JMENU SYSMENU privé; JMenuItem Privé StartMenuem, EXITMENUITEM, BALKMENUITEM; // redémarrer, quitter et regretter l'élément de menu public startChessJFrame () {Setttitle ("auto-alone goji"); // Définissez le titre Chessboard = new Chessboard (); Conteneur contenupane = getContentPane (); contentPane.add (échec); Échecteur.SetOpaque (true); // Créer et ajouter Menu menuBar = new JMenubar (); // initialiser la barre de menu sysmenu = new JMenu ("Système"); // Initialiser le menu // Initialiser l'élément de menu startMenuem = new JMenuItem ("redémarrer"); eXitMenuItem = new JMenUiTem ("exit"); BackMenuItem = new JMenUiTem ("Repentez"); // Ajouter trois éléments de menu au menu sysmenu.add (startMenuem); sysmenu.add (eXitMenuitem); sysmenu.add (backmenutem); // Initialisez la classe interne MyItemListener Lis = new MyItemListener (); // Enregistrez trois menus à l'auditeur de l'événement this.startMenuem.addactionListener (LIS); BackMenuItem.addactionListener (LIS); eXitMenuem.addactionListener (LIS); menuBar.add (sysmenu); // ajouter le menu système à la barre de menu setjMenubar (menuBar); // définir MenUbar à MenUbar Toolbar = new JPanel (); // Instancier le panneau d'outils // trois boutons initialize startbutton = new Jbutton ("start restart"); exitbutton = new JButton ("sortie"); Backbutton = new Jbutton ("Repentez"); // Disposez les boutons du panneau d'outils avec FlowLayout Toolbar.SetLayout (new FlowLayout (FlowLayout.Left)); // Ajouter trois boutons à la barre d'outils du panneau d'outils.add (startButton); Toolbar.Add (EXITBUTTON); Toolbar.Add (Backbutton); // Enregistrez les trois boutons pour écouter l'événement startButton.addactionListener (LIS); exitbutton.addactionListener (LIS); Backbutton.AddactionListener (LIS); Backbutton.AddactionListener (LIS); // Posez le panneau d'outils sur l'interface "Sud" c'est-à-dire Add (Barre d'outils, BorderLayout.South); Ajouter (échecboard); // Ajouter un objet de panneau au formulaire // Définissez l'événement de fermeture d'interface setDefaultCloseOperation (jframe.exit_on_close); // setSize (800 800); pack (); // Taille adaptative} classe privée MyItemListener implémente ActionListener {public void ActionPerformed (ActionEvent e) {objet obj = e.getsource (); // Obtenez la source de l'événement if (obj == startChessjframe.this.startMenuitem || obj == Class de démarrage) {//start//jfiveframe.Te System.out.println ("start"); Chessboard.RestartGame (); } else if (obj == eXitMenUitem || obj == exitbutton) System.exit (0); else if (obj == backmeMiUtem || obj == backbutton) {System.out.println ("repentir les échecs ..."); Chessboard.goback (); }}} public static void main (string [] args) {startChessjframe f = new startChessjframe (); // Créer le cadre principal f.setVisible (true); // montre la trame principale}} 3. Résumé
1. Conception et mise en œuvre des menus?
2. Comment dessiner des pièces d'échecs après que la souris clique sur l'échecteur? Comment dessiner une boîte rouge pour la pièce d'échecs que vous venez de configurer?
3. Qu'est-ce qu'une structure de données pour les scores d'échecs?
Ce qui précède concerne cet article, j'espère qu'il sera utile pour tout le monde d'apprendre la programmation Java.