J'ai appris cette technique l'année dernière et je ne l'ai pas encore écrite. Maintenant, j'ai pris le temps d'écrire un jeu Tetris.
Seulement le nouveau jeu simple, pause, continue, points de point. Il réalise simplement les fonctions russes classiques.
Je ne le présenterai plus. Si vous êtes intéressé, exécutez-le vous-même et postez une photo plus tard.
Code:
Package CN.HNCU; IMPORT Java.awt.Color; Import Java.awt.font; Import Java.awt.Graphics; Import Java.awt.Event.Actionevent; Importer Java.awt.Event.ActionListener; Import Java.awt.Event.KeyAdapter; Import Java.Awt.Event.Keyevent; Import Javax.Jerd; Import; javax.swing.jmenu; Importer javax.swing.jmenubar; import javax.swing.jmecutem; import javax.swing.joptionpane; import javax.swing.jpanel; import javax.swing.timer; public class tetris étend jframe {public static main (string [] args) {Tetris); te.setVisible (true); // Si vous ajoutez une boîte de modification à l'interface qui saisira l'objectif, vous devez utiliser le code suivant //te.RequestFocus(True) ;//Teler le panneau de jeu Get Focus - Obtenez l'écoute du clavier} Tetrispanel Private TP; JMenuItem ItemPause; JMenuItem itemContinue; public tetris () {this.setDefaultCloseOperation (exit_on_close); this.setLocation (700, 200); this.setSize (220, 275); this.setResiSable (false); tp = new Tetrispanel (); this.getContentPane (). Add (tp); // Ajouter le menu jMenubar menuBar = new JMenubar (); this.setJMenubar (MenUbar); JMenu menugame = new JMenu ("jeu"); menubar.add (menugame); JMenuItem itemNew = new JMenuItem ("nouveau jeu"); itemNew.setActionCommand ("nouveau"); itemPause = new JMenUiTem ("Pause"); itemPause.SetActionCommand ("Pause"); itemContinue = new JMenUiTem ("Continuer"); itemContinue.SetActionCommand ("Continuer"); itemContinue.SetEnabled (false); menugame.add (itemNew); menugame.add (itemPause); menugame.add (itemContinue); Menulistener Menulistener = new MenuListener (); itemNew.AddactionListener (MenuListener); itemPause.addactionListener (MenuListener); itemContinue.addactionListener (MenuListener); // Laissez l'intégralité de JFrame ajouter le clavier à écouter this.addkeyListener (tp.Listener); } class MenuListERner implémente ActionListener {@Override public void ActionPerformed (ActionEvent e) {// Play New Game if (e.getActionCommand (). equals ("new")) {tp.newgame (); } if (e.getActionCommand (). equals ("pause")) {timer.stop (); itemContinue.SetEnabled (true); itempause.setEnabled (false); } if (e.getActionCommand (). Equals ("Continuer")) {TIMER.RESTART (); itemContinue.SetEnabled (false); itemPause.setEnabled (true); }}} temporisateur privé; Class Tetrispanel étend Jpanel {// forme du carré: // La première dimension représente le type de bloc (y compris 7 types: S, Z, L, J, I, O, T) // La deuxième dimension représente le nombre de rotations // la troisième et la quatrième dimension représente la matrice de bloc //% [Type] [tournois] [i] i -> Block [i / 4] [I% 4] = nouveau int [] [] [] {/ * * modè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,0que , 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,0que , 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,0que , 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,0que {0,0,0,0,0,0,0,0,0,0, * 0,0,0,0,0,0,0,0,0,0} } */ // I (※Switch the bar in version 1 from line 1 to line 2) { { 0, 0, 0, 0, 0, 1, 1, 1, 1, 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, It 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, It 0, 0, 0, 0, 0, 0, 0, 1. 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0}}, // z {{1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 1, 1. 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 0, 1, 1, 1. 0, 0, 0, 0, 0, 0 } }, // O { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // L { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1. 0, 0, 0}, {0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}}; private int blockType; // Type de bloc private int tournant; // État de rotation private int x; // position de bloc x - Column Position Column Numéro privé int y; // position de bloc y - position - ROW Position - Row Number int map [] [] = new int [13] [23]; // map: 12 colonnes et 22 lignes. Pour empêcher le transfrontalier, le tableau est ouvert sur: 13 colonnes et 23 lignes private intlay = 1000; public timerKeyLister écouteur = new TimerKeyLister (); private int score = 0; // score public tetrispanel () {newgame (); NextBlock (); // TIMER = NOUVEAU TIMER (Delay, Écouteur); //timer.start (); } public void newgame () {BlockType = (int) (math.random () * 1000)% 7; Turnstate = (int) (math.random () * 1000)% 4; x = 4; y = 0; pour (int i = 0; i <12; i ++) {// line for (int j = 0; j <21; j ++) {// Walking if (i == 0 || i == 11) {// 3 est la grille de la carte de bordure d'interface [i] [j] = 3; // vraiment, utilise simplement des entières }} map [i] [21] = 3; // 3 est la grille de la bordure d'interface} if (timer! = null) {timer.stop (); } retard = 1000; timer = new Timer (Delay, écouteur); timer.start (); } private void nextBlock () {BlockType = (int) (math.random () * 1000)% 7; Turnstate = (int) (math.random () * 1000)% 4; x = 4; y = 0; // jeu sur if (crash (x, y, blockType, Turnstate) == 0) {timer.stop (); int option = joptionpane.showconfirmDialog (this, "jeu over !!, osez-vous toujours venir ..."); if (option == jOptionPane.ok_Option) {newgame (); } else if (option == joptionpane.no_option) {System.exit (0); }}} private void down () {if (crash (x, y + 1, blockType, tournal) == 0) {// notez que y + 1 est utilisé ici pour déterminer si la position correspondante dans la carte est un bloc ou un cadre empilé après le bloc (); } else {y ++; } repeain (); } private void Left () {if (x> = 0) {x - = crash (x-1, y, blockType, Turnstate); } repeain (); } private void right () {if (x <8) {x + = crash (x + 1, y, blockType, Turnstate); } repeain (); } private void tour () {if (crash (x, y, blockType, (Turnstate + 1)% 4) == 1) {Turnstate = (Turnstate + 1)% 4; } repeain (); } private void add (int x, int y, int blockType, int turnstate) {for (int a = 0; a <4; a ++) {for (int b = 0; b <4; b ++) {if (fames [blockType] [Turnstate] [a * 4 + b] == 1) {map [x + b + 1] [y + a] = 1; }}} trydelline (); } // éliminer private void trydelline () {for (int b = 0; b <21; b ++) {int c = 1; pour (int a = 0; a <12; a ++) {c & = map [a] [b]; // tous sont 1, le résultat de c est 1} if (c == 1) {// il y a une ligne qui doit être éliminée // déplacer une ligne en séquence pour (int d = b; d> 0; d -) {pour (int e = 0; e <11; e ++) {map map [e] [d-1]; }} // Ajouter un score de points + = 100; retard /=1.05; TIMER.SetDelay (Delay); }}} // Exemple de paramètre: 4,3,2,3 // juger s'il y a une collision private int crash (int x, int y, int blockType, int tourning) {for (int a = 0; a <4; a ++) {for (int b = 0; b <4; b ++) {// if ((formes [blocktype] [tournure tournante] [a * 4 + b]. map [x + b + 1] [y + a] == 1) || // (Shapes [BlockType] [Turnstate] [A * 4 + B] == 1 && map [x + b + 1] [y + a] == 3)) {//} if ((Shapes [BlockType] [Y +) [A * 4 + B] & map [x + b + 1] [y +)) 0; // collision}}} return 1; // pas de collision} @Override public void peinture (graphics g) {// blockType = 6; // tournottate = 3; // x = 4; // y = 6; super.paint (g); // éliminer la publication g.setColor (nouvelle couleur (153,51,205)); // dessine le bloc actuel pour (int j = 0; j <16; j ++) {if (Shapes [BlockType] [Turnstate] [J] == 1) {g.Fillrect ((J% 4 + x + 1) * 10, (j / 4 + y) * 10, 10, 10); g.setColor (Color.cyan); G.Drawrect ((J% 4 + x + 1) * 10, (j / 4 + y) * 10, 10, 10); g.setColor (nouvelle couleur (153,51,205)); }} // dessiner le cadre d'interface et les blocs de pile --- Toute la carte g.setColor (Color.red); pour (int i = 0; i <12; i ++) {// Walking for (int j = 0; j <22; j ++) {// Walking if (map [i] [j] == 3) {g.drawrect (i * 10, j * 10, 10, 10); } else if (map [i] [j] == 1) {g.fillrect (i * 10, j * 10, 10, 10); g.setColor (Color.Green); G.Drawrect (i * 10, J * 10, 10, 10); g.setColor (Color.Red); }}} // montre le score, et la disposition est magnifique, ajoutez quelque chose à l'interface // dessinez la bonne partie de la zone carrée g.setColor (Color.red); g.setfont (new Font ("aa", font.bold, 11)); G.Drawstring ("score =" + score, 130, 20); g.setfont (new Font ("aa", font.plain, 13)); g.setColor (Color.Blue); G.Drawstring ("Rejeter les jeux piratés", 125, 70); G.Drawstring ("Soyez prudent à l'autoprotection.", 125, 90); G.Drawstring ("Méfiez-vous d'être trompé.", 125, 110); G.Drawstring ("Le jeu modéré est bon pour le cerveau", 125, 130); G.Drawstring ("Add to Play est nocif au corps.", 125, 150); G.Drawstring («Planifier le temps raisonnable», 125, 170); G.Drawstring ("Profitez d'une vie saine.", 125, 190); } class TimerKeyList étend KeyAdapter implémente ActionListener {@Override public void ActionperFormed (ActionEvent e) {down (); } @Override public void keyPdress (keyEvent e) {switch (e.getkeycode ()) {case keyEvent.vk_down: down (); casser; case keyevent.vk_left: Left (); break; case keyevent.vk_right: right (); break; case keyevent.vk_up: tour (); break; case keyevent.vk_f1: plug (); case keyevent.vk_f2: time (); }} public void plug () {score + = 100; } public void time () {delay = 1000; TIMER.SetDelay (Delay); }}}Interface en cours d'exécution:
Pour des jeux plus excitants, veuillez vous référer au sujet spécial "Java Classic Games"
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.