游戏摘自微信传的手机网页版小游戏,我拿来做成了JAVA的界面版,但是没有去做素材,,直接拿方块代替小青蛙。游戏原址就不分享了,只能在手机上打开。

下面是源码:

 /*
* Main.java
* */ import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.swing.JFrame; public class Main extends JFrame {
/**
* 过关移动顺序 3、4、5、3、2、1 4、5、6、3、2、1 5、6、1
*/
public static final int GAME_WIDTH = 420; // 界面宽
public static final int GAME_HEIGTH = 150; // 界面高
public static final int GAME_X = 400; // 界面位置
public static final int GAME_Y = 250;
public DateFormat format = new SimpleDateFormat("mm:ss"); // 时间格式
public String StartDate = new String(); // 起始时间
public String EndtDate = new String(); // 当前时间
public long times;
Frog f = new Frog(this); // 青蛙类 public static void main(String[] args) {
Main m = new Main();
m.lauchFrame(); // 初始化界面
} private void lauchFrame() {
// TODO Auto-generated method stub
Date date = new Date();
StartDate = format.format(date);
EndtDate = format.format(date);
this.setLocation(GAME_X, GAME_Y); // 窗口初始坐标点
this.setSize(GAME_WIDTH, GAME_HEIGTH); // 窗口初始大小
this.setTitle("Frog"); // 窗口名称
/* 窗口监听 */
this.addWindowListener(new WindowAdapter() {
@Override
/* 点退出叉之后运行 */
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0); // 退出
}
});
this.addMouseListener(new Mouse()); // 添加鼠标监听事件
this.addKeyListener(new Key()); // 添加键盘监听事件
this.setVisible(true); // 设置窗口显现
this.setResizable(false); // 设置窗口不可改变大小
this.getContentPane().setBackground(Color.white); // 界面背景白色
new Thread(new PaintThread()).start(); // 开始运行PaintThread类run->repaint->paint
} public void paint(Graphics g) {
super.paint(g);
for (int i = 1; i < 8; i++) {
g.drawRect(i * 50 - 5, 45, 30, 30);// 画出方框
}
f.Draw(g); // 画方块
/* 显示时间以及提示说明 */
try {
times = format.parse(EndtDate).getTime() - format.parse(StartDate).getTime();
g.drawString("时间:" + format.format(new Date(times)).toString(), 250, 40);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
g.drawString("F2键重新开始", 100, 40);
g.drawString("规则:1、点击方块跳动", 85, 100);
g.drawString("2、方块不能向后跳,最多只能跳过1个方块", 120, 115);
g.drawString("3、使左右两边方块交换位置即可胜利", 120, 130);
} /* 线程主要做时间和界面刷新 */
private class PaintThread implements Runnable { @Override
public void run() {
// TODO Auto-generated method stub
while (true) {
repaint(); // 刷新界面
Date date = new Date();
EndtDate = format.format(date); // 重新获取当前时间
try {
Thread.sleep(1000); // 时隔1s
} catch (Exception e) {
e.printStackTrace();
}
}
}
} /* 键盘监听;调用方块类的键盘释放监听 */
public class Key extends KeyAdapter { @Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
super.keyReleased(e);
f.keyReleased(e);
} } /* 鼠标监听;调用方块类的鼠标单击监听 */
public class Mouse extends MouseAdapter { @Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
super.mouseClicked(e);
f.mouseClicked(e);
}
}
}
 /*
* Frog.java
* */
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import javax.swing.JOptionPane; public class Frog {
/* 方块类 */
private class F {
public int x, y; // 方块的坐标
public boolean good; // 判断两方阵营
public boolean have; // 判断是否显现这个方块(7个位置只显示6个) public F(int x, int y, boolean good, boolean have) {
super();
// TODO Auto-generated constructor stub
this.x = x;
this.y = y;
this.good = good;
this.have = have;
}
} private static final int FROG_WIGTH = 20; // 方块大小
private static final int FROG_HEIGTH = 20;
private static final int GAME_FROG_NUMBER = 7; // 游戏方块数量
private static final int FROG_X = 50; // 位置基址
private static final int FROG_Y = 50;
List<F> frog = new ArrayList<F>(); // 方块集合
private Main m; public Frog(Main m) {
InitFrog();// 初始化集合
this.m = m;
} private void InitFrog() {
for (int i = 1; i <= GAME_FROG_NUMBER; i++) {
if (i <= GAME_FROG_NUMBER / 2)
frog.add(new F(FROG_X * i, FROG_Y, true, true));
else if (i == GAME_FROG_NUMBER / 2 + 1)
frog.add(new F(FROG_X * i, FROG_Y, true, false));
else
frog.add(new F(FROG_X * i, FROG_Y, false, true));
}
} public void Draw(Graphics g) {
Color c = g.getColor(); // 获取当前画笔颜色
for (int i = 0; i < GAME_FROG_NUMBER; i++) {
if (frog.get(i).have) {
if (frog.get(i).good) // 两边分出颜色
g.setColor(Color.BLUE);
else
g.setColor(Color.RED);
g.fillRect(frog.get(i).x, frog.get(i).y, FROG_WIGTH, FROG_HEIGTH);// 相应位置画出方块
}
}
g.setColor(c);
} public boolean Over() {
for (int i = 0; i < GAME_FROG_NUMBER; i++) {
if (i < GAME_FROG_NUMBER / 2) {
if (frog.get(i).good)
return false;
} else if (i == GAME_FROG_NUMBER / 2) {
if (frog.get(i).have)
return false;
} else {
if (!frog.get(i).good)
return false;
}
}
return true;
} public void reset() {
frog.removeAll(frog);
InitFrog();
m.repaint();
Date date = new Date();
m.StartDate = m.format.format(date);
m.EndtDate = m.format.format(date);
} /* 鼠标单击监听;方块移动算法 */
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if (y > 50 && y < 70 && x % 50 <= 20) {
x /= 50;
x -= 1;
if (frog.get(x).have) {
if (frog.get(x).good) {
if (x < GAME_FROG_NUMBER - 1)
if (frog.get(x + 1).have) {
if (x < GAME_FROG_NUMBER - 2) {
if (!frog.get(x + 2).have) {
frog.set(x, new F(FROG_X * (x + 1), FROG_Y, true, false));
frog.set(x + 2, new F(FROG_X * (x + 3), FROG_Y, true, true));
}
}
} else {
frog.set(x, new F(FROG_X * (x + 1), FROG_Y, true, false));
frog.set(x + 1, new F(FROG_X * (x + 2), FROG_Y, true, true));
}
} else {
if (x > 0)
if (frog.get(x - 1).have) {
if (x > 1) {
if (!frog.get(x - 2).have) {
frog.set(x, new F(FROG_X * (x + 1), FROG_Y, false, false));
frog.set(x - 2, new F(FROG_X * (x - 1), FROG_Y, false, true));
}
}
} else {
frog.set(x, new F(FROG_X * (x + 1), FROG_Y, false, false));
frog.set(x - 1, new F(FROG_X * x, FROG_Y, false, true));
}
}
}
}
m.repaint();
if (Over()) {
Object[] o = { "OK", "CANCEL" };
if (JOptionPane.showOptionDialog(null, "完成游戏\n你所用时间:" + "" + m.format.format(new Date(m.times)).toString(),
"游戏结束", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, o,
o[0]) == JOptionPane.YES_OPTION) {
System.exit(0);
} else {
reset();
}
} } /* 键盘释放监听;重置用 */
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch (key) {
case KeyEvent.VK_F2:
reset();
break;
}
}
}

JAVA-小青蛙跳石头游戏的更多相关文章

  1. 7月18日刷题记录 二分答案跳石头游戏Getting

    通过数:1 明天就要暑假编程集训啦~莫名开心 今天做出了一道 二分答案题(好艰辛鸭) 1049: B13-二分-跳石头游戏(二分答案) 时间限制: 5 Sec  内存限制: 256 MB提交: 30  ...

  2. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  3. NOIP2015跳石头[二分答案]

    题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选 择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石( ...

  4. [NOIP2015] 提高组 洛谷P2678 跳石头

    题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不 ...

  5. NOIP2015 跳石头

    一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N块岩石(不含起点和终点的岩石). ...

  6. NOIP 2015复赛提高组Day2 T1==Codevs 4768 跳石头

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold  题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中 ...

  7. UOJ #148. 【NOIP2015】跳石头 二分

    #148. [NOIP2015]跳石头 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/148 Descripti ...

  8. c++二分答案 之 跳石头

    题目: 题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之 ...

  9. Codevs 4768 跳石头 NOIP2015 DAY2 T1

    4768 跳石头 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 一年一度的"跳石头"比赛又要开始了! ...

随机推荐

  1. centos7作为web服务器优化

    centos7作为web服务器优化 原文 http://itindex.net/detail/51140-centos7-web-服务器 1.加大打开文件数的限制(open files) 查看 uli ...

  2. SqlServer数据库空间使用情况常用命令

    --最简单的办法就是使用SSM客户端,报表查看 --查询数据文件的空间情况 dbcc showfilestats --查询日志文件的空间情况 dbcc sqlperf(logspace) --查询te ...

  3. NET基础(4):引用类型和值类型

    CLR支持两种类型:引用类型和值类型.虽然FCL的大多数类型都是引用类型,但程序员用的最多的还是引用类型,引用类型总是从托管堆分配,c#的new操作符返回对象内存地址-即指向对象数据的内存地址.使用引 ...

  4. XPath 节点

    在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档节点(或称为根节点). XPath 术语 节点(Node) 在 XPath 中,有七种类型的节点:元素.属性.文 ...

  5. css知多少——选择器的优先级

    1. 引言 上一节<css知多少(5)--选择器>最后提到,选择器类型过多将导致一些问题,是什么问题呢?咱们直接举例子说明. 上图中,css中的两个选择器都是针对<span>的 ...

  6. 一些CSS

    /*自定义*白烟*文本/边框/背景色*/ .text-whitesmoke,a.text-whitesmoke:link,a.text-whitesmoke:visited,.button.borde ...

  7. jquery.serialize

    jQuery - serialize() 方法 serialize() 方法通过序列化表单值,创建 URL 编码文本字符串. serialize()函数用于序列化一组表单元素,将表单内容编码为用于提交 ...

  8. oracle存储过程常用技巧

    我们在进行pl/sql编程时打交道最多的就是存储过程了.存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识.如:游标的处理,异常的处理,集 ...

  9. Mysql中的少用函数

    1.查询时需要转换类型,大多发生在数字和字符串.时间和字符串之间 Mysql提供了两个个类型转换函数:CAST和CONVERT CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另 ...

  10. python之信用卡ATM(第五天)

    本节作业 作业需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日, ...