java打字游戏
小记:老早之前写的程序,今天发现之前在 csdn上写的东西的图片不显示了,搞得人好郁闷,所以把之前零星的几篇文章搬个家
游戏运行截图:
字母实体类
package com.git.game; import java.awt.Color; public class Letter {
private String num;
private Color color;
private int x;
private int y;
private int speed = 1; public Letter() {
} public Letter(String num, Color color, int x, int y) {
super();
this.num = num;
this.color = color;
this.x = x;
this.y = y;
} /**
* 判断字母是否出界
*
* @time 2016年6月29日 下午12:27:38
* @author Lichao
* @return 出界为true,未出界为false
*/
public boolean outOfBound() {
return this.y > LetterGame.HEIGTH;
} public void step() {
this.y += speed;
} /* getter setter方法 */
public String getNum() {
return num;
} public void setNum(String num) {
this.num = num;
} public Color getColor() {
return color;
} public void setColor(Color color) {
this.color = color;
} public int getX() {
return x;
} public void setX(int x) {
this.x = x;
} public int getY() {
return y;
} public void setY(int y) {
this.y = y;
} }
游戏主运行类
package com.git.game; import java.awt.Color;
import java.awt.Font;
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.image.BufferedImage;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask; import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel; public class LetterGame extends JPanel { private static final long serialVersionUID = 1L;
public static final int WIDTH = 654;// 界面宽度
public static final int HEIGTH = 600;// 界面高度
private Timer timer; // 定时器
private int interVal = 1000 / 100;// 时间间隔,10毫秒
private Letter[] letters = {}; // 存放的字母
private int outOfBoundNumber;// 记录丢掉的字母个数
private int hitNumbers = 0; // 按中的字母个数
public static BufferedImage background; // 背景图
public static BufferedImage gameover; // 背景图
// 游戏状态
private int state;
public static final int RUNNING = 0;// 运行状态
public static final int GAME_OVER = 1; // 结束状态 static { // 加载静态资源
try {
background = ImageIO.read(LetterGame.class
.getResource("background.bmp"));
gameover = ImageIO.read(LetterGame.class
.getResource("gameover.bmp"));
} catch (Exception e) {
System.err.println("图片加载失败!");
e.printStackTrace();
}
} public LetterGame() {
} // 进数索引
int enterIndex = 0; /**
* 字母进入面板的方法
*
* @time 2016年6月29日 上午10:38:51
* @author Lichao
*/
public void enterAction() {
enterIndex++;
if (enterIndex % 30 == 0) {
Letter letter = nextOne();// 每300毫秒执行一次
letters = Arrays.copyOf(letters, letters.length + 1);
letters[letters.length - 1] = letter;
}
} /**
* 步进方法
*
* @time 2016年6月29日 上午10:40:58
* @author Lichao
*/
public void stepAction() {
for (int i = 0; i < letters.length; i++) {
letters[i].step();
}
} /**
* 定时运行方法
*
* @time 2016年6月29日 上午11:12:35
* @author Lichao
*/
public void action() { state = RUNNING;
this.repaint();
/**
* 键盘监听事件
*/
KeyAdapter keyAdapter = new KeyAdapter() { public void keyPressed(KeyEvent e) {
int index = -1;
String keyPressed = e.getKeyChar() + "";
for (int i = 0; i < letters.length; i++) {
Letter letter = letters[i];
if (keyPressed.equalsIgnoreCase(letter.getNum())) {
hitNumbers++;
index = i;
break;
}
} if (index != -1) {
Letter temp = letters[index];
letters[index] = letters[letters.length - 1];
letters[letters.length - 1] = temp;
letters = Arrays.copyOf(letters, letters.length - 1);
}
} };
/** 添加鼠标事件 */
this.addKeyListener(keyAdapter);
// 这两句用来监听键盘
this.setFocusable(true);
this.requestFocus();
mouseAction(); timer = new Timer();
timer.schedule(new TimerTask() { @Override
public void run() {
if (state == RUNNING) {
enterAction();
stepAction();
outOfBoundAction();
}
checkGameOverAction(); repaint();
}
}, interVal, interVal); } /**
* 出界操作
*
* @time 2016年6月29日 下午12:30:17
* @author Lichao
*/
public void outOfBoundAction() {
int index = 0;
Letter[] lettersInPanel = new Letter[letters.length];
for (int i = 0; i < letters.length; i++) {
Letter letter = letters[i];
if (!letter.outOfBound()) {
lettersInPanel[index++] = letter;
} else {
outOfBoundNumber++;
}
} letters = Arrays.copyOf(lettersInPanel, index);
} /**
* 判断游戏是否结束
*
* @time 2016年6月29日 下午1:38:24
* @author Lichao
*/
private void checkGameOverAction() {
if (isGameOver()) {
state = GAME_OVER;
}
} /**
* 随机生成字母
*
* @time 2016年6月29日 上午10:35:46
* @author Lichao
* @return
*/
protected Letter nextOne() {
Random random = new Random();
Letter letter = new Letter();
letter.setNum(String.valueOf((char) (random.nextInt(26) + 'A'))); letter.setX(random.nextInt(WIDTH - 25));
letter.setY(10);
letter.setColor(getRandColor());
return letter;
} /**
* 生成随机颜色
*
* @time 2016年6月29日 上午10:13:06
* @author Lichao
* @return
*/
public static Color getRandColor() {
Random random = new Random();
Color color = new Color(random.nextInt(255), random.nextInt(255),
random.nextInt(255));
return color;
} /**
* 重写父类方法
*/
@Override
public void paint(Graphics g) {
g.drawImage(background, 0, 0, null);
paintNumber(g);
paintState(g);
paintScore(g);
} /**
* 画图形
*
* @time 2016年6月29日 上午9:10:08
* @author Lichao
* @param g
*/
private void paintNumber(Graphics g) {
g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 25));
for (int i = 0; i < letters.length; i++) {
Letter letter = letters[i];
g.setColor(letter.getColor());
g.drawString(letter.getNum(), letter.getX(), letter.getY());
} } /**
* 画状态
*
* @time 2016年6月29日 下午1:17:46
* @author Lichao
* @param g
*/
private void paintState(Graphics g) {
switch (state) {
case GAME_OVER:
g.drawImage(gameover, 0, 0, null);
break;
}
} /**
* 添加鼠标事件
*
* @time 2016年6月29日 下午2:05:00
* @author Lichao
*/
private void mouseAction() {
/** 鼠标监听事件 */
MouseAdapter mouse = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent event) {
// 单击右键退出
if (event.getButton() == MouseEvent.BUTTON3
&& state == GAME_OVER) {
System.exit(0); }
// 单击左键重新开始
if (event.getButton() == MouseEvent.BUTTON1
&& state == GAME_OVER) {
init();
}
}
}; this.addMouseListener(mouse);
} /**
* 初始化游戏
*
* @time 2016年6月29日 下午2:09:10
* @author Lichao
*/
protected void init() { this.state = RUNNING;
this.outOfBoundNumber = 0;
this.letters = new Letter[] {};
this.repaint();
} /**
* 判断游戏是否结束
*
* @time 2016年6月29日 下午1:19:07
* @author Lichao
* @return
*/
private boolean isGameOver() {
return this.outOfBoundNumber > 5;
} private void paintScore(Graphics g) {
g.setColor(new Color(0xFF0000)); // 设置颜色(0xFF0000为纯红)
g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20)); // 设置字体(Font.SANS_SERIF为字体,Font.BOLD为字体样式,20为字号)
g.drawString("SCORE: " + hitNumbers, 10, 25); // 画分
g.drawString("MISS: " + outOfBoundNumber, 10, 45); // 画丢失数
} /** 主方法 */
public static void main(String[] args) {
JFrame frame = new JFrame("傻逼打字游戏");
LetterGame game = new LetterGame();
frame.add(game);
frame.setBackground(new Color(111, 168, 220));
frame.setSize(WIDTH, HEIGTH); // 设置窗口的大小
frame.setAlwaysOnTop(true); // 设置窗口总在最上面
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置默认关闭操作(窗口关闭时退出程序)
frame.setLocationRelativeTo(null); // 设置窗口起始位置(居中)
frame.setVisible(true); // 1.设置窗口可见 2.尽快调用paint()方法
frame.setResizable(false);
game.action();
} }
背景图片
游戏结束图片
ps:这两张图是我用画图工具花的,太丑了,哈哈。程序可以直接运行的,如果你不知道怎么运行,那我就帮不了你了。由于比较简单,我就不附送源码了。
java打字游戏的更多相关文章
- java打字游戏-一款快速提升java程序员打字速度的游戏(附源码)
一.效果如图: 源码地址:https://gitee.com/hoosson/TYPER 纯干货,别忘了留个赞哦!
- Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)
当java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue 和 AWT-Windows. AWT-EventQ ...
- 用JS写了一个打字游戏,反正我是通不了关
今天想写个简单的游戏, 打字游戏好像都没写过, 那么就写打字游戏吧, gamePad包含了关卡的信息, 可以用来调整给个关卡字符下落的速度: getRandom函数会返回一个字符对象, 这个对象包含了 ...
- java俄罗斯方块游戏代码
java俄罗斯方块游戏代码: package com; import java.awt.Color; import java.awt.Graphics; import java.awt.event.K ...
- java围棋游戏源代码
//李雨泽源代码,不可随意修改.//时间:2017年9月22号.//地点:北京周末约科技有限公司.//package com.bao; /*围棋*/ /*import java.awt.*; impo ...
- jQuery 写的简单打字游戏
var off_x; //横坐标 var count=0; //总分 var speed=5000; //速度,默认是5秒. var keyErro=0; //输入错误次数 var keyRight= ...
- Java 3D游戏引擎——JME(java Monkey Engine)
转自:http://bbs.gameres.com/forum.php?mod=viewthread&tid=180732 JME(java Monkey Engine),一个非常棒的Java ...
- [转] java开源游戏
收藏一下 triplea Triplea是一个开放源码的boardgame.它允许玩家选择各种各样的战略版图游戏(如:轴心国或同盟军).TripleA引擎支持联网对战,支持声音,支持使用XML文 ...
- 寒假答辩作品:Java小游戏
目录 java入门小游戏[test] 游戏界面 前言 (可直接跳到程序介绍) 前期入门小项目 前期收获 后期自创关卡 后续 java入门小游戏[test] 游戏界面 github地址: https:/ ...
随机推荐
- 通过刷bios的方式在win8.1平板上启动windows phone模拟器
最近买了个Windows8.1平板电脑,不是Surface Pro,太贵,而是国产的乐凡F2(64G.4G内存),CPU是赛扬U1037.最开始安装Visual Studio2013以及其他开发工具都 ...
- 四则运算APP(BUG发掘)
BUG: 1.有几率会出现一样的题目. 2.题目会出现两个一样的答案. 3.做题结束后不能返回主界面或者重新开始. 感想: 1.题目应该按年级分类出题. 2.主界面可以添加更多功能 如自己输入题目数, ...
- 2015年百度之星初赛(1) --- B 找连续数
找连续数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- JAVA的网络编程基础概念
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协 ...
- mybatis中#和$符号的区别
mybatis做为一个轻量级ORM框架在许多项目中使用,因其简单的入门受到了广大开发者的热爱.在近期项目中再做一个相关的开发,碰到了#.$符号这样的问题,之前没怎么注意过,通过学习之后,有了点感悟,分 ...
- Hibernate框架之注解的配置
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式 ...
- Ahjesus Nodejs02 使用集成开发环境
下载最新版webstorm, 选择此集成开发环境是因为支持性较好,在vs下也有插件支持,不过感觉有些牵强 附vs插件 NTVS 详细介绍 安装好以后就需要配置npm NPM 国内高速镜像 source ...
- web安全——防火墙
简介 用于实现服务器(Linux)的访问控制的功能的. 分硬件和软件防火墙. 主要是控制访问的流入和服务器的流出. 通过黑名单和白名单的思想来实现更细粒度的控制,这个一般结合其他的应用来定义策略实现. ...
- [js开源组件开发]js多选日期控件
js多选日期控件 详情请见:http://www.lovewebgames.com/jsmodule/calendar.html 它的github地址:https://github.com/tianx ...
- EntityFramework嵌套查询的五种方法
这样的双where的语句应该怎么写呢: var test=MyList.Where(a => a.Flows.Where(b => b.CurrentUser == “”) 下面我就说说这 ...