Это последний дизайн курса для курсов Java. Поскольку Java является новичком, я сослался на некоторые блоги технических экспертов, когда это делал. Я хотел бы выразить здесь свою благодарность.
Публикуйте здесь, чтобы общаться и учиться.
Если вам нужны полные файлы проекта, документация и запускаемые файлы JAR, загрузите адрес: нажмите, чтобы открыть ссылку
Russianblocksgame.java
Пакет Russiablocksgame; Импорт java.awt.*; импортировать java.awt.event.*; Импорт javax.swing.border.border; Импорт javax.swing.border.etchedborder; /*** Основной класс игры, унаследованный от класса JFrame, отвечает за глобальный контроль игры. Включает в себя: 1. объект экземпляра класса Gamecanvas Canvas, * 2. объект, который содержит текущий экземпляр Active Block (Russiablock); 3. объект, который удерживает экземпляр текущей панели управления (ControlPanel); */ public class rossiablocksgame extends jframe {private static final long serialversionuid = -7332245439279674749l; / *** Сколько баллов подсчитывается для каждой заполненной строки*/ public final Static int per_line_score = 100; / *** Сколько баллов можно обновить после накопления*/ public final Static int per_level_score = per_line_score* 20; / *** Максимальная серия - уровень 10*/ public final Static int max_level = 10; / ** * Серия по умолчанию составляет 2 */ public final Static int default_level = 2; Частный холст Gamecanvas; частный блок Ersblock; частная логическая игра = false; Частная контрольная панель CtrlPanel; // Инициализировать меню бар Private Jmenubar Bar = new jmenubar (); Частный jmenu mgame = new jmenu ("game"), mcontrol = new jmenu ("control"), minfo = new jmenu ("help"); private JMenuItem miNewGame = new JMenuItem("New Game"), miSetBlockColor = new JMenuItem("Set Block Color..."), miSetBackColor = new JMenuItem("Set Background Color..."), miTurnHarder = new JMenuItem("Elevate Game Difficulty"), miTurnEasier = new JMenuItem("Reduce Game Difficulty"), miExit = new jmenuitem ("exit"), miplay = new jmenuitem ("start"), mipause = new jmenuitem ("pause"), miresume = new jmenuitem ("resume"), uimp = new jmenuitem («уволить игру»), Mirule = new Jmenuitem («Game Vulice»), MiaUtor = jmenuitem; »; / *** Создать и установить меню окна*/ private void creatmenu () {bar.add (mgame); bar.add (mcontrol); bar.add (minfo); mgame.add (minewgame); mgame.addseparator (); // Добавить горизонтальную линию разделения mgame.add (misetblockcolor); mgame.add (misetblockcolor); mgame.addseparator (); // Добавить горизонтальную линию разделения mgame.add (miturnharder); mgame.add (miturneasier); mgame.addseparator (); // Добавить горизонтальную линию разделения mgame.add (miexit); mcontrol.add (miplay); miplay.setEnabled (true); mcontrol.add (mipause); mipause.setEnabled (false); mcontrol.add (miresume); miresume.setEnabled (false); Mcontrol.Add (MISTOP); MISTOP.SetEnabled (false); minfo.add (mirule); minfo.add (miauthor); SetJmenubar (бар); minewgame.addactionListener (new ActionListener () {@Override public void actionPerformed (actionEvent e) {stopgame (); Reset (); setlevel (default_level);}}); // Установить цвет блока misetblockcolor.addactionlistener (new ActionListener () {@Override public void actionPerformed (actionEvent e) {color newfrontcolor = jcolorchooser.showdialog (rossiblocksgame.this, «set the block color», canvas.getblockcolor (); ifrontcolor (); canvas.setblockcolor (newfrontcolor); // Установите цвет фона miSetbackcolor.addactionListener (new ActionListener () {@Override public void actionPerformed (actionEvent e) {color newbackcolor = jcolorchooser.showdialog (rossiablocksgame.this, «Установить цвет фона», canvas.getbackgroundcolor (); ifbackcolor! canvas.setbackgroundcolor (newbackcolor); // Определите функцию строки меню «О», и появляется ящик для подтверждения. miauthor.addactionListener (new ActionListener () {@Override public void actionperformed (actionEvent e) {joptionpane.showmessagegedialog (null, «Программное обеспечение (4) класс/N3115005372/nyang yujie/n © все правое на интерпретацию принадлежит Yang yujie». }); // Правила игры Описание MIRULE.AdcationListener (new ActionListener () {@Override public void actionperformed (actionEvent e) {joptionpane.showmessagegageedog (null, пластины разных форм, состоящих из небольших квадратов, падают с вершины экрана. Горизонтальные батончики сразу же исчезают, чтобы получить место для новых /н -падших тарелок. // Увеличить сложность miturnharder.addactionListener (new ActionListener () {@Override public void actionPerformed (actionEvent e) {int curlevel = getlevel (); if (! Играет && curlevel <max_level) {setlevel (curlevel + 1);}}}); // уменьшить сложность miturneasier.addactionListener (new ActionListener () {@Override public void actionPerformed (actionEvent e) {int curlevel = getlevel (); if (! Играет && curlevel> 1) {setlevel (curlevel - 1);}}}); // Ответ действия кнопки «Выход кнопки» miexit.addactionListener (new ActionListener () {@Override public void actionperformed (actionEvent e) {System.Exit (0);}}); } / *** Метод конструктора основного класса игры** @param Название строки, заголовок окна* / public rossiablocksgame (title string) {super (title); // Установить заголовок SETSIZE (500, 600); // Установить размер окна setlocationRelativeTo (null); // Установить окно -центральный CreateMenu (); Контейнер -контейнер = getContentPane (); // Создать контейнер с меню. Setlayout (New Borderlayout (6, 0)); // Установить менеджер макета окна Canvas = new Gamecanvas (20, 15); // Создать новую игру Canvas ctrlpanel = new ControlPanel (это); // Создать новый контейнер управления. // Добавить Canvas Container.Add (CtrlPanel, BorderLayout.East); // Добавить панель управления справа // регистрационные события окна. Когда кнопка «Закрыть» нажимается, игра заканчивается, а система уходит. addWindowlistener (new WindowDapter () {@Override public void windowclose (windowEvent we) {stopgame (); System.Exit (0);}}); // автоматически регулировать размер квадрата в соответствии с размером окна AddComponentListener (New ComponentAdapter () {@Override public void componentResized (componentEvent ce) {canvas.adjust ();}}); setVisible (true); canvas.adjust (); } /*** Сбросить игру* /public void reset () {// сбросить холст и сбросить панель управления 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 (); } / *** Определите, находится ли игра все еще в процессе** @return boolean, true - все еще работает, false -has остановлен* / public boolean isplaying () {return play; } / *** Получить в данный момент активный блок** @return ersblock, ссылка на в данный момент активного блока* / public ersblock getcurblock () {return Block; } / *** Получить текущий Canvas** @return Gamecanvas, ссылка на текущий Canvas* / public Gamecanvas getCanvas () {return canvas; } / *** Начните игру* / 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); miturneasier.setenabled (false); ctrlpanel.requestfocus (); // Установить фокус на панели управления}/*** Game 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); } / *** Пусть игра продолжается* / public void resumegame () {if (block! = Null) {block.resumemove (); } ctrlpanel.setplaybuttonenable (false); ctrlpanel.setpausebuttonenable (true); ctrlpanel.setpausebuttonlabel (true); mipause.setEnabled (true); miresume.setEnabled (false); ctrlpanel.requestfocus (); } / *** Пользователь останавливает игру* / 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); miturneasier.setenabled (true); RESET (); // Сбросить холст и панель управления}/** * Получите сложность, установленную игроком * * @return int, сложности игры 1-max_level */public int getlevel () {return ctrlpanel.getlevel (); } / ** * Пользователь устанавливает сложности игры * * @param level int, сложности игры 1-max_level * / public void setlevel (int level) {if (level <11 && level> 0) {ctrlpanel.setlevel (level); }} / *** Получить игровые точки** @return int, точки* / public int getscore () {if (canvas! = Null) {return canvas.getScore (); } return 0; } /*** Получите игровые точки с момента последнего обновления. После обновления эта точка будет очищена** @return int, ints*/ public int getScoreForleVelupDate () {if (canvas! = Null) {return canvas.getScoreFureupDate (); } return 0; } / ** * Когда интеграл накапливается до определенного значения, обновлять один раз * * @return boolean, true-uppadate, ложноопух fake * / public boolean levelupdate () {int curlevel = getlevel (); if (curlevel <max_level) {setlevel (curlevel + 1); canvas.resetscoreforlevelupdate (); вернуть истину; } вернуть false; } / *** Запуск игры* / private void play () {reset (); игра = правда; Thread Think = New Thread (New Game ()); // Запуск потока игры. Start (); } / *** Отчет. } /*** Один раунд игрового процесса, внедряя запускаемый интерфейс. Раунд игры - большая петля. В этом цикле каждые 100 миллисекунд проверяют, достиг ли текущий блок в игре. Если нет, * продолжит ждать. Если это доходит до конца, это зависит от того, есть ли полностью заполненная линия. Если есть, удалите его и добавьте очки в игрока и случайным образом генерируйте новый текущий блок и дайте ему автоматически упасть. * Когда генерируется новый блок, сначала проверьте, занята ли строка на верхней части холста. Если это так, вы можете судить об игре. */ Private Class Game реализует Runnable {@Override public void run () {int col = (int) (math.random () * (canvas.getcols () - 3)); // случайно генерирует положение блока int style = ersblock.styles [(int) (Math.random () * 7) [int) (int); формы while (игра) {if (block! = null) {// Блок пуст if (block.isalive ()) {try {thread.currentThread (); Thread.sleep (500); } catch (прерванное искусство т.е.) {ie.printstackTrace (); } продолжать; }} checkfullline (); // Проверьте, есть ли полностью заполненные строки, если (isgameover ()) {reportgameover (); miplay.setEnabled (true); mipause.setEnabled (false); miresume.setEnabled (false); MISTOP.SetEnabled (false); ctrlpanel.setplaybuttonenable (true); ctrlpanel.setpausebuttonlabel (false); ctrlpanel.setstopbuttonenable (false); возвращаться; } block = new Ersblock (стиль, -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 (стиль); }} // Проверьте, есть ли полностью заполненные линии на холсте. Если есть один, удалить его public void checkfullline () {for (int i = 0; i <canvas.getrows (); i ++) {int row = -1; Boolean fulllineColorbox = true; for (int j = 0; j <canvas.getcols (); j ++) {if (! canvas.getbox (i, j) .iscolobox ()) {fulllineColorbox = false; перерыв; }} if (fulllinecolorbox) {row = i--; Canvas.removeline (ряд); }}} // Судить, закончилась ли игра на основе того, занят ли верхний ряд //@return boolean, true-the игра закончилась, false-the-игра не является частной логической isgameover () {for (int i = 0; i <canvas.getcols (); i ++) {ersbox box = canvas.getbox (0, i); if (box.iscolorbox ()) {return true; }} вернуть false; }} /*** Определите диалоговое окно GameOver. */ @Suppresswarnings ("serial") частный класс Gameoverdialog расширяет Jdialog реализует ActionListener {private jbutton nefcybutton, uditbutton; Частная граница границы = новый тратбордер (retchedborder.raised, color.white, новый цвет (148, 145, 140)); public gameoverdialog (Jframe Parent, Title String, String Message) {super (родитель, заголовок, true); if (parent! = null) {setSize (240, 120); this.SetLocationRelativeTo (родитель); JPanel MessagePanel = new jPanel (); messagePanel.add (новый jlabel (сообщение)); MessagePanel.Setborder (граница); Контейнер -контейнер = this.getContentPane (); Container.SetLayout (New Gridlayout (2, 0, 0, 10)); Container.Add (MessagePanel); Jpanel choosepanel = new jpanel (); choosepanel.setlayout (new Gridlayout (0, 2, 4, 0)); intainer.add (choosepanel); Снова заработайте = new Jbutton («сыграть в другую игру»); exitbutton = new jbutton ("exit game"); choosepanel.add (new jpanel (). add (ekrybutton)); choosepanel.add (new jpanel (). add (exitbutton)); choosepanel.setborder (граница); } снова button.addactionListener (это); exitbutton.addactionListener (это); this.setvisible (true); } @Override public void actionPerformed (actionEvent e) {if (e.getSource () == снова заработав) {this.SetVisible (false); перезагрузить(); } else if (e.getSource () == exitbutton) {stopgame (); System.Exit (0); }}}}Gamecanvas.java
Пакет Russiablocksgame; импортировать java.awt.color; импортировать java.awt.graphics; импортировать javax.swing.jpanel; Импорт javax.swing.border.etchedborder; /*** Canvas Class, с <количество строк>* <Количество столбцов> Квадратные экземпляры класса. Унаследован от класса JPanel. Класс потока ERSBLOCK Динамически меняет цвет сетки класса Canvas. Класс Canvas использует * для проверки цвета сетки, чтобы отразить движение блока Ersblock. */ public class gamecanvas extends jpanel {private static final long serialversionuid = 6732901391026089276l; Private Color Backcolor = color.darkgray, FrontColor = color.white; Private Int Rows, Cols, Scord = 0, ScordForleVelupDate = 0; Частный ERSBOX [] [] коробки; Частная прогиба int box, boxHeight; / *** Конструктор класса Canvas** @param Rows int, количество строк Canvas* @param cols int, количество столбцов и столбцов Canvas определяет количество квадратов, которые Canvas имеет*/ public Gamecanvas (int Rows, int cols) {this.rows = row; this.cols = cols; Boxes = new Ersbox [Rous] [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 (новый Etchedborder (etchedborder.raised, color.white, новый цвет (148, 145, 140));} / ** * Конструктор класса Canvas * * @param Rows * @param cols * @param backcolor * @param frontcolor * / public gamecanvas (int rows, int, colorcolor, @param frontcolor * / public gamecanvas (int rows, int, colorcolor, colorcolorcolor, colorcolor, colorcolor это (rows, cols); getbackgroundcolor () {return backcolor; * Получите количество строк квадрата в Canvas** @return*/ public int getRows () {return Rows; } / *** Получите очки с момента последнего обновления** @return int, точки после последнего обновления* / public intcoreforlevelupdate () {return chound proseforleupdate; } / *** Получите квадратную ссылку определенной строки и столбца** @return row int, в строке, на которой следует ссылаться на квадрат* @param col int, в строке, на которой следует ссылаться* @return ersbox, ссылка на квадрат в столбце col* / public ersox getbox (int row, int col) {if (row <0 || row> rows. Компания [0]. <boxs.length; Отрегулируйте размер квадрата в соответствии с размером окна* / public void routage () {boxwidth = getsize (). Ширина / Cols; {for (int i = row; i> 0; i--) {for (int j = 0; j <cols; j ++) {boxes [i] [j] = (ersbox) коробки [i-1] [j] .clone (); SCOREFORLEVEDATE+= Russiablocksgame.per_level_score; {Boxes [i] [j] .setColor (false);ControlPanel.java
Пакет Russiablocksgame; импортировать java.awt.borderlayout; импортировать java.awt.color; импортировать java.awt.graphics; импортировать java.awt.gridlayout; импортировать java.awt.event.actionevent; импортировать java.awt.event.actionlistener; Импорт java.awt.event.compentionAdapter; импортировать java.awt.event.componentevent; импортировать java.awt.event.keyadapter; импортировать java.awt.event.keyevent; импортировать java.text.dateformat; импортировать java.text.simpledateformat; импортировать java.util.date; Импорт javax.swing.jbutton; импортировать javax.swing.jlabel; импортировать javax.swing.jpanel; импортировать javax.swing.jtextfield; импортировать javax.swing.timer; Импорт javax.swing.border.border; Импорт javax.swing.border.etchedborder; /*** Класс панели управления, унаследованный от JPanel. Кнопки предварительного просмотра, уровень, оценка и управление размещены на нем. */ class controlPanel Extends jPanel {Private Static Long Long SerialVersionUID = 3900659640646175724L; private jtextfield tflevel = new jtextfield ("" + rossiablocksgame.default_level), tfscore = new jtextfield ("0"), tftime = new jtextfield (""); Частный jbutton btplay = new jbutton ("start"), btpause = new jbutton ("pause"), btstop = new jbutton ("end the игра"), btturnlevelup = new jbutton («увеличить сложность»), btturnleveldown = new jbutton («уменьшить сложность»); Частный JPanel pltip = new jPanel (new Borderlayout ()); private tippanel pltipblock = new tippanel (); Частный JPanel plinfo = new JPanel (New Gridlayout (4, 1)); Private JPanel Plbutton = New JPanel (New Gridlayout (6, 1)); частный таймер таймера; Частная граница границы = новый тратбордер (retchedborder.raised, color.white, новый цвет (148, 145, 140)); /*** Конструктор класса панели управления** @param Game Ersblocksgame, ссылка на экземпляр класса Ersblocksgame удобен для непосредственного управления поведением класса Ersblocksgame. */ public ControlPanel (Final Russiablocksgame Game) {setlayout (new Gridlayout (3, 1, 0, 2)); pltip.add (new jlabel ("следующая площадь"), borderlayout.north); // Добавить компонент pltip.add (pltipblock); pltip.setborder (граница); plinfo.add (new jlabel ("коэффициент сложности")); plinfo.add (tflevel); plinfo.add (new jlabel ("счет")); plinfo.add (tfscore); plinfo.setborder (граница); 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 (граница); tflevel.setedible (false); tfscore.setedible (false); tftime.setediTable (false); добавить (pltip); добавить (plinfo); Добавить (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: block.moveDown(); break; case KeyEvent.VK_LEFT: block.moveLeft(); Break; btplay.addactionListener (new ActionListener () {// запустить игру @Override public void actionPerformed (actionEvent ae) {game.playgame ();}}); btpause.addactionListener (new ActionListener () {// Пауза @Override public void actionperformed (actionEvent ae) {if (btpause.getText (). equals ("pause")) {game.pausegame ();} else {game.resumegame ();}}}}); btstop.addactionListener (new ActionListener () {// Остановить игру @Override public void actionPerformed (actionEvent ae) {game.stopgame ();}}); btturnlevup.addactionListener (new ActionListener () {// увеличить сложности @Override public void actionPerformed (actionEvent ae) {try {int level = integer.parseint (tflevel.getText ()); if (russiablocksgame.max_level) {tfleleled.settextxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxtxt. (NumberFormateXception e) {} requestFocus (); btturnleveldown.addactionListener (new ActionListener () {// уменьшить сложности игры @Override public void actionperformed (actionevent ae) {try {int level = integer.parseint (tflevel.gettext ()); if (level> 1) {tflevel.settext (" + (level - 1); requestFocus (); addComponentListener (new ComponentAdapter () {@Override public void componentResized (componentEvent ce) {pltipblock.adjust ();}}); Timer = новый таймер (1000, new ActionListener () {@Override public void actionperformed (actionevent ae) {dateformat format = new SimpleDateFormat («Время: HH: MM: SS»); // Система получает дату времени = новая дата (); tftime.settext (format.format (дата); game.getscore ()); timer.start (); } / *** Установите стиль окна предварительной диски** @param Style int, соответствующий 28 значениям в стилях класса Ersblock* / public void settipstyle (int style) {pltipblock.setstyle (style); } /*** Получите уровень игры, установленным пользователем. * * @return int, уровень сложности, 1-esblocksgame.max_level */ public int getlevel () {int level = 0; try {level = integer.parseint (tflevel.getText ()); } catch (numberFormateXception e) {} return Level; } /*** Пусть пользователи изменят уровень сложности игры. * * @param Уровень измененный уровень сложности игры */ public void setlevel (int level) {if (level> 0 && level <11) {tflevel.settext ("" + level); }} /*** Установите статус кнопки «Пуск». */ public void setPlaybuttonenable (boolean enable) {btplay.setEnabled (enable); } public void SetPauseButtonEnable (Boolean Enable) {btpause.setEnabled (enable); } public void SetPauseButtonLabel (Boolean Pause) {btpause.settext (pause? "Пауза": "Продолжить"); } public void setStopButtonenable (boolean enable) {btstop.setEnabled (enable); } public void seturnLERLEVELUPBUTTONENABLE (BOOLEAN ENABLE) {btTurnleVelup.setEnabled (enable); } public void seturnLevelVownButtonEnable (boolean enable) {btturnleveldown.setEnabled (enable); } / *** Сбросить панель управления* / public void reset () {tfscore.settext ("0"); pltipblock.setstyle (0); } / *** пересказывать размер маленькой коробки в коробках [] [] в tippanel* / public void routation () {pltipblock.adjust (); } /*** Класс сведений о реализации в окне предварительной игры* /открытый класс Tippanel Extends jPanel {// tippanel используется для отображения формы следующего блока, чтобы появиться частным статическим конечным длинным последовательным уровнем = 5160553671436997616L; Private Color Backcolor = color.darkgray, FrontColor = color.white; private ersbox [] [] boxs = new Ersbox [esblock.boxes_rows] [esblock.boxes_cols]; Частный стиль Int, Продолжительность бокса, BoxHeight; Частный логический подход = false; / *** Конструктор класса с предварительной играми*/ 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); }}} / *** Установите стиль блока окна предварительной диски** @param int int, соответствующий 28 значениям в стилях класса Ersblock* / public void setstyle (int style) {this.style = style; Repaint (); } /*** Перезаписать функции класса JComponent и нарисовать компоненты. * * @param g Среда графического устройства */ @override public void paintcomponent (Graphics g) {super.paintcomponent (g); if (! ISTILED) {Advatue (); } int key = 0x8000; for (int i = 0; i <boxes.length; i ++) {for (int j = 0; j <Boxes [i] .length; j ++) {color color = ((ключ и стиль)! = 0? FrontColor: Backcolor); g.setcolor (цвет); g.fill3drect (j * boxwidth, i * boxheight, boxwidth, boxheight, true); Ключ >> = 1; }}} / *** g Автоматически отрегулируйте размер квадрата в соответствии с размером окна* / public void routation () {boxwidth = getSize (). width / ersblock.boxes_cols; boxHeight = getSize (). Height / ersblock.boxes_rows; Istiled = true; }}}Ersbox.java
Пакет Russiablocksgame; Импорт java.awt.dimension; / *** Квадратный класс является основным элементом, который составляет блок, и использует свой собственный цвет, чтобы представить внешний вид блока*/ public ersbox реализует клонируемый {private boolean iscolor; Частный размер измерения = новое измерение (); / ** * Конструктор квадратного класса, * * @param Iscolor делает цвет переднего плана для окрашивания этого квадратного истинного цвета переднего плана, ложный цвет фона */ public Ersbox (boolean iscolor) {this.iscolor = iscolor; } / *** Это квадрат, выраженный в цвете переднего плана** @return Boolean, True, выраженная в цвете переднего плана, False, выраженная в фоновом цвете* / public boolean iscolorbox () {return iscolor; } / ** * Установите цвет квадрата, * * @param Iscolor Boolean, True, выраженный в цвете переднего плана, False, выраженный в цвете фона * / public void setcolor (логический iscolor) {this.iscolor = iscolor; } / *** Получить размер этого квадрата** @return Dimension, размер квадрата* / public getsize () {return size; } / ** * Установите размер квадрата, * * @param размер размер, размер квадрата * / public void setsize (размер размер) {this.size = size; } / *** Перезаписать объект объекта Clone (), реализовать клон** @return Object, клон -результат* / @Override public Object Clone () {Object Clone = null; try {clone = super.clone (); } catch (Exception ex) {ex.printstackTrace (); } вернуть клон; }}Ersblock.java
Пакет Russiablocksgame; / *** Блок -класс, унаследованный от класса потока (поток) состоит из 4 × 4 блоков (ersbox), управления движением, падением, деформацией блока и т. Д.*/ Class Ersblock расширяет Thread {/ *** Количество рядов, занятых блоком, составляет 4 строки*/ public static int box_rows = 4; / *** Количество столбцов, занятых блоком, составляет 4 столбца*/ public final Static int box_cols = 4; / *** Коэффициент, который сглаживает обновление, изменяется, чтобы избежать почти вдвое прежнее разницу скорости между последними этапами*/ public final Static int level_flatness_gene = 3; / ** * Какова разница между двумя одинаковыми уровнями блока для каждой строки (миллисекунд) */ public final Static int gate_levels_degress_time = 50; / ** * Количество стилей блоков составляет 7 */ public final Static int block_kind_number = 7; / ** * Тип состояния инверсии блоков каждого стиля составляет 4 */ public final static int block_status_number = 4; /*** 28 состояний, соответствующих 7 моделям соответственно*/public final Static int [] [] styles = {// Всего 28 состояний {0x0f00, 0x4444, 0x0f00, 0x4444}, // четыре состояния длинных полос {0x04e0, 0x0464, 0x00e4, 0x04c4 {0x04e0, 0x0464, 0x00e4, 0x04c4 {0x04e0, 0x0464, 0x00e4, 0x04c4 {0x04e0, 0x0464, 0x00e4, 0x04c4 {0x04e0, 0x0464, 0x00e4, 0x04c4 {0x04e0, 0x0464, 0x00e4, 0x04c4 {0x04e0, 0x0464, 0x00e4, 0x. 0x6c00, 0x4620, 0x6c00}, // четыре состояния обратного типа Z {0x2640, 0xc600, 0x2640, 0xc600}, // четыре состояния z type {0x6220, 0x1700, 0x2230, 0x0740}, // четыре 3mes {0x6440, 0x0740}, // четыре 3mes {0x6440, 0x0740}, / /четыре состояния 7 0x44c0, 0x8e00}, // четыре состояния обратного 7 типа {0x0660, 0x0660, 0x0660, 0x0660}, // четыре состояния блока}; Частный холст Gamecanvas; private ersbox [] [] boxs = new ersbox [boxes_rows] [boxes_cols]; частный стиль Int, y, x, level; Частная логическая паоуза = false, roving = true; / *** Конструктор, генерирует определенный блок*** @param Style Стиль блока, соответствующий одному из 28 значений стилей* @param y начало level, gamecanvas canvas) {this.style = style; this.y = y; this.x = x; this.level = level; 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 = ((стиль и ключ)! = 0); коробки [i] [j] = new ersbox (iscolor); Ключ >> = 1; } } отображать(); } / *** Функция run () класса потока обложки и бросает блок до тех пор, пока блок снова не упадет* / @override public void run () {while (rovess) {try {sleep (meath_levels_degress_time* (rossiablocksgame.max_level - level + level_flatness_gene)); } catch (прерванное искусство т.е.) {ie.printstackTrace (); } // Последующее движение означает, что движение не было изменено в течение 100 миллисекунд ожидания, если (! PAUSING) {MOVEST = (MOVETO (y + 1, x) && двигаться); }}}} / ** * Блок перемещает одну сетку влево * / public void moveleft () {moveto (y, x - 1); } / ** * Блок перемещает одну сетку вправо * / public void moverert () {moveto (y, x + 1); } / ** * Блок перемещает одну сетку вправо * / public void owledown () {moveto (y + 1, x); } / *** Блок вариант* / 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) %. Turnto (Newstyle); возвращаться; }}}} public void startMove () {pausing = false; двигаться = true; } / *** Приостановите местонахождение блока, соответствующее паузе Game* / public void pausemove () {pausing = true; // двигаться = 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 true; } /** * 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; } стереть(); y = newRow; x = newCol; отображать(); canvas.repaint(); return true; } /** * 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; стереть(); 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(); вернуть ложь; } } key >>= 1; } } отображать(); return true; } /** * 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; } стереть(); 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; отображать(); canvas.repaint(); return true; } }Main.java
package RussiaBlocksGame; /** * 程序入口函数* * @param args String[],附带的命令行参数*/ public class Main { public static void main(String[] args) { new RussiaBlocksGame("俄罗斯方块:杨宇杰"); } } Выше всего содержание этой статьи. I hope it will be helpful to everyone's learning and I hope everyone will support Wulin.com more.