A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

dss97

初级黑马

  • 黑马币:65

  • 帖子:18

  • 精华:0

© dss97 初级黑马   /  2020-8-20 10:22  /  1555 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

制作一款Jframe窗口打字游戏原来这么简单,我抚摸着光头禁不住惊叹!!开始、暂停、重新开始事件必须有,线程也加入下充充面子,背景更换和移动也需要,一首背景音乐当然更适合游戏。
                                         

                                本文csdn链接:https://blog.csdn.net/weixin_42423774/article/details/108110522                             







Jframe制作打字游戏

设计思路和流程
为什么设计这个玩意前段事件因为背单词一直用金山打字,上面可以自己导入单词,就写了个Jframe窗口程序封装了分割单词词性和中文翻译的方法,可以实现一键转换成金山打字上面自带的文件那种形式,比较方便,也比较方便java初学者练习打字速度以及java,HTML,js里面特殊名词,个人使用学习效果不错.推荐初学者们一起金山打字吧!!!
然后,整理了那玩意后,就实现了下一个窗口的打字游戏,不过不完善,后续还可以补充加入数据库等,有需要的可以练习玩玩.
一、初始设计分析技术有限,我也没写过几次这玩意,所以里面注释很多,我就不用文字再说一次了.
窗口的建立和实现显示字母1. 窗口DemoTest类的窗口生成实现
首先建一个窗口的test测试实现类,实现生成窗口;在窗口中添加一个画布生成MyPannel类

2. 画布生成类MyPanel中添加一个字母,运行下实现出现字母
这里继承了Panel类,后期因为画布刷新字母移动闪烁问题换成了继承Jpanel类,注意下

我这没实现的窗口截图,代码正确是没问题的.然后在进行换成生成十个随机字母的设置.x,y轴也使用随机函数随机生成,不过y轴不要过低,初始生成在屏幕上面一半位置就可以了.
3.窗口x,y轴介绍

4.随机字母生成代码
改写完运行下看看是不是生成了十个随机字符,也可以根据自己需求调整生成范围

二、进阶设计分析1.打字游戏基本实现流程的设计1.添加字母,x,y轴的随机元素的容器,调用容器,减少耦合

2.加入线程,实现添加的随机元素向下滑落
继承一个Runnable接口,添加一个线程

3.重写线程中的run()方法,实现字母移动
里面注释暂停两秒是之前的测试注释,忘改了,现在的thread.sleep(3)是暂停3毫秒刷新画布生成移动的元素,实现字母向下隔3毫秒移动一下
y=y+1就是移动速度(距离)是1
一个控制时间,一个控制空间

4.加入积分制,在窗口上显示积分和结束后显示结束提示

也修改下线程里面操作,设置线程在成绩为零后停止操作(注意,此时程序中线程是一直开启的)

5.解决运行时字母闪烁问题
我们运行下已经写好的程序,发现字母一直闪烁,这是不停生成字母导致的,我们使用继承JPanel类的方法处理一下
这个改写下面的super.paint(g)是重点,它起到移动字母而不是不停生成的作用

paint和Jpanel的区别

线程中也加入下重绘画布方法

6.这样基础设计就完成了,剩下的我们进行优化
2.键盘注册实现消除字母和重新生成1.继承keyListener键盘注册类

2.在窗口中DemoTest测试类中也要添加键盘注册事件(也有鼠标注册事件,需要鼠标的设计会用到,基本操作是一样的)

3.重写键盘方法
先重写键盘录入方法,匹配字母实现消除字母,然后重新生成一个新的字母.其他两个键盘按压方法先不用管.

4.去除消除时相同字母全消除错误
这时候运行程序,我们会发现实现键盘键入消除到是可以了,不过相同的一下子都消除了,这不符合规则啊,这是外挂啊.(感兴趣的可以设计一下多少分可以有一次buff机会,就是可以消除窗体上相同的字母)
好了,那我们就加上索引,相同字母最下面的索引永远是消除的首选

三.优化流程和窗口虽然基本流程设计好了,但是这样实在不像是一个游戏,太单调了,我们来优化下,使它像一个游戏,最起码像小时候玩的那种
1.给随机生成的字母加上随机颜色写一个随机色生成方法

添加随机颜色容器,通过生成随机颜色方法获取十个索引的颜色

字母的颜色和成绩的颜色都添加上,这样就好看多了(字体可以自己调)

看一下效果: 帅 ,不过这个是我完成后截得图,已经加了背景
(没录动图的工具,太伤了)
2.让我们也添加背景图吧(不过太俗了,我们稍微改下设计为会动的背景)1.新建一个背景移动类,我的是AddBackgroundImage,实现动图的方法

2.我们在Mypanel画布类中添加图像并调用图像移动类和方法

3.在MyPanel类中加载图片
不过加载的图片目录要搞清楚,有的可以链src下,不过一些ps处理和电脑画图处理的图片要加上src,其实就是要放在src外面,还没搞明白不知道有什么区别呢…
这个链接有一点浅显介绍:https://blog.csdn.net/weixin_42423774/article/details/108083624

4.图片写入画布,在窗体中生成

这个是抽出来的mode方法

还有个失败后写入画布的图片

3.就这样干完也很无聊,加个音乐听听1.添加一个音乐类Addmusic
这个类实现获取音乐路径,返回一个音乐AudioClip类型文件,然后等待使用

2.然后我们在Mypanel中创建一个变量,实现全局调用

3.添加音乐文件,实现全局循环播放


4.设置开始游戏,暂停,重新开始游戏volatile
这里我就简单设置了三个全局int变量,值变化就转换模式
1.开始结束重建游戏锁的设置
(1)开始open设置为空格键,按空格开始游戏,不过我没设置
再按空格事件,按一下就行
(2)暂停pause设置为enter键,按下停止线程,在按下继续开始
(3)重新开始游戏rebuild设置为esc键,点下重新开始游戏,设置
volatile修饰为共享变量,便于DemoTest接收实现窗口重绘
(volatile不具有原子性要注意)

2.按键可以实现开始.暂停.重新开始游戏

这里有个小知识,就是键盘事件中keyPressed按压类和上面的keyChar获取字符的键盘上的各个键位的值我整理了一份,有需要的话大家可以去看看
https://blog.csdn.net/weixin_42423774/article/details/108114650
3.我们去用我们设置的锁去包裹各自代码去吧
我们已经看到了rebuild的锁使用,我们再去使用open和pause锁
open开启游戏锁
添加至画布类中进行判定

pause暂停锁的使用
先写一个线程暂停的PauseAndOpen方法
这个方法实现随着pause值的转变线程的状态

pause暂停锁要停的是游戏运行的线程,所以PauseAndOpen方法要放在线程里

5.解决线程不停下来问题因为线程一直运行,就算关掉窗体也运行,程序不停止,所以我们在测试类中加入关闭窗体直接关掉程序的设置

四.好了,基本元素都有了,我截下运行图(背景图自己做的,难看体谅)没有动图,表现不出来,就截两张随便看下吧


五.总结1.需完善的地方:(1)线程问题太折磨人了
(2)我还没加空格键开始后的判定再按不进入开始图片
(3)加入数据库,能够实现随机生成数据库文本,然后玩消除
(4)java不适合做游戏,玩c,js都比java好玩
2.主要想法:写这个主要是让新手学程序的看看简易窗体程序如何实现.
重中之重当然是改写了,能学会理解懂可以自己改写的程序才是好程序.
希望大家交流完善,自己多尝试改写程序,添加需求!!!
向秃头师迈进!!!
6.完整代码查看和下载1.代码查看链接
https://blog.csdn.net/weixin_42423774/article/details/108114981
2.代码下载链接
https://blog.csdn.net/weixin_42423774/article/details/108114981



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马