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

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

java實(shí)現(xiàn)2048小游戲(含注釋)

瀏覽:46日期:2022-08-14 18:02:07

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

實(shí)現(xiàn)文件

APP.java

import javax.swing.*;public class APP { public static void main(String[] args) { new MyFrame(); }}類文件

import javax.swing.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Random;//定義自己的類(主類)去繼承JFrame類并實(shí)現(xiàn)KeyListener接口和ActionListener接口public class MyFrame extends JFrame implements KeyListener, ActionListener { //用于存放游戲各位置上的數(shù)據(jù) int[][] data = new int[4][4]; //用于判斷是否失敗 int loseFlag = 1; //用于累計(jì)分?jǐn)?shù) int score = 0; //用于切換主題 String theme = 'A'; //設(shè)置三個(gè)菜單項(xiàng)目 JMenuItem item1 = new JMenuItem('經(jīng)典'); JMenuItem item2 = new JMenuItem('霓虹'); JMenuItem item3 = new JMenuItem('糖果'); //核心方法 public MyFrame(){ //初始化窗口 initFrame(); //初始化菜單 initMenu(); //初始化數(shù)據(jù) initData(); //繪制界面 paintView(); //為窗體提供鍵盤(pán)監(jiān)聽(tīng),該類本身就是實(shí)現(xiàn)對(duì)象 this.addKeyListener(this); //設(shè)置窗體可見(jiàn) setVisible(true); } //窗體初始化 public void initFrame(){ //設(shè)置尺寸 setSize(514,538); //設(shè)置居中 setLocationRelativeTo(null); //設(shè)置總在最上面 setAlwaysOnTop(true); //設(shè)置關(guān)閉方式 setDefaultCloseOperation(3); //設(shè)置標(biāo)題 setTitle('2048小游戲'); //取消默認(rèn)布局 setLayout(null); } //初始化菜單 public void initMenu() { //菜單欄目 JMenuBar menuBar = new JMenuBar(); JMenu menu1 = new JMenu('換膚'); JMenu menu2 = new JMenu('關(guān)于我們'); //添加上menuBar menuBar.add(menu1); menuBar.add(menu2); //添加上menu menu1.add(item1); menu1.add(item2); menu1.add(item3); //注冊(cè)監(jiān)聽(tīng) item1.addActionListener(this); item2.addActionListener(this); item3.addActionListener(this); //添加進(jìn)窗體 super.setJMenuBar(menuBar); } //初始化數(shù)據(jù),在隨機(jī)位置生成兩個(gè)2 public void initData(){ generatorNum(); generatorNum(); } //重新繪制界面的方法 public void paintView(){ //調(diào)用父類中的方法清空界面 getContentPane().removeAll(); //判斷是否失敗 if(loseFlag==2){ //繪制失敗界面 JLabel loseLable = new JLabel(new ImageIcon('D:DownloadBaiDuimage'+theme+'-lose.png')); //設(shè)置位置和高寬 loseLable.setBounds(90,100,334,228); //將該元素添加到窗體中 getContentPane().add(loseLable); } //根據(jù)現(xiàn)有數(shù)據(jù)繪制界面 for(int i=0;i<4;i++) { //根據(jù)位置循環(huán)繪制 for (int j = 0; j < 4; j++) { JLabel image = new JLabel(new ImageIcon('D:DownloadBaiDuimage'+theme+'-'+data[i][j]+'.png')); //提前計(jì)算好位置 image.setBounds(50 + 100 * j, 50+100*i, 100, 100); //將該元素添加進(jìn)窗體 getContentPane().add(image); } } //繪制背景圖片 JLabel background = new JLabel(new ImageIcon('D:DownloadBaiDuimage'+theme+'-Background.jpg')); //設(shè)置位置和高寬 background.setBounds(40,40,420,420); //將該元素添加進(jìn)窗體 getContentPane().add(background); //得分模板設(shè)置 JLabel scoreLable = new JLabel('得分:'+score); //設(shè)置位置和高寬 scoreLable.setBounds(50,20,100,20); //將該元素添加進(jìn)窗體 getContentPane().add(scoreLable); //重新繪制界面 getContentPane().repaint(); } //用不到的但是必須重寫(xiě)的方法,無(wú)需關(guān)注 @Override public void keyTyped(KeyEvent e) {} //鍵盤(pán)被按下所觸發(fā)的方法,在此方法中加入?yún)^(qū)分上下左右的按鍵 @Override public void keyPressed(KeyEvent e) { //keyCode接收按鍵信息 int keyCode = e.getKeyCode(); //左移動(dòng) if(keyCode == 37){ moveToLeft(1); generatorNum(); } //上移動(dòng) else if(keyCode==38){ moveToTop(1); generatorNum(); } //右移動(dòng) else if(keyCode==39){ moveToRight(1); generatorNum(); } //下移動(dòng) else if(keyCode==40){ moveToBottom(1); generatorNum(); } //忽視其他按鍵 else { return; } //檢查是否能夠繼續(xù)移動(dòng) check(); //重新根據(jù)數(shù)據(jù)繪制界面 paintView(); } //左移動(dòng)的方法,通過(guò)flag判斷,傳入1是正常移動(dòng),傳入2是測(cè)試移動(dòng) public void moveToLeft(int flag) { for(int i=0;i<data.length;i++){ //定義一維數(shù)組接收一行的數(shù)據(jù) int[] newArr = new int[4]; //定義下標(biāo)方便操作 int index=0; for(int x=0;x<data[i].length;x++){ //將有數(shù)據(jù)的位置前移 if(data[i][x]!=0){ newArr[index]=data[i][x]; index++; } } //賦值到原數(shù)組 data[i]=newArr; //判斷相鄰數(shù)據(jù)是否相鄰,相同則相加,不相同則略過(guò) for(int x=0;x<3;x++){ if(data[i][x]==data[i][x+1]){ data[i][x]*=2; //如果是正常移動(dòng)則加分 if(flag==1){ score+=data[i][x]; } //將合并后的數(shù)據(jù)都前移,實(shí)現(xiàn)數(shù)據(jù)覆蓋 for(int j=x+1;j<3;j++){ data[i][j]=data[i][j+1]; } //末尾補(bǔ)0 data[i][3]=0; } } } } //右移動(dòng)的方法,通過(guò)flag判斷,傳入1是正常移動(dòng),傳入2是測(cè)試移動(dòng) public void moveToRight(int flag) { //翻轉(zhuǎn)二維數(shù)組 reverse2Array(); //對(duì)旋轉(zhuǎn)后的數(shù)據(jù)左移動(dòng) moveToLeft(flag); //再次翻轉(zhuǎn) reverse2Array(); } //上移動(dòng)的方法,通過(guò)flag判斷,傳入1是正常移動(dòng),傳入2是測(cè)試移動(dòng) public void moveToTop(int flag) { //逆時(shí)針旋轉(zhuǎn)數(shù)據(jù) anticlockwise(); //對(duì)旋轉(zhuǎn)后的數(shù)據(jù)左移動(dòng) moveToLeft(flag); //順時(shí)針還原數(shù)據(jù) clockwise(); } //下移動(dòng)的方法,通過(guò)flag判斷,傳入1是正常移動(dòng),傳入2是測(cè)試移動(dòng) public void moveToBottom(int flag) { //順時(shí)針旋轉(zhuǎn)數(shù)據(jù) clockwise(); //對(duì)旋轉(zhuǎn)后的數(shù)據(jù)左移動(dòng) moveToLeft(flag); //逆時(shí)針旋轉(zhuǎn)還原數(shù)據(jù) anticlockwise(); } //檢查能否左移動(dòng) public boolean checkLeft(){ //開(kāi)辟新二維數(shù)組用于暫存數(shù)據(jù)和比較數(shù)據(jù) int[][] newArr = new int[4][4]; //復(fù)制數(shù)組 copyArr(data,newArr); //測(cè)試移動(dòng) moveToLeft(2); boolean flag = false; //設(shè)置break跳出的for循環(huán)標(biāo)記 lo: for (int i = 0; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { //如果有數(shù)據(jù)不相同,則證明能夠左移動(dòng),則返回true if(data[i][j]!=newArr[i][j]){ flag=true; break lo; } } } //將原本的數(shù)據(jù)還原 copyArr(newArr,data); return flag; } //檢查能否右移動(dòng),與checkLeft()方法原理相似 public boolean checkRight(){ int[][] newArr = new int[4][4]; copyArr(data,newArr); moveToRight(2); boolean flag = false; lo: for (int i = 0; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { if(data[i][j]!=newArr[i][j]){ flag=true; break lo; } } } copyArr(newArr,data); return flag; } //檢查能否上移動(dòng),與checkLeft()方法原理相似 public boolean checkTop(){ int[][] newArr = new int[4][4]; copyArr(data,newArr); moveToTop(2); boolean flag = false; lo: for (int i = 0; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { if(data[i][j]!=newArr[i][j]){ flag=true; break lo; } } } copyArr(newArr,data); return flag; } //檢查能否下移動(dòng),與checkLeft()方法原理相似 public boolean checkBottom(){ int[][] newArr = new int[4][4]; copyArr(data,newArr); moveToBottom(2); boolean flag = false; lo: for (int i = 0; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { if(data[i][j]!=newArr[i][j]){ flag=true; break lo; } } } copyArr(newArr,data); return flag; } //檢查是否失敗 public void check(){ //上下左右均不能移動(dòng) ,則游戲失敗 if(checkLeft()==false&&checkRight()==false&&checkTop()==false&&checkBottom()==false){ loseFlag = 2; } } //復(fù)制二維數(shù)組的方法,傳入原數(shù)組和新數(shù)組 public void copyArr(int[][] src,int[][] dest){ for (int i = 0; i < src.length; i++) { for (int j = 0; j < src[i].length; j++) { //遍歷復(fù)制 dest[i][j]=src[i][j]; } } } //鍵盤(pán)被松開(kāi) @Override public void keyReleased(KeyEvent e) {} //翻轉(zhuǎn)一維數(shù)組 public void reverseArray(int[] arr){ for(int start=0,end=arr.length-1;start<end;start++,end--){ int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; } } //翻轉(zhuǎn)二維數(shù)組 public void reverse2Array(){ for (int i = 0; i < data.length; i++) { reverseArray(data[i]); } } //順時(shí)針旋轉(zhuǎn) public void clockwise(){ int[][] newArr = new int[4][4]; for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ //找規(guī)律啦~ newArr[j][3-i] = data[i][j]; } } data = newArr; } //逆時(shí)針旋轉(zhuǎn) public void anticlockwise(){ int[][] newArr = new int[4][4]; for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ //規(guī)律 newArr[3-j][i] = data[i][j]; } } data = newArr; } //空位置隨機(jī)生成2 public void generatorNum(){ int[] arrarI = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; int[] arrarJ = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; int w=0; for (int i = 0; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { if(data[i][j]==0){ //找到并存放空位置 arrarI[w]=i; arrarJ[w]=j; w++; } } } if(w!=0){ //隨機(jī)數(shù)找到隨機(jī)位置 Random r= new Random(); int index = r.nextInt(w); int x = arrarI[index]; int y = arrarJ[index]; //空位置隨機(jī)生成2 data[x][y]=2; } } //換膚操作 @Override public void actionPerformed(ActionEvent e) { //接收動(dòng)作監(jiān)聽(tīng), if(e.getSource()==item1){ theme = 'A'; }else if(e.getSource()==item2){ theme = 'B'; }else if(e.getSource()==item3){ theme = 'C'; } //換膚后重新繪制 paintView(); }} //測(cè)試失敗效果的數(shù)據(jù) /*int[][] data = { {2,4,8,4}, {16,32,64,8}, {128,2,256,2}, {512,8,1024,2048} };*/運(yùn)行效果

java實(shí)現(xiàn)2048小游戲(含注釋)

java實(shí)現(xiàn)2048小游戲(含注釋)

java實(shí)現(xiàn)2048小游戲(含注釋)

java實(shí)現(xiàn)2048小游戲(含注釋)

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

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91九色综合| 日韩av资源网| 日韩精品亚洲专区| 噜噜噜躁狠狠躁狠狠精品视频 | 新版的欧美在线视频| 综合色就爱涩涩涩综合婷婷| 亚洲天堂一区二区| 999久久久91| 99久久亚洲精品蜜臀| 国产九一精品| 久久国内精品自在自线400部| 亚洲婷婷丁香| 日本a口亚洲| 免费一级欧美在线观看视频| 老司机精品视频网| 最新中文字幕在线播放| 高清一区二区| 久久天堂av| 日韩视频一区二区三区在线播放免费观看| 香蕉人人精品| 夜夜嗨一区二区| 日韩有码av| 麻豆成人91精品二区三区| 麻豆久久久久久久| 免费日韩一区二区三区| 国产成人在线中文字幕| 久久久久午夜电影| av亚洲在线观看| 97久久精品| 成人日韩在线| 青青草精品视频| 日韩在线欧美| 亚洲黄色在线| 亚洲综合色婷婷在线观看| 国产精品手机在线播放| 国产 日韩 欧美 综合 一区| 日韩中文在线电影| 男人天堂欧美日韩| 美女av一区| 91tv亚洲精品香蕉国产一区| 久久国产精品久久w女人spa| 日韩av在线播放中文字幕| 日本视频在线一区| 亚洲精品电影| 精品香蕉视频| 鲁大师影院一区二区三区| 欧美精品aa| 99在线精品免费视频九九视| 国产精品自拍区| 婷婷激情图片久久| 精品一区二区三区中文字幕 | 日韩福利视频一区| 日本蜜桃在线观看视频| 亚洲乱亚洲高清| 亚洲午夜av| 中文字幕一区二区三区四区久久| 中文在线免费视频| 国产一区二区久久久久| 欧美亚洲免费| 亚洲精品系列| 欧美精品一线| 亚洲高清不卡| 蜜桃成人精品| 人在线成免费视频| 国产成人久久| 国产午夜久久av| 好看的亚洲午夜视频在线| 国产精品最新| 精品日韩毛片| 成人午夜在线| 亚洲午夜免费| 日本欧美一区二区在线观看| 你懂的亚洲视频| 免费久久精品| 国产亚洲久久| 91久久视频| 精品午夜视频| 黄色aa久久| 91成人网在线观看| 日韩中文字幕一区二区三区| 日韩一区二区三区在线看| 欧美日韩精品一区二区三区视频| 国产美女一区| 亚洲一区二区毛片| 日韩不卡在线观看日韩不卡视频| 国产毛片精品| 国产精品高清一区二区| 国产va在线视频| 女同性一区二区三区人了人一 | 日韩激情精品| 久久久免费人体| 亚洲成av在线| 日韩精品久久久久久| 精品三级在线| 亚洲一区日本| 丝袜美腿成人在线| 国产欧美精品久久| 欧美91在线| 只有精品亚洲| 美女毛片一区二区三区四区| 国产精品v日韩精品v欧美精品网站 | 国产伊人久久| 免费av一区二区三区四区| 国产精品**亚洲精品| 国产精品免费看| 伊伊综合在线| 福利精品在线| 国产精品九九| 日韩激情啪啪| 中文不卡在线| 亚洲少妇自拍| 欧美日韩水蜜桃| 国产在线一区不卡| 欧美一级一区| 蜜桃久久精品一区二区| 日韩视频免费| 蜜桃tv一区二区三区| 麻豆精品久久久| 国产精品v亚洲精品v日韩精品| 日本色综合中文字幕| 久久不射中文字幕| 国产精品呻吟| 国产视频欧美| 日韩国产欧美在线播放| 亚洲伦乱视频| 无码日韩精品一区二区免费| 国内精品伊人| 亚洲精品综合| 久久高清精品| 91亚洲无吗| 国产精品红桃| 亚洲小说欧美另类婷婷| 自拍日韩欧美| 欧美亚洲tv| 欧美日韩一区二区综合 | 亚洲网站视频| 奇米狠狠一区二区三区| 国产 日韩 欧美一区| 免费日韩av| 欧美1区2区3| 涩涩av在线| 一本一本久久| 欧美亚洲国产日韩| 欧美日韩国产综合网| 免费视频久久| 97精品在线| 国产精品视频一区二区三区四蜜臂 | 日韩欧美一区二区三区在线观看| 婷婷综合激情| 免费看精品久久片| 亚洲精品乱码久久久久久蜜桃麻豆| 好看的av在线不卡观看| 韩国三级一区| 国产精一区二区| 欧美日韩色图| 日韩三级久久| 久久精品国产99国产| 午夜在线一区| 日韩福利视频一区| 国产福利片在线观看| av亚洲一区二区三区| 国产精品成人自拍| 水蜜桃久久夜色精品一区| 日韩一区亚洲二区| 蜜桃久久久久久| 性欧美videohd高精| 免费人成黄页网站在线一区二区| 国产激情欧美| 夜夜嗨一区二区三区| 成人va天堂| 日本不卡视频一二三区| 成人免费电影网址| 亚洲精品少妇| 免播放器亚洲| 久久久久黄色| 日韩精品a在线观看91| 精品欧美久久| 国产激情精品一区二区三区| 樱桃成人精品视频在线播放| 日韩成人a**站| 久久这里只有| 人人爱人人干婷婷丁香亚洲| 日韩视频免费| 久久中文字幕av| 欧美日韩精品一本二本三本| 精品美女在线视频| 日韩在线视频一区二区三区| 国产一区二区三区天码| 国内不卡的一区二区三区中文字幕| 免费视频一区二区| 女人天堂亚洲aⅴ在线观看| 日韩欧美一区二区三区在线视频| 日本在线精品| 成人日韩在线| 欧美日韩尤物久久| 亚洲香蕉网站| 欧美aa国产视频| 欧美成人综合| re久久精品视频| 日韩午夜视频在线|