Les exemples de cet article partagent avec vous le code spécifique de la mise en œuvre de Java Tetris pour votre référence. Le contenu spécifique est le suivant
Idées de conception de Tetris
Tetris joue depuis son enfance. Tout le monde connaît les règles. Dans le passé, je pensais que cette chose était très amusante, mais je ne pouvais tout simplement pas gagner. Maintenant, j'ai appris à en écrire un par moi-même et à le pratiquer tous les jours!
Fonctionnement du clavier:
Clé gauche: déplacer à gauche; Clé de droite: déplacez-vous à droite;
Clé up: modifiez la forme et la clé inférieure: accélérez la goutte (pas de problème, pas de rectification supplémentaire)
Si les carrés de toute ligne sont pleins, cette ligne sera éliminée. L'élimination d'une rangée de carrés obtiendra 10 points. À l'heure actuelle, je n'ai pas réglé les niveaux. Les bébés qui l'aiment peuvent définir les niveaux eux-mêmes;
Alors, d'où proviennent ces formes carrées? Il est conçu par nous nous-mêmes. Les formes communes sont: je type, type t, type L, type de grille Tianzi, etc., ajoutez-les vous-même!
Alors que s'est-il passé? En fait, ce n'est qu'un tableau 4 * 4. Bien sûr, vous pouvez concevoir n * n avec bonheur, vous avez le dernier mot!
Donc, j'ai donné un exemple ci-dessous pour vous dire pourquoi les formes que vous voyez peuvent être modifiées sont conçues à l'avance, 0 est vide et 1 est un remplissage, afin que vous puissiez créer des formes dans votre jeu!
Oubliez-le: placez simplement l'image et voyez d'abord le code en cours d'exécution:
Aimez-vous? Si vous l'aimez, faites-le directement. Peut-être que le code n'est pas assez bien écrit. S'il te plaît, pardonne-moi. Je vais résumer davantage lorsque je reviendrai en arrière et continuerai à mettre à jour le code;
Classe GamePanel: Classe d'interface de jeu, l'ensemble du bloc est abandonné et affiché, et la logique du jeu est implémentée dans cette classe;
Package Tetris; import java.awt.graphics; import java.awt.event.actionEvent; import java.awt.event.actionListener; import java.awt.event.keyevent; import java.awt.event.keyListener; import java.util.random; import javax.swing.joptionpane; import javax.wing.jpax; javax.swing.timer; GamePanel de classe publique étend JPanel implémente keyListener {private int maprow = 21; private int mapcol = 12; private int mapgame [] [] = new int [maprow] [mapcol]; // Ouvrez un espace de tableau bidimensionnel pour stocker notre minuterie privée d'informations de carte; private int score = 0; // enregistrer le score aléatoire aléatoire = new random (); private int curshapetype = -1; private int curshapestate = -1; // définir le type de forme actuel et l'état de forme actuel private int nextShapetype = -1; private int nextShapEstate = -1; // définir le type et l'état du groupe de blocs qui apparaît la prochaine fois privé int posx = 0; privé int posy = 0; Les formes int private final [] [] [] = Nouveau int [] [] {// t Les glyphes sont stockés dans l'ordre dans le sens antihoraire {{0,1,0,0, 1,1,1,0, 0,0,0,0,0,0,0}, {0,1,0,0, 1,1,0,0,0,0,0,0,0 {{0,0,0,0, 1,1,1,1,1,0,0,0,0, 0,0,0,0,0}, {0,1,0,0,0, 0,1,0,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,,0, le 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,,0, le 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,,0, le 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,,0, le Ot 1,0,0,0,0,0}, {1,1,0,0, 0,1,1,0,0,0,0,0,0,0}, {1,1,0,0, 0,1,1,0,0,0,0,0,0}, {0,1,0,0, 1,1,0, 1,0,0,0,0,0,0,0, Dans l'ordre dans le sens antihoraire {{0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0,0,0}, {1,1,1,0, 0,0,1,0,0,0,0,0,0,0,0}, {1,1,0,0, 1,0,0,0,0,0,0,0,0,0,0,0}, {1,0,0,0, 1,1,0,0,0,0,0,0}. 1,1,0,0,0,0,0,0,0,0,0}, {0,0,1,0, 1,1,0,0, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}, {1,1,0,0, 0,1,0,0,0,0,0,0,0}, {1,1,1,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0, le , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0, le 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0, le , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0, le 0,0,0,0,0,0,0,0}}}}; private int rowrect = 4; private int colrect = 4; // Nous considérons ici l'image stockée comme un tableau 4 * 4 bidimensionnel. Bien que nous utilisons un tableau unidimensionnel pour le stocker ci-dessus, nous devons toujours le considérer comme un tableau bidimensionnel pour implémenter Int privé RECTWIDTH = 10; public GamePanel () // Constructor ---- Créez une bonne carte {CreaterEct (); initmap (); // initialiser cette carte setwall (); // set wall // createct (); timer = new Timer (500, new TimerListener ()); timer.start (); } class TimerListener implémente ActionListener {public void ActionPerformed (ActionEvent e) {SouplowOwn (); }} public void setwall () // colonne 0 et 11 sont les deux murs, et la ligne 20 est également des murs {pour (int i = 0; i <maprow; i ++) // dessiner la colonne d'abord {mapgame [i] [0] = 2; mapgame [i] [11] = 2; } pour (int j = 1; j <mapcol-1; j ++) // dessiner la dernière ligne {mapgame [20] [j] = 2; }} public void initmap () // initialiser cette carte, l'ID de mur est 2, l'ID d'espace est 0, et l'ID de bloc est 1 {pour (int i = 0; i <maprow; i ++) {for (int j = 0; j <mapcol; j ++) {mapgame [i] [j] = 0; }}} public void CreaterEct () // Create Block --- Si le type de bloc et l'état actuels existent, définissez la prochaine fois, sinon, définissez l'état et le type actuel {if (curshapetype == -1 && curshapestate == -1) // l'état de bloc actuel est 1, indiquant que le jeu vient de commencer {curshapeType = random.nextint (Shaps.Lengthy); curshapestate = random.nextint (Shapes [0] .length); } else {curshapetype = nextShapEtype; curshapestate = nextShapEstate; } nextShapEtype = random.nextint (Shapes.Length); NextShapEstate = random.Nextint (Shapes [0] .Length); posx = 0; Posy = 1; // Créez un carré dans le coin supérieur gauche du mur if (Gameover (posx, posy, curshapetype, curshapestate)) {joptionpane.showconfirmDialog (null, "jeu fin!", "Tip", joptionpane.ok_option); System.exit (0); }} public boolean gameover (int x, int y, int shapetype, int shapstate) // juge si le jeu se termine {if (isornomove (x, y, formetype, shapstate)) {return false; } return true; } public booléen isornomove (int x, int y, int shapetype, int shapstate) // juger si le chiffre actuel peut être déplacé. Ici, nous soulignons que les coordonnées de x et y se réfèrent à la cible supérieure gauche d'un tableau bidimensionnel de 4 * 4 (le tableau décrivant la figure) {pour (int i = 0; i <rowrect; i ++) {for (int j = 0; j <colrect; j ++) {if (formes [forme de forme] [shapestate] [i * Colrect + j] == 1 &&&&W Mapgame [x + i] [y + j] == 1 || Formes [formetype] [Shapsatate] [i * Colrect + J] == 1 && mapgame [x + i] [y + j] == 2) {return false; }}} return true; } public void tour () // rotation {int temp = curshapestate; curshapestate = (curshapestate + 1)% formes [0] .Length; if (isornomove (posx, posy, curshapetype, curshapestate)) {} else {curshapestate = temp; } repeain (); } public void Soupped () // se déplacer {if (isornomove (posx + 1, posy, curshapetype, curshapestate)) {posx ++; } else {addToMap (); // Correction de cette ligne dans la ligne de contrôle (); Createrrect (); // recréer un nouveau bloc} repent (); } public void moweleft () // se déplacer à gauche {if (isornomove (posx, posy-1, curshapetype, curshapestate)) {posy--; } repeain (); } public void moveright () // se déplacer à droite {if (isornomove (posx, posy + 1, curshapetype, curshapestate)) {posy ++; } repeain (); } public void addToMap () // fixer l'image tombée dans la carte {pour (int i = 0; i <rowrect; i ++) {for (int j = 0; j <colrect; j ++) {if (shapes [curshapety formes [curshapetype] [curshapestate] [i * Colrect + J]; }}}} public void checkline () // Vérifiez s'il y a des lignes complètes dans ces lignes {int count = 0; for (int i = maprow-2; i> = 0; i--) {count = 0; for (int j = 1; j <mapcol-1; j ++) {if (mapgame [i] [j] == 1) {count ++; } else se briser; } if (count> = mapcol-2) {for (int k = i; k> 0; k--) {for (int p = 1; p <mapcol-1; p ++) {mapgame [k] [p] = mapgame [k-1] [p]; }} score + = 10; i ++; }}} public void peinture (graphiques g) // Repeindre la fenêtre {super.paint (g); pour (int i = 0; i <rowrect; i ++) // dessiner le bloc de chute {pour (int j = 0; j <colrect; j ++) {if (formes [curshapetype] [curshapestate] [i * Colrect + j] == 1) {g.fillrect ((posy + j + 1) * RECTWIDTH, (posx + i + 1) Rectwidth, rectwidth); }}} pour (int i = 0; i <maprow; i ++) // dessiner les informations de bloc qui ont été fixées sur la carte {pour (int j = 0; j <mapcol; j ++) {if (mapgame [i] [j] == 2) // dessiner le mur {g.Drrawrect ((j + 1) * RECTWIDTH, (i + 1) * rctwidth, rctwidth, (i + 1) * rctwidth, rctwidth, (i + 1) * rctwidth, rctwidth, (i + 1) * rctwidth, rctwidth, (i + 1) * rctwidth, rctwidth, (i + 1) * rctwidth, rctwidth, RECTWIDth, (i + 1) * rctwidth, rctwidth, Recte Rectwidth); } if (mapgame [i] [j] == 1) // dessiner un petit carré {g.fillrect ((j + 1) * rectWidth, (i + 1) * rectWidth, rectWidth, rectWidth); }}} g.Drawstring ("score =" + score, 225, 15); G.Drawstring ("Next Square:", 225, 50); pour (int i = 0; j <colrect; j ++) {if (fames [nextShapetype] [nextShapestate] [i * Colrect + j] == 1) {g.Fillrect (225+ (j * rectWidth), 100+ (i * rectWidth), rectWidth, rectWidth); }}}} public void newgame () // Le jeu recommence {score = 0; initmap (); Setwall (); CreaterEct (); repeindre(); } public void stopgame () // le jeu pause {timer.stop (); } public void continugame () {timer.start (); } @Override public void keyTyped (keyEvent e) {} @Override public void keyPressed (keyEvent e) {switch (e.getkeycode ()) {case Keyevent.vk_up: // up ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Keyevent.vk_right: // droit ---- moVeight (); casser; }} @Override public void keyreleased (keyevent e) {// TODO Méthode générée automatiquement Stub}} Classe GameFrame: le port d'entrée de l'ensemble du jeu, eh bien, pour le dire franchement, c'est une classe avec la fonction principale (). Cette classe met en œuvre certaines conceptions de l'interface de jeu, que vous pouvez comprendre comme une petite interface utilisateur;
Package Tetris; Importer java.awt.event.actionEvent; import java.awt.event.actionListener; import javax.swing.jframe; import javax.swing.jmenu; import javax.swing.jmenubar; import javax.swing.jmeniuittem; Importer javax.swing.joptionpane; ActionListener {private int widthFrame = 500; private int heightframe = 600; Private JMenu menu = new JMenu ("Game"); // Créer un menu privé jMenuItem newgame = menu.add ("redémarrer"); // Créer une option de menu intégrée JMENUiTeM EXITGAME = MENU.ADD ("Game Exit"); JMENUiTeM privé = menu.add ("Game Pause"); privé jMenuItem Goongame = menu.add ("jeu continue"); JMENU privé menutwo = new JMenu ("Help"); // Créer un deuxième menu JMenuItem privé surgame = menutwo.add ("About the Game"); GamePanel GamePanel = new GamePanel (); public GameFrame () // Constructor {addKeyListener (GamePanel); newgame.addactionListener (this); exitgame.addactionListener (this); stopgame.addactionListener (this); goongame.addactionListener (this); À propos de Game.AddactionListener (this); this.add (gamepanel); Menu jMenubar = new JMenubar (); menu.add (menuone); menu.add (menutwo); this.setJMenubar (menu); this.setTitle ("Tetris"); this.setbounds (50, 10, largeur, le heightframe); this.setVisible (true); this.setDefaultCloseOperation (jframe.exit_on_close); } public void ActionPerformed (actionEvent e) {if (e.getsource () == newgame) // le jeu recommence {gamepanel.newgame (); } if (e.getSource () == exitgame) // jeu exit {system.exit (0); } if (e.getSource () == stopgame) // jeu pause {gamepanel.stopgame (); } if (e.getSource () == goongame) // jeu continue {gamepanel.continuegame (); } if (e.getSource () == AboutGame) // À propos des informations de jeu {joptionpane.showMessageAdIalog (null, "Déplacer les touches gauche et droite, créer une rotation vers le haut", "invite", joptionpane.ok_option); }} public static void main (String [] args) {new GameFrame (); }}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.