JAVA-小青蛙跳石頭游戲

来源:http://www.cnblogs.com/ABook/archive/2016/08/06/5744573.html
-Advertisement-
Play Games

游戲摘自微信傳的手機網頁版小游戲,我拿來做成了JAVA的界面版,但是沒有去做素材,,直接拿方塊代替小青蛙。游戲原址就不分享了,只能在手機上打開。 下麵是源碼: ...


 游戲摘自微信傳的手機網頁版小游戲,我拿來做成了JAVA的界面版,但是沒有去做素材,,直接拿方塊代替小青蛙。游戲原址就不分享了,只能在手機上打開。

下麵是源碼:

  1 /*
  2  * Main.java
  3  * */
  4 
  5 import java.awt.Color;
  6 import java.awt.Graphics;
  7 import java.awt.event.KeyAdapter;
  8 import java.awt.event.KeyEvent;
  9 import java.awt.event.MouseAdapter;
 10 import java.awt.event.MouseEvent;
 11 import java.awt.event.WindowAdapter;
 12 import java.awt.event.WindowEvent;
 13 import java.text.DateFormat;
 14 import java.text.ParseException;
 15 import java.text.SimpleDateFormat;
 16 import java.util.Date;
 17 
 18 import javax.swing.JFrame;
 19 
 20 public class Main extends JFrame {
 21     /**
 22      * 過關移動順序 3、4、5、3、2、1 4、5、6、3、2、1 5、6、1
 23      */
 24     public static final int GAME_WIDTH = 420; // 界面寬
 25     public static final int GAME_HEIGTH = 150; // 界面高
 26     public static final int GAME_X = 400; // 界面位置
 27     public static final int GAME_Y = 250;
 28     public DateFormat format = new SimpleDateFormat("mm:ss"); // 時間格式
 29     public String StartDate = new String(); // 起始時間
 30     public String EndtDate = new String(); // 當前時間
 31     public long times;
 32     Frog f = new Frog(this); // 青蛙類
 33 
 34     public static void main(String[] args) {
 35         Main m = new Main();
 36         m.lauchFrame(); // 初始化界面
 37     }
 38 
 39     private void lauchFrame() {
 40         // TODO Auto-generated method stub
 41         Date date = new Date();
 42         StartDate = format.format(date);
 43         EndtDate = format.format(date);
 44         this.setLocation(GAME_X, GAME_Y); // 視窗初始坐標點
 45         this.setSize(GAME_WIDTH, GAME_HEIGTH); // 視窗初始大小
 46         this.setTitle("Frog"); // 視窗名稱
 47         /* 視窗監聽 */
 48         this.addWindowListener(new WindowAdapter() {
 49             @Override
 50             /* 點退出叉之後運行 */
 51             public void windowClosing(WindowEvent e) {
 52                 // TODO Auto-generated method stub
 53                 System.exit(0); // 退出
 54             }
 55         });
 56         this.addMouseListener(new Mouse()); // 添加滑鼠監聽事件
 57         this.addKeyListener(new Key()); // 添加鍵盤監聽事件
 58         this.setVisible(true); // 設置視窗顯現
 59         this.setResizable(false); // 設置視窗不可改變大小
 60         this.getContentPane().setBackground(Color.white); // 界面背景白色
 61         new Thread(new PaintThread()).start(); // 開始運行PaintThread類run->repaint->paint
 62     }
 63 
 64     public void paint(Graphics g) {
 65         super.paint(g);
 66         for (int i = 1; i < 8; i++) {
 67             g.drawRect(i * 50 - 5, 45, 30, 30);// 畫出方框
 68         }
 69         f.Draw(g); // 畫方塊
 70         /* 顯示時間以及提示說明 */
 71         try {
 72             times = format.parse(EndtDate).getTime() - format.parse(StartDate).getTime();
 73             g.drawString("時間:" + format.format(new Date(times)).toString(), 250, 40);
 74         } catch (ParseException e) {
 75             // TODO Auto-generated catch block
 76             e.printStackTrace();
 77         }
 78         g.drawString("F2鍵重新開始", 100, 40);
 79         g.drawString("規則:1、點擊方塊跳動", 85, 100);
 80         g.drawString("2、方塊不能向後跳,最多只能跳過1個方塊", 120, 115);
 81         g.drawString("3、使左右兩邊方塊交換位置即可勝利", 120, 130);
 82     }
 83 
 84     /* 線程主要做時間和界面刷新 */
 85     private class PaintThread implements Runnable {
 86 
 87         @Override
 88         public void run() {
 89             // TODO Auto-generated method stub
 90             while (true) {
 91                 repaint(); // 刷新界面
 92                 Date date = new Date();
 93                 EndtDate = format.format(date); // 重新獲取當前時間
 94                 try {
 95                     Thread.sleep(1000); // 時隔1s
 96                 } catch (Exception e) {
 97                     e.printStackTrace();
 98                 }
 99             }
100         }
101     }
102 
103     /* 鍵盤監聽;調用方塊類的鍵盤釋放監聽 */
104     public class Key extends KeyAdapter {
105 
106         @Override
107         public void keyReleased(KeyEvent e) {
108             // TODO Auto-generated method stub
109             super.keyReleased(e);
110             f.keyReleased(e);
111         }
112 
113     }
114 
115     /* 滑鼠監聽;調用方塊類的滑鼠單擊監聽 */
116     public class Mouse extends MouseAdapter {
117 
118         @Override
119         public void mouseClicked(MouseEvent e) {
120             // TODO Auto-generated method stub
121             super.mouseClicked(e);
122             f.mouseClicked(e);
123         }
124     }
125 }
  1 /*
  2  * Frog.java
  3  * */
  4 import java.awt.Color;
  5 import java.awt.Graphics;
  6 import java.awt.event.KeyEvent;
  7 import java.awt.event.MouseEvent;
  8 import java.util.ArrayList;
  9 import java.util.Date;
 10 import java.util.List;
 11 
 12 import javax.swing.JOptionPane;
 13 
 14 public class Frog {
 15     /* 方塊類 */
 16     private class F {
 17         public int x, y; // 方塊的坐標
 18         public boolean good; // 判斷兩方陣營
 19         public boolean have; // 判斷是否顯現這個方塊(7個位置只顯示6個)
 20 
 21         public F(int x, int y, boolean good, boolean have) {
 22             super();
 23             // TODO Auto-generated constructor stub
 24             this.x = x;
 25             this.y = y;
 26             this.good = good;
 27             this.have = have;
 28         }
 29     }
 30 
 31     private static final int FROG_WIGTH = 20; // 方塊大小
 32     private static final int FROG_HEIGTH = 20;
 33     private static final int GAME_FROG_NUMBER = 7; // 游戲方塊數量
 34     private static final int FROG_X = 50; // 位置基址
 35     private static final int FROG_Y = 50;
 36     List<F> frog = new ArrayList<F>(); // 方塊集合
 37     private Main m;
 38 
 39     public Frog(Main m) {
 40         InitFrog();// 初始化集合
 41         this.m = m;
 42     }
 43 
 44     private void InitFrog() {
 45         for (int i = 1; i <= GAME_FROG_NUMBER; i++) {
 46             if (i <= GAME_FROG_NUMBER / 2)
 47                 frog.add(new F(FROG_X * i, FROG_Y, true, true));
 48             else if (i == GAME_FROG_NUMBER / 2 + 1)
 49                 frog.add(new F(FROG_X * i, FROG_Y, true, false));
 50             else
 51                 frog.add(new F(FROG_X * i, FROG_Y, false, true));
 52         }
 53     }
 54 
 55     public void Draw(Graphics g) {
 56         Color c = g.getColor(); // 獲取當前畫筆顏色
 57         for (int i = 0; i < GAME_FROG_NUMBER; i++) {
 58             if (frog.get(i).have) {
 59                 if (frog.get(i).good) // 兩邊分出顏色
 60                     g.setColor(Color.BLUE);
 61                 else
 62                     g.setColor(Color.RED);
 63                 g.fillRect(frog.get(i).x, frog.get(i).y, FROG_WIGTH, FROG_HEIGTH);// 相應位置畫出方塊
 64             }
 65         }
 66         g.setColor(c);
 67     }
 68 
 69     public boolean Over() {
 70         for (int i = 0; i < GAME_FROG_NUMBER; i++) {
 71             if (i < GAME_FROG_NUMBER / 2) {
 72                 if (frog.get(i).good)
 73                     return false;
 74             } else if (i == GAME_FROG_NUMBER / 2) {
 75                 if (frog.get(i).have)
 76                     return false;
 77             } else {
 78                 if (!frog.get(i).good)
 79                     return false;
 80             }
 81         }
 82         return true;
 83     }
 84 
 85     public void reset() {
 86         frog.removeAll(frog);
 87         InitFrog();
 88         m.repaint();
 89         Date date = new Date();
 90         m.StartDate = m.format.format(date);
 91         m.EndtDate = m.format.format(date);
 92     }
 93 
 94     /* 滑鼠單擊監聽;方塊移動演算法 */
 95     public void mouseClicked(MouseEvent e) {
 96         int x = e.getX();
 97         int y = e.getY();
 98         if (y > 50 && y < 70 && x % 50 <= 20) {
 99             x /= 50;
100             x -= 1;
101             if (frog.get(x).have) {
102                 if (frog.get(x).good) {
103                     if (x < GAME_FROG_NUMBER - 1)
104                         if (frog.get(x + 1).have) {
105                             if (x < GAME_FROG_NUMBER - 2) {
106                                 if (!frog.get(x + 2).have) {
107                                     frog.set(x, new F(FROG_X * (x + 1), FROG_Y, true, false));
108                                     frog.set(x + 2, new F(FROG_X * (x + 3), FROG_Y, true, true));
109                                 }
110                             }
111                         } else {
112                             frog.set(x, new F(FROG_X * (x + 1), FROG_Y, true, false));
113                             frog.set(x + 1, new F(FROG_X * (x + 2), FROG_Y, true, true));
114                         }
115                 } else {
116                     if (x > 0)
117                         if (frog.get(x - 1).have) {
118                             if (x > 1) {
119                                 if (!frog.get(x - 2).have) {
120                                     frog.set(x, new F(FROG_X * (x + 1), FROG_Y, false, false));
121                                     frog.set(x - 2, new F(FROG_X * (x - 1), FROG_Y, false, true));
122                                 }
123                             }
124                         } else {
125                             frog.set(x, new F(FROG_X * (x + 1), FROG_Y, false, false));
126                             frog.set(x - 1, new F(FROG_X * x, FROG_Y, false, true));
127                         }
128                 }
129             }
130         }
131         m.repaint();
132         if (Over()) {
133             Object[] o = { "OK", "CANCEL" };
134             if (JOptionPane.showOptionDialog(null, "完成游戲\n你所用時間:" + "" + m.format.format(new Date(m.times)).toString(),
135                     "游戲結束", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, o,
136                     o[0]) == JOptionPane.YES_OPTION) {
137                 System.exit(0);
138             } else {
139                 reset();
140             }
141         }
142 
143     }
144 
145     /* 鍵盤釋放監聽;重置用 */
146     public void keyReleased(KeyEvent e) {
147         int key = e.getKeyCode();
148         switch (key) {
149         case KeyEvent.VK_F2:
150             reset();
151             break;
152         }
153     }
154 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 項目架構採用:Asp.Net MVC4.0 + EntityFramework6.0 code first + AutoMapper + Unity(IOC) + SqlServer2012 項目地址:www.xiaoboke.net 這個博客會不斷開發完善哦 歡迎大家去吐槽和提建議,一起學習,一起 ...
  • 使用自動載入和解析url的參數,實現調用到不同的控制器,實現了pathinfo模式和普通的url模式 文件結構: |--Controller |--Index |--Index.php |--Application.php Application.php \Controller\Index\Inde ...
  • 前言:在javaweb開發中自定義標簽的用處還是挺多的。今天和大家一起看自定義標簽是如何實現的。 1:什麼是標簽 標簽是一種XML元素,通過標簽可以使JSP頁面變得簡介易用,而且標簽具有很好的復用性。 2:自定義標簽的標簽庫主要的介面以及類的繼承實現關係圖 3:一步步實現自定義標簽 3.1:Tag接 ...
  • rest api的參數想即能支持application/x-www-form-urlencoded也能支持application/json方式傳參。 ...
  • 一、Hibernate中的關聯關係 1.1、單向一對多關聯關係 按照以下步驟配置hibernate中持久化類的一對多對象關聯: (1).持久化類添加關聯類的相關屬性及getter/setter方法。 (2).映射文件中建立該屬性和資料庫表欄位的映射信息。 比如班級對學生是一對多的關係,班級類Grad ...
  • scala除了方法外還支持函數,方法是對對象進行操作,而函數不是。(類型與java中靜態方法,媽蛋,好歹也寫過C和C++這還理解不深刻了)。除此之外,寫法一樣。 object add{ //指定返回值類型,返回的值不需要使用return指定,會取最後一個表達式的值。 def abs(x:Double ...
  • 冒泡排序 冒泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。 冒泡排序演算法的運作如下:(從後往前) l 依次比較相鄰的兩個元素,消除逆序(逆序是數學上的概念,是成對出現的,比如50,30就是一對逆序,所謂的消除逆序,就是大的放後面,小的放前面) l 這樣,一輪比較下來,最大 ...
  • 經常malloc, 然後if ptr == NULL 這種操作, 實在是受不了了. 抄了雲風的代碼,構建了一個 記憶體統一申請釋放的介面操作. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...