Примеры в этой статье делятся с вами конкретным кодом реализации Java Tetris для вашей ссылки. Конкретный контент заключается в следующем
Идеи дизайна тетриса
Тетрис играет с детства. Все знают правила. В прошлом я думал, что это было очень весело, но я просто не мог победить. Теперь я научился писать один сам и практиковать его каждый день!
Работа клавиатуры:
Левый ключ: двигаться влево; Правильный ключ: двигаться вправо;
Ключ вверх: измените форму и нижнюю клавишу: ускорить падение (без проблем, нет дальнейшего исправления)
Если квадраты какого -либо ряда заполнены, эта линия будет исключена. Устранение ряда квадратов получит 10 очков. В настоящее время я не устанавливал уровни. Младенцы, которые нравятся, могут сами установить уровни;
Так откуда взялись эти квадратные формы? Он спроектирован нами сами. Общие формы: I типа, тип T, тип L, тип сетки Tianzi и т. Д., Добавьте их самостоятельно!
Так что случилось? На самом деле, это всего лишь 4*4 массива. Конечно, вы можете спроектировать n*n счастливо, у вас есть последнее слово!
Итак, я дал пример ниже, чтобы сказать вам, почему формы, которые вы видите, могут быть изменены заранее, 0 пуст, а 1 - наполнитель, так что вы можете создавать фигуры в своей игре!
Забудьте об этом: просто поместите картинку и сначала посмотрите, как код запускает результаты:
Нравится? Если вам это нравится, просто сделайте это напрямую. Может быть, код недостаточно хорошо написан. Пожалуйста, прости меня. Я суммирую больше, когда оглянусь назад, и буду продолжать обновлять код;
Класс GamePanel: класс игрового интерфейса, весь блок отбрасывается и отображается, а логика игры медленно реализована в этом классе;
Пакет Tetris; импорт java.awt.graphics; import java.awt.event.actionevent; импорт java.awt.event.actionlistener; импорт java.awt.event.keyevent; импорт java.awt.event.keylistener; импорт java.util.random; import javax.swang. javax.swing.timer; Public Class GamePanel расширяет JPanel реализует KeyListener {private int maprow = 21; private int mapcol = 12; private int mapgame [] [] = new int [mapRow] [mapCol]; // открыть двухмерное место для хранения информации о нашей карте частного таймера таймера; private int chall = 0; // Запишите оценку случайного случайного = new random (); private int curshapetype = -1; private int curshepestate = -1; // Установить текущий тип формы и состояние текущего состояния private int nextshapetype = -1; private int nextshapestate = -1; // Установите тип и статус блочной группы, которая появляется в следующий раз private int posx = 0; private int posy = 0; Приватный окончательный int -формы [] [] [] = new int [] [] {// t глифы хранятся в порядке против часовой стрелки {{0,1,0,0, 1,1,1,0, 0,0,0,0,0,0,0}, {0,1,0,0, 1,0,0,0,0,0,0}, {0,1,0,0, 1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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, 1,0,0,0, 0,0,0,0,0,0}, {1,0,0,0, 1,1,0,0,0,0,0}, // Z-образный {{1,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0}, {1,1,0,0,0, 0,1,0,0,0,0,0,0}, {1,1,0,0, 0,1,1,0,0,0,0,0}, {0,1,0,0, 1,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, 1,0,0,0, 0,0,0,0,0,0}, {1,1,1,0, 0,0,1,0,0,0,0,0,0,0}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,0,0,0,0,0,0,0,0,0, {1,0,0,0, 1,1,0,0,0,0,0,0,0,0}, {1,0,0,0, 1,0,0,0,0,0,0,0,0}, // L Glyphs хранятся в порядке против часового часа {1,0,0,0, 1,0,0,0, 1,1,0,0,0,0,0,0,0,0,0}, {0,0,1,0, 1,0,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}, {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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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 rowrect = 4; Private int colrect = 4; // Здесь мы рассматриваем хранимое изображение как двумерный массив 4*4. Хотя мы используем одномерный массив для хранения его выше, нам все еще нужно рассматривать его как двумерный массив для реализации частной int rectwidth = 10; public gamepanel () // constructor ---- Создайте хорошую карту {createrect (); initMap (); // инициализировать эту карту setWall (); // set Wall // createrect (); Timer = новый таймер (500, новый TimerListener ()); timer.start (); } класс TimerListener реализует ActionListener {public void actionPerformed (actionEvent e) {movelown (); }} public void setWall () // Столбец 0 и 11 представляют собой стены, а строка 20 также является стенами {for (int i = 0; i <maprow; i ++) // Нарисуйте столбец первым {mapgame [i] [0] = 2; MapGame [i] [11] = 2; } for (int j = 1; j <mapcol-1; j ++) // Нарисуйте последнюю строку {mapgame [20] [j] = 2; }} public void initmap () // Инициализировать эту карту, идентификатор стены 2, идентификатор пространства равен 0, а идентификатор блока - 1 {for (int i = 0; i <mapRow; i ++) {for (int j = 0; j <mapcol; j ++) {mapgame [i] [J] = 0; }}} public void createrect () // Создать блок --- Если текущий тип блока и состояние существует, установите в следующий раз, если нет, установите текущее состояние и type {if (curshapetype == -1 && curshapestate == -1) // Состояние текущего блока составляет 1, что указывает на то, что игра только началась {curshapetype = random.nextint (shapes.line); curshapestate = random.nextint (формы [0] .length); } else {curshapetype = nextshapetype; curshapestate = nextshapestate; } nextShapetype = random.nextint (shapes.length); nextShapestate = random.nextint (формы [0] .length); posx = 0; posy = 1; // Создать квадрат в верхнем левом углу стены if (Gameover (posx, posy, curshapetype, curshepestate)) {joptionpane.showconfirmdialog (null, "end!", "tip", joptionpane.ok_option); System.Exit (0); }} public boolean gameover (int x, int y, int shapetype, int shapestate) // Судья, заканчивается ли игра {if (isornomove (x, y, shapetype, shapestate)) {return false; } вернуть true; } public boolean isornomove (int x, int y, int shapetype, int shapestate) // Судья, можно ли перемещать текущую фигуру. Здесь мы подчеркиваем, что координаты x и y относятся к верхней левой цели двумерного массива 4*4 (массив, описывающий рисунок) {for (int i = 0; i <rowrect; i ++) {для (int j = 0; j <colrect; j ++) {if (shapes [shapetype] [i*** MapGame [x+i] [y+j] == 1 || Форма [Shapetype] [Shapestate] [i*colrect+j] == 1 && mapgame [x+i] [y+j] == 2) {return false; }}} вернуть true; } public void turn () // rotate {int temp = curshaPestate; curshapestate = (curshapestate+1) % формы [0] .length; if (isornomove (posx, posy, curshapetype, curshapestate)) {} else {curshapestate = temp; } Repaint (); } public void Movelown () // Перемещение вниз {if (isornomove (posx+1, posy, curshapetype, curshapestate)) {posx ++; } else {addTomap (); // исправить эту строку в контрольной линии карты (); Createrect (); // воссоздать новый блок} Repaint (); } public void moveleft () // перемещать влево {if (isornomove (posx, posy-1, curshapetype, curshapestate)) {posy--; } Repaint (); } public void moverert () // Перемещение вправо {if (isornomove (posx, posy+1, curshapetype, curshapestate)) {posy ++; } Repaint (); } public void AddTomap () // Исправить опадное изображение в карту {for (int i = 0; i <rowRect; i ++) {for (int j = 0; j <colrect; j ++) {if (формы [curshapetype] [curshapestate] [i*colrect+j] == 1) {mapgam Формы [curshapetype] [curshepestate] [i*colrect+j]; }}}} public void Checkline () // Проверьте, есть ли полные строки в этих строках {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 Break; } 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]; }} оценка += 10; i ++; }}} public void Paint (графика G) // перекрасить окно {super.paint (g); for (int i = 0; i <rowrect; i ++) // Нарисуйте падающий блок {for (int j = 0; j <colrect; j ++) {if (shapes [curshapetype] [curshapestate] [i*colrect+j] == 1) {g.fillrect ((позиция+j+1)*rectwidth, (posx+1)*1)*1). Прямая протекляция, прямотехлая); }}} для (int i = 0; i <mapRow; i ++) // Нарисуйте информацию о блоке, которая была зафиксирована на карте {for (int j = 0; j <mapcol; j ++) {if (mapgame [i] [j] == 2) // Нарисуйте стену {g.drawrect (j+1)*rectwidth, (i+1)*retththth -pertwrect (j+1)*rectwidth, (i+1). Rectwhidth); } if (mapgame [i] [j] == 1) // Нарисуйте маленький квадрат {g.fillRect ((j+1)*rectwidth, (i+1)*rectwidth, rectwidth, rectwidth); }}} g.drawstring ("score ="+ оценка, 225, 15); G.DrawString («Следующий квадрат:», 225, 50); for (int i = 0; j <colrect; j ++) {if (shapes [nextshapetype] [nextshapestate] [i*colrect+j] == 1) {g.fillrect (225+ (j*rectwidth), 100+ (i*rectwidth), rectwidth, rectwidth); }}}} public void newgame () // игра начинается снова {scor = 0; initMap (); SetWall (); Createrect (); Repaint (); } public void StopGame () // игра пауза {timer.stop (); } public void containGame () {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: // right ---- moveright (); перерыв; }} @Override public void keyrealeaded (keyevent e) {// todo автоматически генерируемый метод stub}} Класс GameFrame: входной порт всей игры, ну, чтобы сказать, это класс с функцией Main (). Этот класс реализует некоторые дизайны игрового интерфейса, которые вы можете понимать как небольшой пользовательский интерфейс;
Пакет Tetris; импортировать java.awt.event.actionevent; import java.awt.event.actionlistener; импорт javax.swing.jframe; import javax.swing.jmenu; импорт javax.swing.jmenubar; import javax.swing.jmenuitem; импорт javax.swing.jopmentpane; ActionListener {private int widthframe = 500; private int heightframe = 600; Private Jmenu Menu = new Jmenu ("Game"); // Создать меню частного JMenuitem newgame = menu.add ("перезапуск"); // Создать встроенный вариант меню частного jmenuitem exitgame = menu.add ("exit exit"); Частный jmenuitem stopgame = menu.add ("Game Pause"); Частный jmenuitem goongame = menu.add («Игра продолжается»); Частный jmenu menutwo = new jmenu ("help"); // Создать второе меню частного Jmenuitem aboutgame = menutwo.add («О игре»); GamePanel GamePanel = new GamePanel (); public GameFrame () // Constructor {addKeyListener (GamePanel); newgame.addactionListener (это); exitgame.addactionListener (это); stopgame.addactionListener (это); goongame.addactionListener (это); extgame.addactionListener (это); this.add (GamePanel); Jmenubar Menu = new jmenubar (); Menu.Add (меню); menu.add (menutwo); this.setjmenubar (меню); this.setTitle ("tetris"); this.SetBounds (50, 10, WidthFrame, HightFrame); this.setvisible (true); this.setDefaultCloseoPeration (jframe.exit_on_close); } public void actionPerformed (actionEvent e) {if (e.getSource () == newgame) // игра начинается снова {gamePanel.newgame (); } if (e.getSource () == exitgame) // exit exit {System.Exit (0); } if (e.getSource () == Stopgame) // Game Pause {gamePanel.stopgame (); } if (e.getSource () == goongame) // Игра продолжается {gamepanel.continuegame (); } if (e.getSource () == aboutgame) // об игре {joptionpane.showmessageDialog (null, «Переместить влево и правые клавиши, создать вращение вверх», «Приглашение», joptionpane.ok_option); }} public static void main (string [] args) {new GameFrame (); }}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.