最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java版實現(xiàn)2048游戲功能

 更新時間:2020年04月18日 14:21:26   作者:迷失的小菜包  
這篇文章主要為大家詳細介紹了java版實現(xiàn)2048游戲功能,相加數(shù)字出現(xiàn)2048即可,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

功能要求:2048的基本界面,能夠?qū)崿F(xiàn)2048的游戲功能。

總思路:兩個類:Game和GameListener。

Game負責界面的實現(xiàn)和paint方法的重寫

GameListener負責實現(xiàn)鍵盤和鼠標事件的處理。移動方法,相加方法,輸贏判斷和隨機數(shù)的出現(xiàn)都要在鍵盤監(jiān)聽的方法中實現(xiàn)。

實現(xiàn)分析:要實現(xiàn)2048游戲,首先需要考慮2048都有些什么?

界面實現(xiàn):

2048的游戲界面很簡單,就是一些方格和數(shù)字。要實現(xiàn)這樣的界面,我們可以考慮一下使用Java的繪圖功能。具體來說就是使用JFrame類提供的Graphics對象進行繪圖。2048界面由一個大的矩形背景和包含數(shù)字的許多小方塊組成。Graphics對象的繪制矩形的方法就能實現(xiàn)背景和小方格的繪制。小方格內(nèi)的數(shù)字則可以使用graphics的drawString方法來繪制。只需要在繪制的時候注意一下顏色就好。界面實現(xiàn)要擁到的類主要是JFrame類。

基本界面實現(xiàn)代碼,不過是一些按鈕之類的,沒什么好說的。

private void initUI() {
 setTitle("2048");
 setDefaultCloseOperation(3);
 setSize(600, 700);
 setLocationRelativeTo(null);
 this.setLayout(null);
 //添加分數(shù)
 jl2 = new JLabel("分數(shù):0");
 jl2.setFont(new Font("黑體", Font.BOLD, 30));
 jl2.setBounds(20, 30, 200, 50);
 this.add(jl2);
 //添加開始按鈕
 ImageIcon start=new ImageIcon("res/start.png");//開始游戲圖標,隨意替換就好
 startJB=new JButton(start);
 startJB.setBounds(280, 40, 120, 30);
 startJB.setFocusable(false);
 startJB.setBorderPainted(false);//設置按鈕的邊框為空
 startJB.setFocusPainted(false);
 startJB.setContentAreaFilled(false);//設置按鈕的邊框內(nèi)填充顏色
 
 //添加退一步按鈕
 ImageIcon back=new ImageIcon("res/backicon.png");//游戲結束圖標,隨意替換就好
 backJB=new JButton(back);
 backJB.setBounds(430, 40, 120, 30);
 backJB.setFocusable(false);
 backJB.setBorderPainted(false);
 backJB.setFocusPainted(false);
 backJB.setContentAreaFilled(false);
 
 this.add(startJB);
 this.add(backJB);
 setVisible(true);
 GameListener gl = new GameListener(this, arry, jl2,startJB,backJB);
 addKeyListener(gl);
 startJB.addActionListener(gl);
 backJB.addActionListener(gl);
 }

方格和數(shù)字的繪制:

方格和數(shù)字的繪制同樣是使用JFrame的畫布對象的繪制矩形的方法實現(xiàn)。

public void buffPaint(Graphics g) {
 Image image = createImage(600, 600);
 Graphics g2 = image.getGraphics();
 g2.setColor(Color.LIGHT_GRAY);
 Graphics2D g2d = (Graphics2D) g2;
 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
  RenderingHints.VALUE_ANTIALIAS_ON);
 g2.fillRoundRect(0, 0, Draw2048.RD, Draw2048.RD, 20, 20);
 g2.setColor(Color.GRAY);
 for (int r = 0; r < arry.length; r++) {
  for (int c = 0; c < arry[r].length; c++) {
  g2.fillRect(20 + c * (Draw2048.D + Draw2048.space), 20 + r
   * (Draw2048.D + Draw2048.space), Draw2048.D, Draw2048.D);
  }
 }
 for (int r = 0; r < arry.length; r++) {
  for (int c = 0; c < arry[r].length; c++) {
  if (arry[r][c] != 0) {
   g2.setColor(255, 250, 240);
   g2.fillRect(20 + c * (Draw2048.D + Draw2048.space), 20 + r
    * (Draw2048.D + Draw2048.space), Draw2048.D,
    Draw2048.D);
   g2.setColor(new Color(0, 191, 255));
   g2.setFont(new Font("楷體", Font.BOLD, Draw2048.FSIZE));
   g2.drawString(arry[r][c] + "", 50 + c
    * (Draw2048.D + Draw2048.space), 90 + r
    * (Draw2048.D + Draw2048.space));
  }
  }
 }
 g.drawImage(image, 50, 150, this);
 }

Draw2048是一個接口,里面定義了關于方格繪制的相關常量,D方格邊長,space方格間間隔。RD背景大矩形的邊長。使用接口的好處就是使得界面的更改(如改成5*5的格子)可以更加方便的實現(xiàn),提高程序的擴展性。另外界面需要不斷的更新,所以要調(diào)用paint方法不斷的重繪。如果直接把這里的繪制寫在paint方法中,不斷的重繪會使得界面一直在閃爍。這里的解決方案就是使用圖片緩沖,先在圖片中繪制好,在把圖片一次性繪制出來,這樣就不會出現(xiàn)界面的閃爍問題了。

移動實現(xiàn):

要想讓方格移動起來,可以考慮的方法就是使用畫板的重繪。方格內(nèi)的數(shù)字則使用一個二維數(shù)組來保存。每次移動就讓數(shù)組的值發(fā)生變化就行,然后根據(jù)數(shù)組的值把數(shù)據(jù)繪制到界面上。當然玩游戲時總不能靠意念操控,我們需要有輸入設備,也就是鍵盤。所以需要給界面加上鍵盤監(jiān)聽。當用戶按下不同的鍵則實現(xiàn)不同的移動算法。值得注意的是,在監(jiān)聽類中編寫相應的移動算法的時候要理清循環(huán)的使用和結束(尤其是break語句的使用),否則會出現(xiàn)各種各樣的bug。移動實現(xiàn)是需要用到keyListener類。

下面是向上移動的實現(xiàn),其他方向的移動都差不多,自己琢磨一下就好:

//向上移動的算法
for (int r = 0; r < arry.length; r++) 
  for (int c = 0; c < arry[r].length; c++) {
   if (arry[r][c] > max)//找出數(shù)組最大值,用于判斷玩家的方塊是否達到2048
   max = arry[r][c];
   if (arry[r][c] == 0) {
   for (int r1 = r + 1; r1 < arry[c].length; r1++) 
    if (arry[r1][c] != 0) {
    arry[r][c] = arry[r1][c];
    arry[r1][c] = 0;
    count++;//判斷是否發(fā)生移動,并且作為輸贏判斷的標準之一
    break;
    }
     }
  }

通過雙層循環(huán),循環(huán)每一個值,如果它為0,則可以往上移動。遍歷該值所在列,找到第一個不為0的值,移動這個值(即交換兩個數(shù)的值)。移動后退出內(nèi)層循環(huán),繼續(xù)遍歷下一個值。

數(shù)字的相加:

使用獨立的算法遍歷數(shù)組,在移動方向上的相鄰數(shù)兩個相加,然后一個置為0。這里的算法實現(xiàn)和移動的算法十分相像,需要注意的地方同樣也是break和循環(huán)的使用。還有一個要注意的就是:數(shù)字的相加要放在數(shù)字移動之前來完成,否則會出現(xiàn)移動后的數(shù)字空格。

//向左的相加算法
for (int r = 0; r < arry.length; r++)
 for (int c = 0; c < arry[r].length; c++)
 if (arry[r][c] != 0)
  for (int c1 = c + 1; c1 < arry[r].length; c1++)
  if (arry[r][c] == arry[r][c1]) {
   arry[r][c] *= 2;
   score += arry[r][c];
   arry[r][c1] = 0;
   count++;//判斷是否發(fā)生相加,并作為輸贏判斷條件之一。
   break;
   } else if (arry[r][c1] != 0) {
   break;
   }

同樣是遍歷數(shù)組的每一個值,如果這個值不為0,則找所在行的相鄰的相同的值相加,結束最內(nèi)層循環(huán)。如果相鄰的兩個值不同,也結束最內(nèi)層循環(huán)。兩個break語句的使用,避免了數(shù)字之間的跳躍相加。

輸贏的判斷:

2048的贏的規(guī)則是,相加數(shù)字出現(xiàn)2048,所以只需要判斷數(shù)組中是否有一個數(shù)字等于2048就行,如果有,就輸出相應的獲勝信息。

2048的輸?shù)囊?guī)則是,界面已經(jīng)滿(數(shù)組已滿,且無可移動,相加的數(shù)字)。個人的判斷方法是全局變量count加上判斷數(shù)組是否已滿。count如果等于0,則表示無法移動和相加,配合數(shù)組已滿的條件就能判斷玩家已經(jīng)輸了。

隨機數(shù)字的出現(xiàn):

隨機數(shù)字出現(xiàn)的條件是發(fā)生移動或者相加,所以判斷然讓使用count。條件成立則調(diào)用相應算法實現(xiàn)。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java實現(xiàn)去重的方法詳解

    Java實現(xiàn)去重的方法詳解

    austin支持兩種去重的類型:N分鐘相同內(nèi)容達到N次去重和一天內(nèi)N次相同渠道頻次去重,這篇文章就來和大家講講這兩種去重的具體實現(xiàn),需要的可以參考一下
    2023-06-06
  • SpringBoot集成Mybatis過程步驟圖解

    SpringBoot集成Mybatis過程步驟圖解

    這篇文章主要介紹了SpringBoot集成Mybatis過程步驟圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Java實現(xiàn)把圖片處理到指定大小的操作方法

    Java實現(xiàn)把圖片處理到指定大小的操作方法

    項目開發(fā)中,經(jīng)常遇到圖片上傳功能,發(fā)現(xiàn)如果圖片比較大時,在查看、預覽、下載速度會特別慢,考慮到浪費流量以及文件服務器的存儲空間,決定在后端優(yōu)化處理完再上傳,所以本文給大家介紹了使用Java把圖片處理到指定大小的操作方法,需要的朋友可以參考下
    2025-03-03
  • JavaWeb建立簡單三層項目步驟圖解

    JavaWeb建立簡單三層項目步驟圖解

    這篇文章主要介紹了JavaWeb建立簡單三層項目步驟圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • JavaWeb中Struts2攔截器深入分析(一)

    JavaWeb中Struts2攔截器深入分析(一)

    這篇文章主要為大家詳細介紹了JavaWeb中Struts2攔截器的功能,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 徹底解決Spring MVC中文亂碼問題的方案

    徹底解決Spring MVC中文亂碼問題的方案

    這篇文章主要介紹了徹底解決Spring MVC中文亂碼問題的方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • RabbitMQ消息隊列實現(xiàn)延遲任務示例

    RabbitMQ消息隊列實現(xiàn)延遲任務示例

    這篇文章主要為大家介紹了RabbitMQ消息隊列實現(xiàn)延遲任務示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • MyBatisPlus 封裝分頁方法示例

    MyBatisPlus 封裝分頁方法示例

    本文主要介紹了基于MybatisPlus的分頁插件封裝,包括分頁結果對象、查詢對象的封裝,以及對象轉換處理,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • 在IDEA使用中directory和package的操作

    在IDEA使用中directory和package的操作

    這篇文章主要介紹了在IDEA使用中directory和package的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 最新log4j2遠程代碼執(zhí)行漏洞(附解決方法)

    最新log4j2遠程代碼執(zhí)行漏洞(附解決方法)

    Apache?Log4j2?遠程代碼執(zhí)行漏洞攻擊代碼,該漏洞利用無需特殊配置,經(jīng)多方驗證,Apache?Struts2、Apache?Solr、Apache?Druid、Apache?Flink等均受影響,本文就介紹一下解決方法
    2021-12-12

最新評論

新乡市| 武威市| 绥棱县| 美姑县| 泾源县| 拉孜县| 望奎县| 镶黄旗| 轮台县| 鄂托克前旗| 册亨县| 六枝特区| 西吉县| 南岸区| 宜阳县| 慈利县| 平果县| 平舆县| 高阳县| 武胜县| 金坛市| 九龙城区| 仁寿县| 奈曼旗| 温泉县| 金乡县| 胶州市| 固原市| 商河县| 大厂| 凤阳县| 伊宁市| 交口县| 上饶市| 邻水| 房山区| 青阳县| 乐业县| 巴青县| 景宁| 汽车|