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 }

 

posted @ 2016-08-06 17:49  A_book  阅读(1310)  评论(0编辑  收藏  举报