小记:老早之前写的程序,今天发现之前在 csdn上写的东西的图片不显示了,搞得人好郁闷,所以把之前零星的几篇文章搬个家

游戏运行截图:

字母实体类

  1. package com.git.game;
  2.  
  3. import java.awt.Color;
  4.  
  5. public class Letter {
  6. private String num;
  7. private Color color;
  8. private int x;
  9. private int y;
  10. private int speed = 1;
  11.  
  12. public Letter() {
  13. }
  14.  
  15. public Letter(String num, Color color, int x, int y) {
  16. super();
  17. this.num = num;
  18. this.color = color;
  19. this.x = x;
  20. this.y = y;
  21. }
  22.  
  23. /**
  24. * 判断字母是否出界
  25. *
  26. * @time 2016年6月29日 下午12:27:38
  27. * @author Lichao
  28. * @return 出界为true,未出界为false
  29. */
  30. public boolean outOfBound() {
  31. return this.y > LetterGame.HEIGTH;
  32. }
  33.  
  34. public void step() {
  35. this.y += speed;
  36. }
  37.  
  38. /* getter setter方法 */
  39. public String getNum() {
  40. return num;
  41. }
  42.  
  43. public void setNum(String num) {
  44. this.num = num;
  45. }
  46.  
  47. public Color getColor() {
  48. return color;
  49. }
  50.  
  51. public void setColor(Color color) {
  52. this.color = color;
  53. }
  54.  
  55. public int getX() {
  56. return x;
  57. }
  58.  
  59. public void setX(int x) {
  60. this.x = x;
  61. }
  62.  
  63. public int getY() {
  64. return y;
  65. }
  66.  
  67. public void setY(int y) {
  68. this.y = y;
  69. }
  70.  
  71. }

游戏主运行类

  1. package com.git.game;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Graphics;
  6. import java.awt.event.KeyAdapter;
  7. import java.awt.event.KeyEvent;
  8. import java.awt.event.MouseAdapter;
  9. import java.awt.event.MouseEvent;
  10. import java.awt.image.BufferedImage;
  11. import java.util.Arrays;
  12. import java.util.Random;
  13. import java.util.Timer;
  14. import java.util.TimerTask;
  15.  
  16. import javax.imageio.ImageIO;
  17. import javax.swing.JFrame;
  18. import javax.swing.JPanel;
  19.  
  20. public class LetterGame extends JPanel {
  21.  
  22. private static final long serialVersionUID = 1L;
  23. public static final int WIDTH = 654;// 界面宽度
  24. public static final int HEIGTH = 600;// 界面高度
  25. private Timer timer; // 定时器
  26. private int interVal = 1000 / 100;// 时间间隔,10毫秒
  27. private Letter[] letters = {}; // 存放的字母
  28. private int outOfBoundNumber;// 记录丢掉的字母个数
  29. private int hitNumbers = 0; // 按中的字母个数
  30. public static BufferedImage background; // 背景图
  31. public static BufferedImage gameover; // 背景图
  32. // 游戏状态
  33. private int state;
  34. public static final int RUNNING = 0;// 运行状态
  35. public static final int GAME_OVER = 1; // 结束状态
  36.  
  37. static { // 加载静态资源
  38. try {
  39. background = ImageIO.read(LetterGame.class
  40. .getResource("background.bmp"));
  41. gameover = ImageIO.read(LetterGame.class
  42. .getResource("gameover.bmp"));
  43. } catch (Exception e) {
  44. System.err.println("图片加载失败!");
  45. e.printStackTrace();
  46. }
  47. }
  48.  
  49. public LetterGame() {
  50. }
  51.  
  52. // 进数索引
  53. int enterIndex = 0;
  54.  
  55. /**
  56. * 字母进入面板的方法
  57. *
  58. * @time 2016年6月29日 上午10:38:51
  59. * @author Lichao
  60. */
  61. public void enterAction() {
  62. enterIndex++;
  63. if (enterIndex % 30 == 0) {
  64. Letter letter = nextOne();// 每300毫秒执行一次
  65. letters = Arrays.copyOf(letters, letters.length + 1);
  66. letters[letters.length - 1] = letter;
  67. }
  68. }
  69.  
  70. /**
  71. * 步进方法
  72. *
  73. * @time 2016年6月29日 上午10:40:58
  74. * @author Lichao
  75. */
  76. public void stepAction() {
  77. for (int i = 0; i < letters.length; i++) {
  78. letters[i].step();
  79. }
  80. }
  81.  
  82. /**
  83. * 定时运行方法
  84. *
  85. * @time 2016年6月29日 上午11:12:35
  86. * @author Lichao
  87. */
  88. public void action() {
  89.  
  90. state = RUNNING;
  91. this.repaint();
  92. /**
  93. * 键盘监听事件
  94. */
  95. KeyAdapter keyAdapter = new KeyAdapter() {
  96.  
  97. public void keyPressed(KeyEvent e) {
  98. int index = -1;
  99. String keyPressed = e.getKeyChar() + "";
  100. for (int i = 0; i < letters.length; i++) {
  101. Letter letter = letters[i];
  102. if (keyPressed.equalsIgnoreCase(letter.getNum())) {
  103. hitNumbers++;
  104. index = i;
  105. break;
  106. }
  107. }
  108.  
  109. if (index != -1) {
  110. Letter temp = letters[index];
  111. letters[index] = letters[letters.length - 1];
  112. letters[letters.length - 1] = temp;
  113. letters = Arrays.copyOf(letters, letters.length - 1);
  114. }
  115. }
  116.  
  117. };
  118. /** 添加鼠标事件 */
  119. this.addKeyListener(keyAdapter);
  120. // 这两句用来监听键盘
  121. this.setFocusable(true);
  122. this.requestFocus();
  123. mouseAction();
  124.  
  125. timer = new Timer();
  126. timer.schedule(new TimerTask() {
  127.  
  128. @Override
  129. public void run() {
  130. if (state == RUNNING) {
  131. enterAction();
  132. stepAction();
  133. outOfBoundAction();
  134. }
  135. checkGameOverAction();
  136.  
  137. repaint();
  138. }
  139. }, interVal, interVal);
  140.  
  141. }
  142.  
  143. /**
  144. * 出界操作
  145. *
  146. * @time 2016年6月29日 下午12:30:17
  147. * @author Lichao
  148. */
  149. public void outOfBoundAction() {
  150. int index = 0;
  151. Letter[] lettersInPanel = new Letter[letters.length];
  152. for (int i = 0; i < letters.length; i++) {
  153. Letter letter = letters[i];
  154. if (!letter.outOfBound()) {
  155. lettersInPanel[index++] = letter;
  156. } else {
  157. outOfBoundNumber++;
  158. }
  159. }
  160.  
  161. letters = Arrays.copyOf(lettersInPanel, index);
  162. }
  163.  
  164. /**
  165. * 判断游戏是否结束
  166. *
  167. * @time 2016年6月29日 下午1:38:24
  168. * @author Lichao
  169. */
  170. private void checkGameOverAction() {
  171. if (isGameOver()) {
  172. state = GAME_OVER;
  173. }
  174. }
  175.  
  176. /**
  177. * 随机生成字母
  178. *
  179. * @time 2016年6月29日 上午10:35:46
  180. * @author Lichao
  181. * @return
  182. */
  183. protected Letter nextOne() {
  184. Random random = new Random();
  185. Letter letter = new Letter();
  186. letter.setNum(String.valueOf((char) (random.nextInt(26) + 'A')));
  187.  
  188. letter.setX(random.nextInt(WIDTH - 25));
  189. letter.setY(10);
  190. letter.setColor(getRandColor());
  191. return letter;
  192. }
  193.  
  194. /**
  195. * 生成随机颜色
  196. *
  197. * @time 2016年6月29日 上午10:13:06
  198. * @author Lichao
  199. * @return
  200. */
  201. public static Color getRandColor() {
  202. Random random = new Random();
  203. Color color = new Color(random.nextInt(255), random.nextInt(255),
  204. random.nextInt(255));
  205. return color;
  206. }
  207.  
  208. /**
  209. * 重写父类方法
  210. */
  211. @Override
  212. public void paint(Graphics g) {
  213. g.drawImage(background, 0, 0, null);
  214. paintNumber(g);
  215. paintState(g);
  216. paintScore(g);
  217. }
  218.  
  219. /**
  220. * 画图形
  221. *
  222. * @time 2016年6月29日 上午9:10:08
  223. * @author Lichao
  224. * @param g
  225. */
  226. private void paintNumber(Graphics g) {
  227. g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 25));
  228. for (int i = 0; i < letters.length; i++) {
  229. Letter letter = letters[i];
  230. g.setColor(letter.getColor());
  231. g.drawString(letter.getNum(), letter.getX(), letter.getY());
  232. }
  233.  
  234. }
  235.  
  236. /**
  237. * 画状态
  238. *
  239. * @time 2016年6月29日 下午1:17:46
  240. * @author Lichao
  241. * @param g
  242. */
  243. private void paintState(Graphics g) {
  244. switch (state) {
  245. case GAME_OVER:
  246. g.drawImage(gameover, 0, 0, null);
  247. break;
  248. }
  249. }
  250.  
  251. /**
  252. * 添加鼠标事件
  253. *
  254. * @time 2016年6月29日 下午2:05:00
  255. * @author Lichao
  256. */
  257. private void mouseAction() {
  258. /** 鼠标监听事件 */
  259. MouseAdapter mouse = new MouseAdapter() {
  260. @Override
  261. public void mouseClicked(MouseEvent event) {
  262. // 单击右键退出
  263. if (event.getButton() == MouseEvent.BUTTON3
  264. && state == GAME_OVER) {
  265. System.exit(0);
  266.  
  267. }
  268. // 单击左键重新开始
  269. if (event.getButton() == MouseEvent.BUTTON1
  270. && state == GAME_OVER) {
  271. init();
  272. }
  273. }
  274. };
  275.  
  276. this.addMouseListener(mouse);
  277. }
  278.  
  279. /**
  280. * 初始化游戏
  281. *
  282. * @time 2016年6月29日 下午2:09:10
  283. * @author Lichao
  284. */
  285. protected void init() {
  286.  
  287. this.state = RUNNING;
  288. this.outOfBoundNumber = 0;
  289. this.letters = new Letter[] {};
  290. this.repaint();
  291. }
  292.  
  293. /**
  294. * 判断游戏是否结束
  295. *
  296. * @time 2016年6月29日 下午1:19:07
  297. * @author Lichao
  298. * @return
  299. */
  300. private boolean isGameOver() {
  301. return this.outOfBoundNumber > 5;
  302. }
  303.  
  304. private void paintScore(Graphics g) {
  305. g.setColor(new Color(0xFF0000)); // 设置颜色(0xFF0000为纯红)
  306. g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20)); // 设置字体(Font.SANS_SERIF为字体,Font.BOLD为字体样式,20为字号)
  307. g.drawString("SCORE: " + hitNumbers, 10, 25); // 画分
  308. g.drawString("MISS: " + outOfBoundNumber, 10, 45); // 画丢失数
  309. }
  310.  
  311. /** 主方法 */
  312. public static void main(String[] args) {
  313. JFrame frame = new JFrame("傻逼打字游戏");
  314. LetterGame game = new LetterGame();
  315. frame.add(game);
  316. frame.setBackground(new Color(111, 168, 220));
  317. frame.setSize(WIDTH, HEIGTH); // 设置窗口的大小
  318. frame.setAlwaysOnTop(true); // 设置窗口总在最上面
  319. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置默认关闭操作(窗口关闭时退出程序)
  320. frame.setLocationRelativeTo(null); // 设置窗口起始位置(居中)
  321. frame.setVisible(true); // 1.设置窗口可见 2.尽快调用paint()方法
  322. frame.setResizable(false);
  323. game.action();
  324. }
  325.  
  326. }

背景图片

游戏结束图片

ps:这两张图是我用画图工具花的,太丑了,哈哈。程序可以直接运行的,如果你不知道怎么运行,那我就帮不了你了。由于比较简单,我就不附送源码了。

java打字游戏的更多相关文章

  1. java打字游戏-一款快速提升java程序员打字速度的游戏(附源码)

    一.效果如图: 源码地址:https://gitee.com/hoosson/TYPER 纯干货,别忘了留个赞哦!

  2. Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)

    当java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue 和 AWT-Windows. AWT-EventQ ...

  3. 用JS写了一个打字游戏,反正我是通不了关

    今天想写个简单的游戏, 打字游戏好像都没写过, 那么就写打字游戏吧, gamePad包含了关卡的信息, 可以用来调整给个关卡字符下落的速度: getRandom函数会返回一个字符对象, 这个对象包含了 ...

  4. java俄罗斯方块游戏代码

    java俄罗斯方块游戏代码: package com; import java.awt.Color; import java.awt.Graphics; import java.awt.event.K ...

  5. java围棋游戏源代码

    //李雨泽源代码,不可随意修改.//时间:2017年9月22号.//地点:北京周末约科技有限公司.//package com.bao; /*围棋*/ /*import java.awt.*; impo ...

  6. jQuery 写的简单打字游戏

    var off_x; //横坐标 var count=0; //总分 var speed=5000; //速度,默认是5秒. var keyErro=0; //输入错误次数 var keyRight= ...

  7. Java 3D游戏引擎——JME(java Monkey Engine)

    转自:http://bbs.gameres.com/forum.php?mod=viewthread&tid=180732 JME(java Monkey Engine),一个非常棒的Java ...

  8. [转] java开源游戏

    收藏一下   triplea  Triplea是一个开放源码的boardgame.它允许玩家选择各种各样的战略版图游戏(如:轴心国或同盟军).TripleA引擎支持联网对战,支持声音,支持使用XML文 ...

  9. 寒假答辩作品:Java小游戏

    目录 java入门小游戏[test] 游戏界面 前言 (可直接跳到程序介绍) 前期入门小项目 前期收获 后期自创关卡 后续 java入门小游戏[test] 游戏界面 github地址: https:/ ...

随机推荐

  1. SQL Server 存储(8/8):理解数据文件结构

    这段时间谈了很多页,现在我们可以看下这些页在数据文件里是如何组织的. 我们都已经知道,SQL Server把数据文件分成8k的页,页是IO的最小操作单位.SQL Server把数据文件里的第1页标记为 ...

  2. Tesseract-OCR引擎 入门

    OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程. Tesseract:开源的OCR识别引擎,初期Tesseract引 ...

  3. .NET转JAVA之拼音组件

    PS:做了4年,自我感觉.NET到瓶颈了,而且公司并没有深入运用.NET技术的项目,自我学习感觉也没太大动力(请骂我懒T_T).再加上技术年限越往上走,了解到的.NET职业提升环境就越来越艰难(个人理 ...

  4. C#中弹出文件选择窗体和判断是否下载提示窗体的源码

    1.创建一个window窗体

  5. JPA学习(3)JPA API

    在我们的jpa的helloworld中,我们看到了简单的一个jpa保存操作,下面就来好好学习一下,JPA最主要的几个类 1.基本的几个类: ①:Persistence 类是用于获取 EntityMan ...

  6. 利用Spring创建定时任务

    啊Spring Task看似很简单的感觉,但是自己搞起来还是花了蛮大的精力的,因为以前没接触过这个东西,所有当任务交给我的时候,我是一头的雾水的.然后我就各种查资料.其中我印象最深的是版本的问题和架包 ...

  7. Python 3.X 实现定时器 Timer,制作抽象的Timer定时器基类

    Python 在不依赖第三方库的前提下,对于定时器的实现并不是很完美,但是这不意味着我们无法实现. 阅读了网上的一些资料,得出一些结论,顺手写了一个基类的定时器(Python3) BaseTimer: ...

  8. Little Jumper---(三分)

    Description Little frog Georgie likes to jump. Recently he have discovered the new playground that s ...

  9. 状态压缩DP--Mondriaan's Dream

    题目网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110044#problem/A Description Squares and ...

  10. 【转载】delete table 和 truncate table 的区别

    使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where] 将XS表中的所有行数据删除 delete XS 执行完后,发现X ...