Я узнал эту технику в прошлом году и еще не написал ее. Теперь я потратил время, чтобы написать игру тетриса.
Только простая новая игра, пауза, продолжить, точки функционируют. Это просто осознает классические российские функции.
Я больше не буду вводить это. Если вы заинтересованы, запустите его самостоятельно и опубликуйте картинку позже.
Код:
Пакет cn.hncu; импорт java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.keyAdapter; import.Aval.Event. kiostev. javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.Timer;public class Tetris extends JFrame{ public static void main(String[] args) { Tetris te = new Tetris(); te.setvisible (true); // Если вы добавите поле для редактирования в интерфейс, который сфокусирует фокус, вам необходимо использовать следующий код //te.requestfocus(true);///led Наверная панель Получите фокус-получите прослушивание клавиатуры} Private Tetrispanel TP; Jmenuitem iTempause; Jmenuitem itemcontinue; public tetris () {this.setDefaultCloseoPeration (exit_on_close); это. Сетлокация (700, 200); это. setize (220, 275); this.SetReSizable (false); tp = new Tetrispanel (); this.getContentPane (). Add (TP); // Добавить меню jmenubar menubar = new jmenubar (); this.setjmenubar (menubar); Jmenu menugame = new jmenu ("игра"); menubar.add (mengame); Jmenuitem itemnew = new jmenuitem ("новая игра"); itemnew.setActionCommand ("new"); itempause = new jmenuitem ("пауза"); itempause.setActionCommand ("пауза"); itemContinue = new jmenuitem ("продолжить"); itemContinue.setActionCommand («Продолжить»); itemContinue.setEnabled (false); menugame.add (itemnew); menugame.add (iTempause); menugame.add (itemcontinue); Менулистенс менюлистенера = новый менюлистонер (); itemnew.addactionListener (Menulistener); itempause.addactionListener (Menulistener); itemContinue.addactionListener (Menulistener); // пусть вся jframe добавит клавиатуру прослушать это.addkeyListener (tp.listener); } класс Menulistener реализует ActionListener {@Override public void actionPerformed (actionEvent e) {// Играть в новую игру if (e.getActionCommand (). equals ("new")) {tp.newgame (); } if (e.getActionCommand (). equals ("pause")) {timer.stop (); itemContinue.setEnabled (true); itempause.setEnabled (false); } if (e.getActionCommAnd (). equals ("Продолжить")) {timer.restart (); itemContinue.setEnabled (false); itempause.setEnabled (true); }}} частный таймер таймера; Класс Tetrispanel Extens JPanel {// Forme of Square: // Первое измерение представляет тип блока (включая 7 типов: S, Z, L, J, I, O, T) // Второе измерение представляет количество вращений // Третье и четвертое измерение представляет матрицу блока // [i] [i] [i/4]. Shapes [] [] [] = new int [] [] [] { / * * Template { {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,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} } */ // 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, 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, 0, 0, 0, 0, 0. 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } }, // S { { 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 }, { 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, 1, 0, 0, 0, 0, 0, 0, // z 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } }, // J { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 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, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // T { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 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, 0, 0 } } }; private int blocktype; // тип блока Private int turnstate; // Состояние вращения частное int x; // Положение блока x- Колоновое положение Колонское число Чтобы предотвратить трансграничный, массив открывается в: 13 столбцов и 23 ряда частных задержек int = 1000; Public TimerKeyLister Slister = new TimerKeyLister (); private int score = 0; // Оценка public tetrispanel () {newgame (); NextBlock (); // timer = новый таймер (задержка, слушатель); //timer.start (); } public void newgame () {blocktype = (int) (math.random ()*1000)%7; TurnState = (int) (Math.Random ()*1000)%4; x = 4; y = 0; для (int i = 0; i <12; i ++) {// line for (int j = 0; j <21; j ++) {// halking if (i == 0 || i == 11) {// 3 - сетка границы границы раздела [i] [j] = 3; // действительно, просто используйте целые числа, кроме 0 и 1, но используется 3 здесь, есть специальный эффект, использующий {use at. us at. {use at. us at. at. {use at. at. at. at. {use at. at. at. at. at. }} map [i] [21] = 3; // 3 - сетка границы интерфейса} if (timer! = null) {timer.stop (); } задержка = 1000; Timer = новый таймер (задержка, слушатель); timer.start (); } private void nextBlock () {blocktype = (int) (math.random ()*1000)%7; TurnState = (int) (Math.Random ()*1000)%4; x = 4; y = 0; // игра Over If (Crash (x, y, Blocktype, TurnState) == 0) {timer.stop (); int option = joptionpane.showconfirmdialog (это, «игра!, Вы все еще смеете прийти ...»); if (option == joptionpane.ok_option) {newgame (); } else if (option == joptionpane.no_option) {System.exit (0); }}} private void down () {if (crash (x, y+1, blocktype, turnstate) == 0) {// Обратите внимание, что y+1 используется здесь, чтобы определить, является ли соответствующая позиция в карте складываемым блоком или кадром после того, как блок отбрасывается на один квадрат; // Сохранить информацию текущего блока на Map leteblock (); } else {y ++; } Repaint (); } private void LEAT () {if (x> = 0) {x -= crash (x -1, y, blocktype, turnstate); } Repaint (); } private void right () {if (x <8) {x += crash (x +1, y, blocktype, turnstate); } Repaint (); } private void turn () {if (crash (x, y, blocktype, (turnstate+1)%4) == 1) {turnstate = (turnstate+1)%4; } Repaint (); } 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 (фигуры [blocktype] [turnstate] [a*4+b] == 1) {map [x+b+1] [y+a] = 1; }}} tryDelline (); } // Устранение private void tryDelline () {for (int b = 0; b <21; b ++) {int c = 1; for (int a = 0; a <12; a ++) {c & = map [a] [b]; // Все являются 1, результат C-1} if (c == 1) {// Существует линия, которую необходимо удалить // переместить одну строку в последовательности для (int d = b; d> 0; d-) {int e = 0; карта [e] [D-1]; }} // Добавить очки баллов += 100; задержка /=1.05; timer.setdelay (задержка); }}} // Пример параметра: 4,3,2,3 // Судья, существует ли столкновение частного сбоя int (int x, int y, int blocktype, int turnstate) {for (int a = 0; a <4; a ++) {for (int b = 0; b <4; b ++) {// if (shapes [blocktype] [a a (a aй -strastate] [a aistrate] [a a (a aй -4/b <4; Карта [x+b+1] [y+a] == 1) || // (формы [blocktype] [turnstate] [a*4+b] == 1 && map [x+b+1] [y+a] == 3)) {//} if ((shapes [blocktype] [y turnstate] [a*4+b] & map [x+b+b+1) 0; // collision}}} return 1; // no collision} @override public void paint (графика g) {// blocktype = 6; // turnstate = 3; // x = 4; // y = 6; Super.paint (g); // Устранение послерода G.SetColor (новый цвет (153,51,205)); // Нарисуйте текущий блок для (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 (новый цвет (153,51,205)); }} // Нарисуйте интерфейсную раму и блоки стека --- вся карта g.setcolor (color.red); for (int i = 0; i <12; i ++) {// ходьба для (int j = 0; j <22; j ++) {// Ходьба 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, 10); g.setcolor (color.green); G.DrawRect (i*10, J*10, 10, 10); g.setcolor (color.red); }}} // Показать счет, и макет прекрасна, добавьте что -то в интерфейс // Нарисуйте правую часть квадратной области g.setcolor (color.red); g.setfont (новый шрифт ("aa", font.bold, 11)); g.drawstring ("scord =" + оценка, 130, 20); g.setfont (новый шрифт ("aa", font.plain, 13)); g.setcolor (color.blue); G.DrawString («Отклонить пиратские игры», 125, 70); G.DrawString («Будь осторожен с самозащитой», 125, 90); G.DrawString («Остерегайтесь обмана»., 125, 110); G.DrawString («Умеренная игра хороша для мозга», 125, 130); G.DrawString («Добавить в игру вреден для тела», 125, 150); G.DrawString («разумно расписание времени», 125, 170); G.drawstring («Наслаждайтесь здоровой жизнью»., 125, 190); } класс TimerKeyLister Extends KeyDapter реализует ActionListener {@Override public void actionPerformed (actionEvent e) {down (); } @Override public void keypressed (keyEvent e) {switch (e.getKeyCode ()) {case keyEvent.vk_down: down (); перерыв; case keyevent.vk_left: Least (); Break; case keyevent.vk_right: right (); break; case keyevent.vk_up: turn (); break; case keyevent.vk_f1: plug (); case keyevent.vk_f2: time (); }} public void plug () {оценка+= 100; } public void Time () {Delay = 1000; timer.setdelay (задержка); }}}Запуск интерфейса:
Для более захватывающих игр, пожалуйста, обратитесь к специальной теме "Java Classic Games"
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.