日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java實現2048小游戲(可直接運行)

瀏覽:28日期:2022-08-16 08:56:55
運行效果:

Java實現2048小游戲(可直接運行)

1.項目結構

Java實現2048小游戲(可直接運行)

2.代碼

BaseData接口

package com.hsy.game;import java.awt.*;public interface BaseData { Font topicFont = new Font('微軟雅黑', Font.BOLD, 50); Font scoreFont = new Font('微軟雅黑', Font.BOLD, 28); Font normalFont = new Font('宋體', Font.PLAIN, 20); Font font1 = new Font('宋體', Font.BOLD, 46); Font font2 = new Font('宋體', Font.BOLD, 40); Font font3 = new Font('宋體', Font.BOLD, 34); Font font4 = new Font('宋體', Font.BOLD, 28); Font font5 = new Font('宋體', Font.BOLD, 22); int normalFontData = 20; int topicFontData = 30; void init(); void showView();}

GameView類

package com.hsy.game;import java.awt.Color;import java.awt.FlowLayout;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.ArrayList;import java.util.List;import java.util.Random;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class GameView implements BaseData{ private static final int jFrameWidth = 400; private static final int jFrameHeight = 530; private static int score = 0; private JFrame jFrameMain; private JLabel jLblTitle; private JLabel jLblScoreName; private JLabel jLblScore; private GameBoard gameBoard; private JLabel jlblTip; public GameView() { init(); } @Override public void init() { jFrameMain = new JFrame('2048小游戲'); jFrameMain.setSize(jFrameWidth, jFrameHeight); jFrameMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jFrameMain.setLocationRelativeTo(null); jFrameMain.setResizable(false); jFrameMain.setLayout(null); jLblTitle = new JLabel('2048', JLabel.CENTER); jLblTitle.setFont(topicFont); jLblTitle.setForeground(Color.BLACK); jLblTitle.setBounds(50, 0, 150, 60); jFrameMain.add(jLblTitle); // 分數區 jLblScoreName = new JLabel('得 分', JLabel.CENTER); jLblScoreName.setFont(scoreFont); jLblScoreName.setForeground(Color.WHITE); jLblScoreName.setOpaque(true); jLblScoreName.setBackground(Color.GRAY); jLblScoreName.setBounds(250, 0, 120, 30); jFrameMain.add(jLblScoreName); jLblScore = new JLabel('0', JLabel.CENTER); jLblScore.setFont(scoreFont); jLblScore.setForeground(Color.WHITE); jLblScore.setOpaque(true); jLblScore.setBackground(Color.GRAY); jLblScore.setBounds(250, 30, 120, 30); jFrameMain.add(jLblScore); // 說明: jlblTip = new JLabel('操作: ↑ ↓ ← →, 按esc鍵重新開始 ', JLabel.CENTER); jlblTip.setFont(normalFont); jlblTip.setForeground(Color.DARK_GRAY); jlblTip.setBounds(0, 60, 400, 40); jFrameMain.add(jlblTip); gameBoard = new GameBoard(); gameBoard.setBounds(0, 100, 400, 400); gameBoard.setBackground(Color.GRAY); gameBoard.setFocusable(true); gameBoard.setLayout(new FlowLayout()); jFrameMain.add(gameBoard); } // 游戲面板需要對鍵值實現偵聽, // 這里采用內部類來繼承 JPanel 類, // 并實現接口 KeyListener 中的 keyPressed 方法, // 方格是通過 @SuppressWarnings('serial') class GameBoard extends JPanel implements KeyListener { private static final int CHECK_GAP = 10; private static final int CHECK_ARC = 20; private static final int CHECK_SIZE = 86; private Check[][] checks = new Check[4][4]; private boolean isAdd = true; public GameBoard() { initGame(); addKeyListener(this); } @Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_ESCAPE: initGame(); break; case KeyEvent.VK_LEFT: moveLeft(); createCheck(); judgeGameOver(); break; case KeyEvent.VK_RIGHT: moveRight(); createCheck(); judgeGameOver(); break; case KeyEvent.VK_UP: moveUp(); createCheck(); judgeGameOver(); break; case KeyEvent.VK_DOWN: moveDown(); createCheck(); judgeGameOver(); break; default: break; } repaint(); } private void initGame() { score = 0; for (int indexRow = 0; indexRow < 4; indexRow++) { for (int indexCol = 0; indexCol < 4; indexCol++) { checks[indexRow][indexCol] = new Check(); } } // 生成兩個數 isAdd = true; createCheck(); isAdd = true; createCheck(); } private void createCheck() { List<Check> list = getEmptyChecks(); if (!list.isEmpty() && isAdd) { Random random = new Random(); int index = random.nextInt(list.size()); Check check = list.get(index); // 2, 4出現概率3:1 check.value = (random.nextInt(4) % 3 == 0) ? 2 : 4; isAdd = false; } } // 獲取空白方格 private List<Check> getEmptyChecks() { List<Check> checkList = new ArrayList<>(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (checks[i][j].value == 0) { checkList.add(checks[i][j]); } } } return checkList; } private boolean judgeGameOver() { jLblScore.setText(score + ''); if (!getEmptyChecks().isEmpty()) { return false; } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { //判斷是否存在可合并的方格 if (checks[i][j].value == checks[i][j + 1].value || checks[i][j].value == checks[i + 1][j].value) { return false; } } } return true; } private boolean moveLeft() { for (int i = 0; i < 4; i++) { for (int j = 1, index = 0; j < 4; j++) { if (checks[i][j].value > 0) { if (checks[i][j].value == checks[i][index].value) { score += checks[i][index++].value <<= 1; checks[i][j].value = 0; isAdd = true; } else if (checks[i][index].value == 0) { checks[i][index].value = checks[i][j].value; checks[i][j].value = 0; isAdd = true; } else if (checks[i][++index].value == 0) { checks[i][index].value = checks[i][j].value; checks[i][j].value = 0; isAdd = true; } } } } return isAdd; } private boolean moveRight() { for (int i = 0; i < 4; i++) { for (int j = 2, index = 3; j >= 0; j--) { if (checks[i][j].value > 0) { if (checks[i][j].value == checks[i][index].value) { score += checks[i][index--].value <<= 1; checks[i][j].value = 0; isAdd = true; } else if (checks[i][index].value == 0) { checks[i][index].value = checks[i][j].value; checks[i][j].value = 0; isAdd = true; } else if (checks[i][--index].value == 0) { checks[i][index].value = checks[i][j].value; checks[i][j].value = 0; isAdd = true; } } } } return isAdd; } private boolean moveUp() { for (int i = 0; i < 4; i++) { for (int j = 1, index = 0; j < 4; j++) { if (checks[j][i].value > 0) { if (checks[j][i].value == checks[index][i].value) { score += checks[index++][i].value <<= 1; checks[j][i].value = 0; isAdd = true; } else if (checks[index][i].value == 0) { checks[index][i].value = checks[j][i].value; checks[j][i].value = 0; isAdd = true; } else if (checks[++index][i].value == 0){ checks[index][i].value = checks[j][i].value; checks[j][i].value = 0; isAdd = true; } } } } return isAdd; } private boolean moveDown() { for (int i = 0; i < 4; i++) { for (int j = 2, index = 3; j >= 0; j--) { if (checks[j][i].value > 0) { if (checks[j][i].value == checks[index][i].value) { score += checks[index--][i].value <<= 1; checks[j][i].value = 0; isAdd = true; } else if (checks[index][i].value == 0) { checks[index][i].value = checks[j][i].value; checks[j][i].value = 0; isAdd = true; } else if (checks[--index][i].value == 0) { checks[index][i].value = checks[j][i].value; checks[j][i].value = 0; isAdd = true; } } } } return isAdd; } @Override public void paint(Graphics g) { super.paint(g); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { drawCheck(g, i, j); } } // GameOver if (judgeGameOver()) { g.setColor(new Color(64, 64, 64, 150)); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.WHITE); g.setFont(topicFont); FontMetrics fms = getFontMetrics(topicFont); String value = 'Game Over!'; g.drawString(value, (getWidth()-fms.stringWidth(value)) / 2, getHeight() / 2); } } // 繪制方格 // Graphics2D 類擴展了 Graphics 類, // 提供了對幾何形狀、坐標轉換、顏色管理和文本布局更為復雜的控制 private void drawCheck(Graphics g, int i, int j) { Graphics2D gg = (Graphics2D) g; gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); gg.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); Check check = checks[i][j]; gg.setColor(check.getBackground()); // 繪制圓角 // x - 要填充矩形的 x 坐標。 // y - 要填充矩形的 y 坐標。 // width - 要填充矩形的寬度。 // height - 要填充矩形的高度。 // arcwidth - 4 個角弧度的水平直徑。 // archeight - 4 個角弧度的垂直直徑。 gg.fillRoundRect(CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * j, CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * i, CHECK_SIZE, CHECK_SIZE, CHECK_ARC, CHECK_ARC); gg.setColor(check.getForeground()); gg.setFont(check.getCheckFont()); // 對文字的長寬高測量。 FontMetrics fms = getFontMetrics(check.getCheckFont()); String value = String.valueOf(check.value); //使用此圖形上下文的當前顏色繪制由指定迭代器給定的文本。 //getAscent()是FontMetrics中的一個方法, //它返回某字體的基線(baseline)到該字體中大多數字符的升部(ascender)之間的距離 //getDescent 為降部 gg.drawString(value, CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * j + (CHECK_SIZE - fms.stringWidth(value)) / 2, CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * i + (CHECK_SIZE - fms.getAscent() - fms.getDescent()) / 2 + fms.getAscent()); } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } } @Override public void showView() { jFrameMain.setVisible(true); }}

Check類

package com.hsy.game;import java.awt.Color;import java.awt.Font;public class Check { public int value; public Check() { clear(); } public void clear() { value = 0; } public Color getForeground() { switch (value) { case 0: return new Color(0xcdc1b4); case 2: case 4: return Color.BLACK; default: return Color.WHITE; } } public Color getBackground() { switch (value) { case 0: return new Color(0xcdc1b4); case 2: return new Color(0xeee4da); case 4: return new Color(0xede0c8); case 8: return new Color(0xf2b179); case 16: return new Color(0xf59563); case 32: return new Color(0xf67c5f); case 64: return new Color(0xf65e3b); case 128: return new Color(0xedcf72); case 256: return new Color(0xedcc61); case 512: return new Color(0xedc850); case 1024: return new Color(0xedc53f); case 2048: return new Color(0xedc22e); case 4096: return new Color(0x65da92); case 8192: return new Color(0x5abc65); case 16384: return new Color(0x248c51); default: return new Color(0x248c51); } } public Font getCheckFont() { if (value < 10) { return BaseData.font1; } if (value < 100) { return BaseData.font2; } if (value < 1000) { return BaseData.font3; } if (value < 10000) { return BaseData.font4; } return BaseData.font5; }}

Test類

package com.hsy.game;public class Test { public static void main(String[] args) { new GameView().showView(); }}

運行Test即可

總結

到此這篇關于Java實現2048小游戲的文章就介紹到這了,更多相關Java 2048小游戲內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美国产中文高清| 日韩高清中文字幕一区| 国产欧美精品久久| 国产欧美丝祙| 久久精品国产999大香线蕉| 国产精品流白浆在线观看| 国产毛片久久久| 久久精品二区亚洲w码| 国产毛片一区二区三区 | 亚洲精品人人| 亚洲免费毛片| 欧美日韩在线精品一区二区三区激情综合| 青青国产精品| 久久精品国产久精国产| 国产夫妻在线| 香蕉人人精品| 亚洲中字黄色| 91成人在线| 精品中文在线| 久久精品电影| 蜜臀精品一区二区三区在线观看 | 国产欧美视频在线| 老牛国内精品亚洲成av人片| 精品99久久| 国精品一区二区| 亚洲五月综合| 国产精成人品2018| 九九精品调教| 羞羞答答国产精品www一本| 在线观看一区| 欧美日韩91| 成人三级高清视频在线看| 国产一区清纯| 日韩高清欧美激情| 久久久91麻豆精品国产一区| 日韩av一级| 美国三级日本三级久久99| 国产欧美二区| 九色porny丨国产首页在线| 亚洲一区二区三区在线免费| 国产精品chinese| 国内激情久久| 欧美日一区二区在线观看| 亚洲黄色网址| 蜜臀av一区二区三区| 国产精品视频首页| 欧美少妇精品| 亚洲九九精品| 岛国av在线播放| 亚洲三级精品| 日本а中文在线天堂| 日av在线不卡| 91欧美在线| 免费看日韩精品| 国产在线观看www| 亚洲欧洲av| 久久夜夜操妹子| 国产日韩亚洲| 黄色日韩在线| 国产福利亚洲| 国产精品av一区二区| 国产乱码精品| 91久久黄色| 美女久久久久久| 亚洲一区久久| 97人人精品| 欧美一区二区三区久久精品| 99久久激情| 欧美黄页在线免费观看| 六月丁香综合| 欧美sss在线视频| 国产欧美成人| 久久福利影视| 日韩精品一区二区三区免费观看| 欧美精品影院| 亚洲欧洲午夜| 亚洲国产福利| 国产精品分类| 在线观看视频免费一区二区三区| 成人国产综合| 日韩国产精品久久久| 黑丝一区二区| 国产成人精品亚洲日本在线观看| 久久久久久亚洲精品美女| 亚洲精品在线a| 欧美午夜不卡| 日韩网站中文字幕| 黄色精品视频| 国产精品调教视频| 激情久久久久久| 成人污污视频| 欧美日韩亚洲国产精品| 亚洲一区二区小说| 国产视频一区三区| 丝袜av一区| 欧美男人天堂| 四虎成人av| 久久天堂影院| 麻豆视频久久| 麻豆精品视频在线| 国产精品一区二区av交换| 日韩精品久久久久久久软件91| 亚洲一级在线| 欧美日韩日本国产亚洲在线 | 尤物精品在线| 久久国产毛片| 久久九九99| 日韩三区免费| 亚洲欧洲高清| 美女福利一区二区三区| 精品国产乱码久久久久久1区2匹| 国产美女久久| 国产精品男女| 国产精品欧美日韩一区| 国产精品美女午夜爽爽| 国产免费久久| 久久丁香四色| 久久97视频| 国产高清亚洲| 国产成人精品一区二区免费看京 | 中日韩男男gay无套| 在线视频观看日韩| 日韩欧美一区二区三区免费观看| 色婷婷色综合| 日本精品影院| 欧美gv在线| 性欧美xxxx免费岛国不卡电影| 成人欧美一区二区三区的电影| 中文在线资源| 美女网站一区| 在线亚洲精品| 亚洲专区视频| 青青在线精品| 精品国产亚洲一区二区三区在线 | 久久久久九九精品影院| 精品一区电影| 精品国产乱码久久久久久1区2匹| 国产一区二区久久久久| 日韩高清成人| 日韩午夜精品| 日韩中文字幕视频网| 国产欧美自拍| 成人亚洲一区二区| 欧美福利专区| 日本亚洲视频| 美女在线视频一区| 日韩网站中文字幕| 人人爽香蕉精品| 久久99精品久久久野外观看| 91视频一区| 红桃视频国产精品| 亚洲a成人v| 牛牛精品成人免费视频| 欧美黄色网页| 亚洲天堂av资源在线观看| 欧美经典一区| 欧美色图国产精品| 亚洲精品乱码日韩| 精品一区二区三区四区五区| 亚洲午夜电影| 日韩av午夜在线观看| 国产成人精品999在线观看| 成人看片网站| 亚洲精品第一| 国产欧美一区二区三区精品酒店| 在线视频免费在线观看一区二区| 亚洲理论在线| 国产精品中文| 欧美日韩在线网站| 欧美日韩1区| 久久久国产精品一区二区中文| 蜜桃免费网站一区二区三区| 精品一区二区三区四区五区| 日韩午夜av在线| 久久中文字幕导航| 久久aⅴ国产紧身牛仔裤| 麻豆精品av| 男人的天堂亚洲一区| 日韩午夜在线| 久久男人av| 欧美综合二区| 国产一区二区三区探花| 四虎影视精品| 伊人国产精品| 国产精品最新| 国产极品一区| 免费久久精品视频| 中文字幕色婷婷在线视频| 麻豆国产精品777777在线| 国产日产高清欧美一区二区三区 | 国产精品乱战久久久| 国产真实久久| 久久国产尿小便嘘嘘| 99精品小视频| 婷婷成人av| 国产91精品对白在线播放| 欧美精品福利| 国产一区日韩一区| 精品免费av一区二区三区| 日av在线不卡|