电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

200行java代碼實(shí)現(xiàn)2048小游戲

瀏覽:7日期:2022-09-02 16:03:40

本文實(shí)例為大家分享了java實(shí)現(xiàn)2048小游戲的具體代碼,供大家參考,具體內(nèi)容如下

效果圖:

200行java代碼實(shí)現(xiàn)2048小游戲

游戲介紹:

1.2048是一款益智類小游戲,剛開始隨機(jī)出現(xiàn)兩個(gè)數(shù)字,可以上下左右控制數(shù)字的移動(dòng)。2.當(dāng)選擇一個(gè)方向移動(dòng)后,所有數(shù)字都會(huì)沿該方向移動(dòng)到表格盡頭,并且空余表格會(huì)隨機(jī)出現(xiàn)2或4,當(dāng)碰到相同的兩個(gè)數(shù)字時(shí),該兩個(gè)數(shù)字會(huì)合并相加成一個(gè)數(shù)字,直到最大的數(shù)字變成2048游戲成功3.否則當(dāng)數(shù)字填滿表格且不能再移動(dòng)時(shí)游戲失敗。

游戲代碼:

import java.awt.*;import java.awt.event.*;import java.util.Random;import javax.swing.*;public class Game2048 extends JPanel { enum State { start, won, running, over } final Color[] colorTable = { new Color(0x701710), new Color(0xFFE4C3), new Color(0xfff4d3), new Color(0xffdac3), new Color(0xe7b08e), new Color(0xe7bf8e), new Color(0xffc4c3), new Color(0xE7948e), new Color(0xbe7e56), new Color(0xbe5e56), new Color(0x9c3931), new Color(0x701710) }; final static int target = 2048; static int highest; static int score; private Color gridColor = new Color(0xBBADA0); private Color emptyColor = new Color(0xCDC1B4); private Color startColor = new Color(0xFFEBCD); private Random rand = new Random(); private Tile[][] tiles; private int side = 4; private State gamestate = State.start; private boolean checkingAvailableMoves; public Game2048() { setPreferredSize(new Dimension(900, 700)); setBackground(new Color(0xFAF8EF)); setFont(new Font('SansSerif', Font.BOLD, 48)); setFocusable(true); addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { startGame(); repaint(); } }); addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_UP: moveUp(); break; case KeyEvent.VK_DOWN: moveDown(); break; case KeyEvent.VK_LEFT: moveLeft(); break; case KeyEvent.VK_RIGHT: moveRight(); break; } repaint(); } }); } @Override public void paintComponent(Graphics gg) { super.paintComponent(gg); Graphics2D g = (Graphics2D) gg; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); drawGrid(g); } void startGame() { if (gamestate != State.running) { score = 0; highest = 0; gamestate = State.running; tiles = new Tile[side][side]; addRandomTile(); addRandomTile(); } } void drawGrid(Graphics2D g) { g.setColor(gridColor); g.fillRoundRect(200, 100, 499, 499, 15, 15); if (gamestate == State.running) { for (int r = 0; r < side; r++) { for (int c = 0; c < side; c++) { if (tiles[r][c] == null) { g.setColor(emptyColor); g.fillRoundRect(215 + c * 121, 115 + r * 121, 106, 106, 7, 7); } else { drawTile(g, r, c); } } } } else { g.setColor(startColor); g.fillRoundRect(215, 115, 469, 469, 7, 7); g.setColor(gridColor.darker()); g.setFont(new Font('SansSerif', Font.BOLD, 128)); g.drawString('2048', 310, 270); g.setFont(new Font('SansSerif', Font.BOLD, 20)); if (gamestate == State.won) { g.drawString('you made it!', 390, 350); } else if (gamestate == State.over) g.drawString('game over', 400, 350); g.setColor(gridColor); g.drawString('click to start a new game', 330, 470); g.drawString('(use arrow keys to move tiles)', 310, 530); } } void drawTile(Graphics2D g, int r, int c) { int value = tiles[r][c].getValue(); g.setColor(colorTable[(int) (Math.log(value) / Math.log(2)) + 1]); g.fillRoundRect(215 + c * 121, 115 + r * 121, 106, 106, 7, 7); String s = String.valueOf(value); g.setColor(value < 128 ? colorTable[0] : colorTable[1]); FontMetrics fm = g.getFontMetrics(); int asc = fm.getAscent(); int dec = fm.getDescent(); int x = 215 + c * 121 + (106 - fm.stringWidth(s)) / 2; int y = 115 + r * 121 + (asc + (106 - (asc + dec)) / 2); g.drawString(s, x, y); } private void addRandomTile() { int pos = rand.nextInt(side * side); int row, col; do { pos = (pos + 1) % (side * side); row = pos / side; col = pos % side; } while (tiles[row][col] != null); int val = rand.nextInt(10) == 0 ? 4 : 2; tiles[row][col] = new Tile(val); } private boolean move(int countDownFrom, int yIncr, int xIncr) { boolean moved = false; for (int i = 0; i < side * side; i++) { int j = Math.abs(countDownFrom - i); int r = j / side; int c = j % side; if (tiles[r][c] == null) continue; int nextR = r + yIncr; int nextC = c + xIncr; while (nextR >= 0 && nextR < side && nextC >= 0 && nextC < side) { Tile next = tiles[nextR][nextC]; Tile curr = tiles[r][c]; if (next == null) { if (checkingAvailableMoves) return true; tiles[nextR][nextC] = curr; tiles[r][c] = null; r = nextR; c = nextC; nextR += yIncr; nextC += xIncr; moved = true; } else if (next.canMergeWith(curr)) { if (checkingAvailableMoves) return true; int value = next.mergeWith(curr); if (value > highest) highest = value; score += value; tiles[r][c] = null; moved = true; break; } else break; } } if (moved) { if (highest < target) { clearMerged(); addRandomTile(); if (!movesAvailable()) { gamestate = State.over; } } else if (highest == target) gamestate = State.won; } return moved; } boolean moveUp() { return move(0, -1, 0); } boolean moveDown() { return move(side * side - 1, 1, 0); } boolean moveLeft() { return move(0, 0, -1); } boolean moveRight() { return move(side * side - 1, 0, 1); } void clearMerged() { for (Tile[] row : tiles) for (Tile tile : row) if (tile != null) tile.setMerged(false); } boolean movesAvailable() { checkingAvailableMoves = true; boolean hasMoves = moveUp() || moveDown() || moveLeft() || moveRight(); checkingAvailableMoves = false; return hasMoves; } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setTitle('2048'); f.setResizable(true); f.add(new Game2048(), BorderLayout.CENTER); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); }); }}class Tile { private boolean merged; private int value; Tile(int val) { value = val; } int getValue() { return value; } void setMerged(boolean m) { merged = m; } boolean canMergeWith(Tile other) { return !merged && other != null && !other.merged && value == other.getValue(); } int mergeWith(Tile other) { if (canMergeWith(other)) { value *= 2; merged = true; return value; } return -1; }}

更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經(jīng)典游戲 玩不停

java經(jīng)典小游戲匯總

javascript經(jīng)典小游戲匯總

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: TwistDx恒温扩增-RAA等温-Jackson抗体-默瑞(上海)生物科技有限公司 | 自清洗过滤器-全自动自清洗过反冲洗过滤器 - 中乂(北京)科技有限公司 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 精密冲床,高速冲床等冲压设备生产商-常州晋志德压力机厂 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 北京中创汇安科贸有限公司 | 沈阳激光机-沈阳喷码机-沈阳光纤激光打标机-沈阳co2激光打标机 | 杭州代理记账多少钱-注册公司代办-公司注销流程及费用-杭州福道财务管理咨询有限公司 | 电机保护器-电动机综合保护器-浙江开民 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 全自动过滤器_反冲洗过滤器_自清洗过滤器_量子除垢环_量子环除垢_量子除垢 - 安士睿(北京)过滤设备有限公司 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 123悬赏网_发布悬赏任务_广告任务平台 | 成都APP开发-成都App定制-成都app开发公司-【未来久】 | 湿地保护| 无线遥控更衣吊篮_IC卡更衣吊篮_电动更衣吊篮配件_煤矿更衣吊篮-力得电子 | 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 深圳市东信高科自动化设备有限公司 | 沥青车辙成型机-车托式混凝土取芯机-混凝土塑料试模|鑫高仪器 | 立式硫化罐-劳保用品硫化罐-厂家直销-山东鑫泰鑫硫化罐厂家 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 防腐储罐_塑料储罐_PE储罐厂家_淄博富邦滚塑防腐设备科技有限公司 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 电动葫芦|环链电动葫芦-北京凌鹰名优起重葫芦 | 智慧水务|智慧供排水利信息化|水厂软硬件系统-上海敢创 | 月嫂_保姆_育婴_催乳_母婴护理_产后康复_养老护理-吉祥到家家政 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 直线模组_滚珠丝杆滑台_模组滑台厂家_万里疆科技 | 步入式高低温测试箱|海向仪器 | 软装设计-提供软装装饰和软装配饰及软装陈设的软装设计公司 | 安徽合肥格力空调专卖店_格力中央空调_格力空调总经销公司代理-皖格制冷设备 | 首页-浙江橙树网络技术有限公司 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 亳州网络公司 - 亳州网站制作 - 亳州网站建设 - 亳州易天科技 | 磁棒电感生产厂家-电感器厂家-电感定制-贴片功率电感供应商-棒形电感生产厂家-苏州谷景电子有限公司 | 尚为传动-专业高精密蜗轮蜗杆,双导程蜗轮蜗杆,蜗轮蜗杆减速机,蜗杆减速机生产厂家 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 |