Il s'agit de la dernière conception de cours pour les cours Java. Étant donné que Java est un débutant, j'ai fait référence à certains blogs d'experts techniques en le faisant. Je voudrais exprimer ma gratitude ici.
Publiez ici pour communiquer et apprendre.
Si vous avez besoin de fichiers de projet complets, de documentation et de fichiers JAR Runnable, téléchargez l'adresse: cliquez pour ouvrir le lien
Russianblocksgame.java
Package RussiblockSgame; import java.awt. *; import java.awt.event. *; import javax.swing.border.border; Importer javax.swing.border.etchedborder; / ** * La classe de jeu principale, héritée de la classe JFrame, est responsable du contrôle mondial du jeu. Comprend: 1. Un objet d'instance de la classe GameCanvas Canvas, * 2. Un objet qui contient l'instance active du bloc actif (RussiBlock); 3. Un objet qui contient l'instance du panneau de commande actuel (ControlPanel); * / classe publique RussiBlockSgame étend JFrame {private static final long SerialVersionUID = -7332245439279674749l; / ** * Combien de points sont comptés pour chaque ligne remplie * / public final static int per_line_score = 100; / ** * Combien de points peuvent être mis à niveau après accumulation * / public final static int per_level_score = per_line_score * 20; / ** * La série maximale est le niveau 10 * / public final statique int max_level = 10; / ** * La série par défaut est 2 * / public final static int default_level = 2; Toile de GameCanvas privée; Block Ersblock privé; Playing booléen privé = false; ControlPanel privé Ctrlpanel; // Initialiser la barre de menu Private JMenubar Bar = new JMenubar (); privé jmenu mgame = new JMenu ("Game"), mControl = new JMenu ("Control"), minfo = new JMenu ("Help"); privé jMenuItem minewgame = new JMenuItem ("nouveau jeu"), minetblockcolor = new JMenuItem ("Set Block Color ..."), MisetbackColor = new JMenUitem ("Set Background Color ..."), Miturnharder = New JMenuitem ("Réduction du jeu"), Miturneasier = New JMe new JMenuItem ("exit"), miplay = new JMenUitem ("start"), mipause = new JMenuItem ("Pause"), Miresume = new JMenuetem ("reprendre"), Mistop = new JMenUitem ("terminer le jeu"), mirule = new JMenuitem ("Game Règles"), miauuthor = new JMeNuitem (à propos de ce jeu de jeux "), MiAut / ** * Créer et définir le menu de la fenêtre * / private void CreatMenu () {bar.add (mgame); Bar.Add (mControl); bar.add (minfo); mgame.add (minewgame); mgame.addseparator (); // ajouter la ligne horizontale divisée mgame.add (minetblockcolor); mgame.add (minetblockcolor); mgame.addseParator (); // ajouter la ligne horizontale divisée mgame.add (mirurnhader); mgame.add (mirurneasier); mgame.addseparator (); // ajouter la ligne horizontale divisée mgame.add (Miexit); mControl.add (miplay); miplay.setEnabled (true); mControl.add (mipause); mipause.setEnabled (false); mControl.add (Miresume); miresume.setEnabled (false); mControl.add (erreté); Mistop.SetEnabled (false); minfo.add (mirule); Minfo.Add (MiAuthor); setjMenubar (bar); minewgame.addactionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent e) {stopGame (); reset (); SetLevel (default_level);}}); // Définit le bloc Color minetblockcolor.addactionListener (new ActionListener () {@Override public void Actionperformed (ActionEvent e) {colore newfrontcolor = jcolorchooser.showdialog (russiblocksgame.this, if (newFrontcolor! = Null) canvas.setBlockColor (newFrontColor);}}}); // Définit la couleur d'arrière-plan miretbackcolor.addactionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent e) {color newbackcolor = jcolorchooser.showDialog (russiblocksgame.this, if (newbackcolor! = Null) canvas.setbackgroundColor (newbackColor);}}}); // Définissez la fonction de la barre de menu "À propos" et une boîte de confirmation apparaît. Miathor.AddactionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent e) {joptionPane.showMessageDialog (null, "Software Engineering (4) class / n3115005372 / nyang yujie / n © tout le droit d'interpréter est propriétaire par yang yujie" " }); // Règles de jeu Description mirule.addactionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent e) {joptionpane.showMessageAding (null, «plaques de différentes formes composées de petits carrés Les barres horizontales disparaissent immédiatement, faisant de la place pour les plaques nouvelles / n tombantes. // Augmentez la difficulté miTurnharder.AddactionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent e) {int curLevel = getLevel (); if (! Playing && curlevel <max_level) {SetLevel (Curlevel + 1);}}); // Réduisez la difficulté miTurAnSier.AdDactionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent e) {int curLevel = getlevel (); if (! Play && curlevel> 1) {SetLevel (Curlevel - 1);}}}); // Exit Button Action Response Miexit.AdDactionListener (new ActionListener () {@Override public void ActionPerformEd (ActionEvent e) {System.Exit (0);}}); }! // Définissez le titre SetSize (500, 600); // définir la taille de la fenêtre setLocationRelativeto (null); // Définit le centre de fenêtre CreateMenu (); Conteneur conteneur = getContentPane (); // Créer une barre de menu conteneur.SetLayout (new BorderLayout (6, 0)); // Définissez le gestionnaire de mise en page de la fenêtre canvas = new GameCanvas (20, 15); // Créer un nouveau gibier canvas ctrlpanel = new ControlPanel (this); // Créer un nouveau panneau de configuration contener.add (canvas, borderlayout.center); // ajouter Canvas Container.Add (CtrlPanel, BorderLayout.East); // Ajouter un panneau de configuration sur les événements de fenêtre à droite // Enregistrer. Lorsque le bouton Fermer est cliqué, le jeu se termine et le système sort. addWindowListener (new WindowAdapter () {@Override public void windowClosing (windowEvent we) {stopgame (); system.exit (0);}}); // ajustez automatiquement la taille du carré en fonction de la taille de la fenêtre addComponentListener (new ComponentAdapter () {@Override public void ComponentResized (ComponentEvent CE) {canvas.adjust ();}}); setVisible (true); Canvas.Adjust (); } / ** * Réinitialiser le jeu * / public void reset () {// réinitialiser le canevas et réinitialiser le panneau de commande ctrlpanel.setplayButtonenable (true); ctrlpanel.setPauseButtonenable (false); ctrlpanel.setPauseButtonLabel (true); ctrlpanel.setStopButtonenable (false); ctrlpanel.setTurnLeveldownButtonenable (true); ctrlpanel.setturnleveLupButtonenable (true); miplay.setEnabled (true); mipause.setEnabled (false); miresume.setEnabled (false); Mistop.SetEnabled (false); ctrlpanel.reset (); canvas.reset (); } / ** * Déterminez si le jeu est toujours en cours * * @return Boolean, true - est toujours en cours d'exécution, False-Has arrêté * / public boolean isPlaying () {return play; } / ** * Obtenez le bloc actuellement actif * * @return ersblock, la référence du bloc actuellement actif * / public ersblock getCurlock () {return block; } / ** * Obtenez le canevas actuel * * @return GameCanvas, la référence du canevas actuel * / public GameCanvas getCanvas () {return canvas; } / ** * Démarrer le jeu * / public void playGame () {play (); ctrlpanel.setplayButtonenable (false); ctrlpanel.setPauseButtonenable (true); ctrlpanel.setPauseButtonLabel (true); ctrlpanel.setStopButtonenable (true); ctrlpanel.setTurnLeveldownButtonenable (false); ctrlpanel.setturnleveLupButtonenable (false); Mistop.SetEnabled (true); miTurnHarder.SetEnabled (false); MiTUnSIAR.SetEnabled (false); ctrlpanel.requestFocus (); // Définit Focus sur le panneau de commande} / ** * Le jeu Pause * / public void Pausegame () {if (Block! = NULL) {Block.pauseMove (); } ctrlpanel.setplayButtonenable (false); ctrlpanel.setPauseButtonLabel (false); ctrlpanel.setStopButtonenable (true); miplay.setEnabled (false); mipause.setEnabled (false); miresume.setEnabled (true); Mistop.SetEnabled (true); } / ** * Laissez le jeu en pause continuer * / public void remegame () {if (block! = Null) {block.ResumeMove (); } ctrlpanel.setplayButtonenable (false); ctrlpanel.setPauseButtonenable (true); ctrlpanel.setPauseButtonLabel (true); mipause.setEnabled (true); miresume.setEnabled (false); ctrlpanel.requestFocus (); } / ** * L'utilisateur arrête le jeu * / public void stopgame () {player = false; if (block! = null) {block.stopMove (); } ctrlpanel.setplayButtonenable (true); ctrlpanel.setPauseButtonenable (false); ctrlpanel.setPauseButtonLabel (true); ctrlpanel.setStopButtonenable (false); ctrlpanel.setTurnLeveldownButtonenable (true); ctrlpanel.setturnleveLupButtonenable (true); miplay.setEnabled (true); mipause.setEnabled (false); miresume.setEnabled (false); Mistop.SetEnabled (false); miTurnHarder.SetEnabled (true); miTurAnSier.SetEnabled (true); reset (); // réinitialiser le canevas et le panneau de commande} / ** * Obtenez la difficulté définie par le joueur * * @return int, jeu difficulté 1-max_level * / public int getlevel () {return ctrlpanel.getLevel (); } / ** * Utilisateur Définit la difficulté du jeu * * @param Level int, jeu difficulté 1-max_level * / public void SetLevel (int Level) {if (niveau <11 && niveau> 0) {ctrlpanel.setLevel (niveau); }} / ** * Obtenez des points de jeu * * @return int, Points * / public int getScore () {if (canvas! = Null) {return canvas.getScore (); } return 0; } / ** * Obtenez des points de jeu depuis la dernière mise à niveau. Après la mise à niveau, ce point sera effacé * * @return int, ints * / public int getScoreForLeveLupDate () {if (canvas! = Null) {return canvas.getScoreForLeveLupDate (); } return 0; } / ** * Lorsque l'intégrale s'accumule à une certaine valeur, mettez à niveau une fois * * @return boolean, true-update Success, false-update fail * / public boolean niveaupdate () {int curLevel = getlevel (); if (curLevel <max_level) {SetLevel (curLevel + 1); canvas.resetsCoreForLeveLupdate (); Retour Vrai; } return false; } / ** * jeu start * / private void play () {reset (); jouer = true; Thread thread = new thread (new Game ()); // démarrer le jeu thread thread.start (); } / ** * Rapport que le jeu est terminé * / private void reportGameOver () {new GameoverDialog (this, "tetris", "le jeu se termine, votre score est" + canvas.getScore ()); } / ** * Un tour du processus de jeu, implémentant l'interface Runnable. Une ronde de jeu est une grosse boucle. Dans cette boucle, toutes les 100 millisecondes, vérifiez si le bloc actuel du jeu a atteint la fin. Sinon, * continuera d'attendre. S'il arrive à la fin, cela dépend de la question de savoir s'il y a une ligne entièrement remplie. S'il y en a, supprimez-le et ajoutez des points au lecteur, et générez un nouveau bloc actuel et laissez-le tomber automatiquement. * Lorsqu'un nouveau bloc est généré, vérifiez d'abord si la ligne en haut de la toile a été occupée. Si c'est le cas, vous pouvez juger le jeu. * / Le jeu de classe privée implémente Runnable {@Override public void run () {int col = (int) (math.random () * (canvas.getCols () - 3)); // génère au hasard la position du bloc int style = ersblock.styles [(int) (math.random () * 7)] [int) (math.random () *); d'une forme while (play) {if (block! = null) {// Le bloc est vide if (block.isalive ()) {try {thread.currentThread (); Thread.Sleep (500); } catch (InterruptedException ie) {ie.printStackTrace (); } continuer; }} checkfulLline (); // Vérifiez s'il existe des lignes entièrement remplies si (isgameOver ()) {reportGameOver (); miplay.setEnabled (true); mipause.setEnabled (false); miresume.setEnabled (false); Mistop.SetEnabled (false); ctrlpanel.setplayButtonenable (true); ctrlpanel.setPauseButtonLabel (false); ctrlpanel.setStopButtonenable (false); retour; } block = new ersblock (style, -1, col, getlevel (), canvas); block.start (); col = (int) (math.random () * (canvas.getCols () - 3)); style = ersblock.styles [(int) (math.random () * 7)] [(int) (math.random () * 4)]; ctrlpanel.settipstyle (style); }} // Vérifiez s'il y a des lignes entièrement remplies dans la toile. S'il y en a un, supprimez-le public void CheckfulLline () {pour (int i = 0; i <canvas.getrows (); i ++) {int row = -1; Boolean fulllineColorBox = true; pour (int j = 0; j <canvas.getCols (); j ++) {if (! canvas.getbox (i, j) .iscolorbox ()) {fulllineColorBox = false; casser; }} if (fulllineColorBox) {row = i--; Canvas.RemoVeline (ligne); }}} // juger si le jeu s'est terminé en fonction de la fin de la fin de la ligne du haut // @ @ return booléen, le jeu est terminé, False-the Game n'est pas sur privé booléen isgameover () {for (int i = 0; i <canvas.getCols (); i ++) {ersbox box = canvas.getBox (0, i); if (box.iscolorbox ()) {return true; }} return false; }} / ** * Définissez la boîte de dialogue Gameover. * / @SuppressWarnings ("Serial") La classe privée GameoverDialog étend JDialog implémente ActionListener {private Jbutton AgainButton, EXITBUTTON; Border frontière privée = nouveau gravé de gravure (gravé de gravure.Réré, couleur.white, nouvelle couleur (148, 145, 140)); public GameoverDialog (jFrame Parent, String Title, String Message) {super (parent, title, true); if (parent! = null) {setSize (240, 120); this.setLocationRelativeto (parent); JPanel MessagePanel = new JPanel (); MessagePanel.add (new JLabel (message)); MessagePanel.SetBorder (frontière); Conteneur conteneur = this.getContentPane (); contener.setLayout (nouveau gridLayout (2, 0, 0, 10)); contener.add (messagePanel); Jpanel chosepanel = new JPanel (); choosePanel.SetLayout (nouveau gridLayout (0, 2, 4, 0)); conteneur.add (choosepanel); Encore une fois BUTTON = New Jbutton ("Joue un autre jeu"); exitbutton = new Jbutton ("sortie de sortie"); choosepanel.add (new JPanel (). Add (AgainButton)); choosepanel.add (new JPanel (). Add (exitbutton)); choosepanel.setborder (frontière); } Againbutton.addactionListener (this); exitbutton.addactionListener (this); this.setVisible (true); } @Override public void ActionPerformed (ActionEvent e) {if (e.getSource () == AgainButton) {this.setVisible (false); réinitialiser(); } else if (e.getsource () == exitButton) {stopgame (); System.exit (0); }}}}GameCanvas.java
Package RussiblockSgame; import java.awt.color; import java.awt.graphics; import javax.swing.jpanel; Importer javax.swing.border.etchedborder; / ** * Classe Canvas, avec <nombre de lignes> * <nombre de colonnes> Instances de classe carrée. Hérité de la classe JPanel. La classe Ersblock Thread modifie dynamiquement la couleur de la grille de la classe Canvas. La classe Canvas utilise * pour vérifier la couleur de la grille pour refléter le mouvement du bloc Ersblock. * / classe publique GameCanvas étend jpanel {private static final long SerialVersionUID = 6732901391026089276l; Color privé BackColor = Color.DarkGray, FrontColor = Color.White; lignes int privés, cols, score = 0, scoreForLeveLupDate = 0; Boîtes ersbox privées [] []; INT privé BoxWidth, BoxHeight; / ** * Constructeur de la classe Canvas * * @param lignes int, le nombre de lignes du canevas * @param cols int, le nombre de colonnes et colonnes du canevas détermine le nombre de squares le canevas a * / public GameCanvas (Int Rows, int cols) {this.Rows = lignes; this.cols = cols; boxes = new ersbox [lignes] [cols]; for (int i = 0; i <boxes.length; i ++) {for (int j = 0; j <boxes [i] .length; j ++) {boxes [i] [j] = new ersbox (false); }} setborder (new gravEdBorder (EtchedBorder.Realied, Color.white, nouvelle couleur (148, 145, 140));} / ** * Constructeur de la classe Canvas * * @param Rows * @param Cols * @param backcolor * @param frontcolor * / public gamcolvas (int rows, int cols, colori this (lignes, cols); GetBackgroundColor () {return backcolor;} / ** * Définissez la couleur du bloc de jeu * * @param frontcolor Couleur, Couleur de bloc * / public SetBlockor (Color FrontColor) * Obtenez le nombre de lignes du carré dans le canevas * * @return * / public int getrows () {return ligne Score; RussiBlocksgame.per_level_score;} / ** * Obtenez la référence carrée d'une certaine ligne et colonne * * @return Row int, la ligne où le carré doit être référencé * @param col Int, la ligne où le carré doit être référencé * @return ersbox, la référence du carré dans la ligne Colm - 1 || Col <0 || g.setColor (frontcolor); BoxHeight, true);}}} / ** * ajustez automatiquement la taille du carré en fonction de la taille de la fenêtre * / public void ajustement () {BoxWidth = GetSize. Ersboxesgame class * / public synchronisé void reposainline (int row) {for (int i = row; i> 0; i--) {for (int j = 0; j <cols; j ++) {boxes [i] [j] = (ersbox) baces [i - 1] [j] .clone (); + = RussiBlocksgame.per_level_score; = 0; J <Boxes [i] .length; J ++) {Boxes [i] [J] .SetColor (false);ControlPanel.java
Package RussiblockSgame; import java.awt.borderLayout; import java.awt.color; import java.awt.graphics; import java.awt.gridLayout; import java.awt.event.actionEvent; import java.awt.event.actionListener; Importer java.awt.event.componentAdapter; Importer java.awt.event.componentEvent; Importer java.awt.event.keyAdapter; Importer java.awt.event.KeyEvent; import java.text.dateformat; import java.text.simpledateFormat; Importer java.util.date; import javax.swing.jbutton; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.jtextfield; import javax.swing.timer; import javax.swing.border.border; Importer javax.swing.border.etchedborder; / ** * Classe de panneau de commande, hérité de JPanel. Les boutons de fenêtre, de niveau, de score et de contrôle sont placés dessus. * / class ControlPanel étend jpanel {private static final long SerialVersionUID = 3900659640646175724l; privé jTextfield tflevel = new JTextfield ("" + russiblocksgame.default_level), tfscore = new JTextField ("0"), tftime = new JTextField (""); privé jbutton btplay = new Jbutton ("start"), btpause = new Jbutton ("pause"), btStop = new Jbutton ("End the Game"), btturnlevelup = new Jbutton ("augmenter la difficulté"), btTurnleveldown = new Jbutton ("Réduire la difficulté"); privé jpanel pltip = new JPanel (new BorderLayout ()); Tippanel privé pltipblock = new Tippanel (); Jpanel privé Plinfo = new JPanel (nouveau gridLayout (4, 1)); JPANEL PRIVÉ PLBUTTON = NOUVEAU JPANEL (NOUVEAU GRIDLAYOUT (6, 1)); temporisateur privé; Border frontière privée = nouveau gravé de gravure (gravé de gravure.Réré, couleur.white, nouvelle couleur (148, 145, 140)); / ** * Constructeur de la classe du panneau de commande * * @param jeu ersblocksgame, une référence d'instance de la classe ersblocksgame est pratique pour contrôler directement le comportement de la classe Ersblocksgame. * / public ControlPanel (final russiblocksgame jeu) {setLayout (new GridLayout (3, 1, 0, 2)); pltip.add (new JLabel ("Next Square"), BorderLayout.north); // Ajouter le composant pltip.add (pltipblock); pltip.setborder (frontière); plinfo.add (new JLabel ("coefficient de difficulté")); plinfo.add (tflevel); plinfo.add (new JLabel ("score")); plinfo.add (tfscore); plinfo.setborder (frontière); plbutton.add (btplay); btPlay.setEnabled (true); plbutton.add (btpause); btpause.setEnabled (false); plbutton.add (btStop); btStop.setEnabled (false); plbutton.add (btturnlevelup); plbutton.add (btTurnleveldown); plbutton.add (tftime); plbutton.setborder (frontière); tflevel.setEdIT (false); tfscore.setEdIT (false); tftime.setEdIT (false); ajouter (pltip); ajouter (plinfo); ajouter (plbutton); addKeyListener (new KeyAdapter () {@Override public void keyPressed (keyEvent ke) {if (! game.isplaying ()) {return;} ersblock block = game.getcurblock (); switch (ke.getkeycode ()) {case keyevent.vk_down: blockwownown (); break; case keyevent.vk_left: Block.Moveleft (); btplay.addactionListener (new ActionListener () {// Démarrer le jeu @Override public void ActionPerformed (ActionEvent ae) {game.playgame ();}}); btpause.addactionListener (new ActionListener () {// pause le jeu @Override public void ActionPerformed (ActionEvent ae) {if (btpause.getText (). equals ("pause")) {jeu.pausegame ();} else {jeu.resumEgame ();}}}); btStop.AddActionListener (new ActionListener () {// Stop the Game @Override public void ActionPerformed (ActionEvent ae) {game.stopgame ();}}); btTurnlevelup.addactionListener (new ActionListener () {// augmenter la difficulté @Override public void ActionPerformed (ActionEvent ae) {try {int niveau = Integer.ParseInt (tflevel.getText ()); if (niveau <russiblocksgame.max_level) {tflevel.SeTText ("" "+ (niveau); (NumberFormatexception e) {} requestFocus ();}}); btTurnLeveldown.AddactionListener (new ActionListener () {// réduire la difficulté du jeu @Override public void ActionPerformed (ActionEvent ae) {try {int Level = Integer.Parevent (tflevel.getText ()); if (niveau> 1) {tflevel requestFocus ();}}); addComponentListener (new ComponentAdapter () {@Override public void ComponentResized (ComponentEvent ce) {pltipblock.adjust ();}}); Timer = new Timer (1000, new ActionListener () {@Override public void ActionPerformed (ActionEvent AE) {dateFormat format = new SympledateFormat ("heure: hh: mm: ss"); // le système obtient la date de temps (new Date (); tftime.SeTText (format.Format (date)); GamedScora ()); int ScoreForLeveLupdate = // Jugez si le score actuel peut être mis à niveau vers Game.getScoreForLeveLupDate (); timer.start (); } / ** * Définissez le style de la fenêtre de pré-affichage * * @param style int, correspondant aux 28 valeurs dans les styles de la classe ersblock * / public void settripStyle (int style) {pltipblock.setStyle (style); } / ** * Obtenez le niveau de jeu défini par l'utilisateur. * * @return int, Niveau de difficulté, 1-esblocksgame.max_level * / public int getlevel () {int niveau = 0; try {NIVEAL = Integer.ParseInt (tflevel.getText ()); } catch (NumberFormatexception e) {} NIVEAU DE RETOUR; } / ** * Laissez les utilisateurs modifier le niveau de difficulté du jeu. * * @param nevel modifié du jeu de difficulté de jeu * / public void SetLevel (int Level) {if (niveau> 0 && niveau <11) {tflevel.setText ("" + niveau); }} / ** * Définissez l'état du bouton "Démarrer". * / public void setPlayButtonenable (boolean activer) {btPlay.setEnabled (activer); } public void setPauseButtonenable (boolean activer) {btpause.setEnabled (activer); } public void setPauseButtonLabel (booléen pause) {btpause.setText (pause? "Pause": "Continuer"); } public void SetStopButtonenable (Boolean activer) {btStop.SetEnabled (activer); } public void setTurnLeveLupButtonenable (boolean activer) {btturnlevelup.setEnabled (activer); } public void setTurnLeveldownButtonenable (boolean activer) {btTurnLeveldown.SetEnabled (activer); } / ** * Réinitialiser le panneau de commande * / public void reset () {tfscore.setText ("0"); pltipblock.setStyle (0); } / ** * Recalculer la taille de la petite boîte dans les boîtes [] [] dans Tippanel * / public void ajustement () {pltipblock.adjust (); } / ** * Détails d'implémentation Classe de la fenêtre de pré-affichage * / Classe publique Tippanel étend JPanel {// Tippanel est utilisé pour afficher la forme du bloc suivant pour apparaître Long SerialVersionUID final statique privé = 516053671436997616L; Color privé BackColor = Color.DarkGray, FrontColor = Color.White; ersbox privé [] [] boxes = new ersbox [esblock.boxes_rows] [esblock.boxes_cols]; Style int privé, BoxWidth, BoxHeight; Boolean privé isTiled = false; / ** * Constructeur de classe de fenêtres pré-diffusée * / public Tippanel () {for (int i = 0; i <boxes.length; i ++) {for (int j = 0; j <boxes [i] .length; j ++) {boxes [i] [j] = new ersbox (false); }}} / ** * Définissez le style de bloc de la fenêtre de pré-affichage * * @param style int, correspondant à 28 valeurs dans les styles de la classe ersblock * / public void setStyle (int style) {this.style = style; repeindre(); } / ** * Écraser les fonctions de la classe JComponent et dessiner des composants. * * @Param G Graphics Device Environment * / @Override public void PaintComponent (Graphics G) {super.paintComponent (G); if (! IsTile) {ajustement (); } int key = 0x8000; for (int i = 0; i <boxes.length; i ++) {for (int j = 0; j <boxes [i] .length; j ++) {color colore = ((key & style)! = 0? frontcolor: backcolor); g.setColor (couleur); G.Fill3Drect (J * BoxWidth, I * BoxHeight, BoxWidth, BoxHeight, True); clé >> = 1; }}} / ** * g ajustez automatiquement la taille du carré en fonction de la taille de la fenêtre * / public void ajustement () {boxwidth = getSize (). width / ersblock.boxes_cols; boxHeight = getSize (). height / ersblock.boxes_rows; isTile = true; }}}Ersbox.java
Package RussiblockSgame; import java.awt.dimension; / ** * La classe Square est l'élément de base qui constitue le bloc et utilise sa propre couleur pour représenter l'apparence du bloc * / classe publique Ersbox implémente Clonable {privé booléen isColor; Taille de dimension privée = nouvelle dimension (); / ** * Le constructeur de la classe carrée, * * @param iscolor La couleur de premier plan est utilisée pour colorer ce carré True Couleur de premier plan, Faux Utilisation Couleur d'arrière-plan * / public Ersbox (Boolean Iscolor) {this.iscolor = isColor; } / ** * est ce carré exprimé dans la couleur du premier plan * * @return booléen, vrai exprimé dans la couleur de premier plan, false exprimé dans la couleur d'arrière-plan * / public boolean isColorbox () {return isColor; } / ** * Définissez la couleur du carré, * * @param iscolor boolean, vrai exprimé dans la couleur de premier plan, false exprimé dans la couleur d'arrière-plan * / public void setColor (booléen isColor) {this.iscolor = isColor; } / ** * Obtenez la taille de cette dimension carrée * * @return, la taille de la dimension carrée * / public getSize () {return size; } / ** * Réglez la taille du carré, * * @param size Dimension, la taille du carré * / public void setSize (dimension size) {this.size = size; } / ** * Écraser le clone de l'objet de l'objet (), implémenter Clone * * @return objet, Clone Result * / @Override public objet clone () {objet clone = null; essayez {clone = super.clone (); } catch (exception ex) {ex.printStackTrace (); } Clone de retour; }}Ersblock.java
Package RussiblockSgame; / ** * La classe de blocs, héritée de la classe de threads (thread) se compose de 4 × 4 blocs (ersbox), le contrôle du mouvement, la chute, la déformation du bloc, etc. * / class ersblock étend le thread {/ ** * Le nombre de lignes occupées par un bloc est 4 lignes * / public final static int static boxes_rows = 4; / ** * Le nombre de colonnes occupées par un bloc est de 4 colonnes * / public final static int boxes_cols = 4; / ** * Le facteur qui lisse les changements de mise à niveau pour éviter presque le double de la différence de vitesse entre les dernières étapes * / public final static int niveau_flatness_gene = 3; / ** * Quelle est la différence entre les deux niveaux similaires du bloc pour chaque ligne (millisecondes) * / public final static int entre_levels_degress_time = 50; / ** * Le nombre de styles de blocs est 7 * / public final static int block_kind_number = 7; / ** * Le type de blocs d'état d'inversion de chaque style est 4 * / public final static int block_status_number = 4; / ** * 28 états correspondant à 7 modèles respectivement * / public final static int [] [] styles = {// total 28 états {0x0f00, 0x4444, 0x0f00, 0x4444}, // quatre états de longues bandes 0x6c00, 0x4620, 0x6c00}, //Four states of reverse Z type {0x2640, 0xc600, 0x2640, 0xc600}, //Four states of Z type {0x6220, 0x1700, 0x2230, 0x0740}, //Four states of 7 type {0x6440, 0x0e20, 0x44c0, 0x8e00}, // quatre états de type inverse 7 {0x0660, 0x0660, 0x0660, 0x0660}, // quatre états de bloc}; Toile de GameCanvas privée; ersbox privé [] [] boxes = new ersbox [boxes_rows] [boxes_cols]; Style int privé, y, x, niveau; Boolean privé pauses = false, movage = true; / ** * Constructeur, génère un bloc spécifique * * @param Style Le style du bloc, correspondant à l'une des 28 valeurs de styles * @param y start position, coordonnée dans le coin supérieur gauche dans Canvas * @param x Position de démarrage, coordonnée colonne dans le coin supérieur gauche dans Canvas * @Param Level Niveau de jeu, Contrôler la vitesse de l'intm, Int @Param Canvas Artboard * / Public Ersblock (Intre, INTT Y, INTR Y, INTR Y, INTR Y, INTRY CANVAS Artboard * / Public Ersblock (INTTRYE INTR Y, INTR Y, INTR Y, INTRY CANVAS ARTBOBAS * / PUBLICE ES X, niveau int, gameCanvas Canvas) {this.style = style; this.y = y; this.x = x; this.level = niveau; this.canvas = canvas; int key = 0x8000; for (int i = 0; i <boxes.length; i ++) {for (int j = 0; j <boxes [i] .length; j ++) {boolean isColor = ((style & key)! = 0); Boxes [i] [j] = new ersbox (isColor); clé >> = 1; } } afficher(); } / ** * La fonction run () de la classe de thread couvre et laisse tomber le bloc jusqu'à ce que le bloc ne puisse pas tomber * / @Override public void run () {while (mobile) {try {sleep (entre_levels_degress_time * (russiblocksgame.max_level - niveau + niveau_flatness_gene)); } catch (InterruptedException ie) {ie.printStackTrace (); } // Le déplacement suivant signifie que le déménagement n'a pas été modifié au cours des 100 millisecondes d'attente if (! Pausing) {moving = (moveTo (y + 1, x) && moving); }}}} / ** * Le bloc déplace une grille vers la gauche * / public void moweleft () {moveto (y, x - 1); } / ** * Le bloc déplace une grille vers la droite * / public void moveright () {moveto (y, x + 1); } / ** * Le bloc déplace une grille vers la droite * / public void sowown () {MoveTo (y + 1, x); } / ** * Variante de bloc * / public void turnnext () {for (int i = 0; i <block_kind_number; i ++) {for (int j = 0; j <block_status_number; j ++) {if (styles [i] [j] == style) {int newstyle = styles [i] [(j + 1)% block_statur]; Turnto (newstyle); retour; }}}} public void startmove () {pausing = false; Move = true; } /** * Pause the whereabouts of the block, corresponding to the game pause*/ public void pauseMove() { pausing = true; // moving = false; } /** * Continue the whereabouts of the block, corresponding to the game continue*/ public void resumeMove() { pausing = false; moving = true; } /** * Stop the whereabouts of the block, corresponding to the game pause*/ public void stopMove() { pausing = false; moving = false; } /** * Remove the current block from the corresponding position of the canvas and will not be reflected until the next time you repaint the canvas*/ private void erase() { for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { if (boxes[i][j].isColorBox()) { ErsBox box = canvas.getBox(i + y, j + x); if (box == null) { continue; } box.setColor(false); } } } } } /** * Let the current block be placed in the corresponding position of the canvas, and you have to wait until the next time you repaint the canvas*/ private void display() { for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { if (boxes[i][j].isColorBox()) { ErsBox box = canvas.getBox(i + y, j + x); if (box == null) { continue; } box.setColor(true); } } } } } /** * Can the current block be moved to the location specified by newRow/newCol* * @param newRow int, the destination line* @param newCol int, destination column * @return boolean, true-can move, false-cannot move*/ public boolean isMoveAble(int newRow, int newCol) { erase(); for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { if (boxes[i][j].isColorBox()) { ErsBox box = canvas.getBox(i + newRow, j + newCol); if (box == null || (box.isColorBox())) { display(); return false; } } } } afficher(); Retour Vrai; } /** * Move the current block to the location specified by newRow/newCol* * @param newRow int, destination row* @param newCol int, destination column* @return boolean, true-move successfully, false-move failed*/ private synchronized boolean moveTo(int newRow, int newCol) { if (!isMoveAble(newRow, newCol) || !moving) { return false; } erase(); y = newRow; x = newCol; afficher(); canvas.repaint(); Retour Vrai; } /** * Can the current block become the block style specified by newStyle, mainly considering the boundary and being blocked by other blocks and cannot be moved* * @param newSytle int, the block style you want to change corresponds to one of the 28 values of STYLES* @return boolean, true-can change, false-cannot change*/ private boolean isTurnAble(int newStyle) { int key = 0x8000; effacer(); for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { if ((newStyle & key) != 0) { ErsBox box = canvas.getBox(i + y, j + x); if (box == null || (box.isColorBox())) { display(); return false; } } key >>= 1; } } afficher(); Retour Vrai; } /** * Turn the current block into the block style specified by newStyle* * @param newStyle int, the block style you want to change, corresponding to one of the 28 values of STYLES* @return true-change succeeds, false-change fails*/ private boolean turnTo(int newStyle) { if (!isTurnAble(newStyle) || !moving) { return false; } erase(); int key = 0x8000; for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { boolean isColor = ((newStyle & key) != 0); boxes[i][j].setColor(isColor); key >>= 1; } } style = newStyle; afficher(); canvas.repaint(); Retour Vrai; }}Main.java
package RussiaBlocksGame; /** * Program entry function* * @param args String[], accompanied by command line parameters*/ public class Main { public static void main(String[] args) { new RussiaBlocksGame("Tetris: Yang Yujie"); }} Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.