Java课程设计打字游戏.docx
- 文档编号:29266085
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:34
- 大小:111.17KB
Java课程设计打字游戏.docx
《Java课程设计打字游戏.docx》由会员分享,可在线阅读,更多相关《Java课程设计打字游戏.docx(34页珍藏版)》请在冰豆网上搜索。
Java课程设计打字游戏
Java课程设计打字游戏
中南大学
Java课程设计报告
题目打字游戏
学生姓名窦立阳
指导教师陈丽萍
学院信息科学与工程学院
专业班级计科1204
完成时间2015年1月15日
第2章总体设计
2.1界面设计..................................................4
2.2运行流程..................................................4
2.3逻辑设计..................................................4
2.4积分设计..................................................4
第3章详细设计
3.1主面板....................................................5
3.1.1两个按键............................................5
3.1.2相关全局变量........................................5
3.1.3全局变量说明........................................5
3.1.4相关全局函数........................................7
3.2字符下落模块..............................................7
3.2.1WordLabel............................................7
3.2.2WordFallControl......................................8
3.2.3WordFallLabel........................................8
3.3速度控制模块..............................................8
3.4按键模块设计..............................................8
3.5键盘监听事件..............................................9
3.6积分模块设计..............................................9
3.7事件模块设计.............................................10
第4章调试分析
4.1第一次调试...............................................11
4.2第二次调试...............................................11
4.3第三次调试...............................................12
第5章运行结果.................................................13
第6章课程设计总结.............................................17
第7章参考文献.................................................19
第8章附录:
带注释的源代码
8.1Wordfall................................................20
8.1.1WordFallControl类.....................................20
8.1.2WordLabel类...........................................22
8.1.3WordFallLabel类.......................................23
8.2ScoreLabel类............................................24
8.3StartButton类...........................................25
8.4TimeLabel类.............................................26
8.5AAAAA类:
程序的主函数入口...............................28
8.6Maintain类.................................................30
第1章实验要求
【问题描述】设计实现一个打字游戏,界面参见图2-2,具备如下功能:
●点击“开始”按钮,产生随机字符从屏幕上方下落;
●点击键盘上按钮,如果正确,当前的字符消失,产生新的按钮从上方继续落下。
●提供速度调整和积分功能。
图2-2打字游戏界面
第2章总体设计
2.1界面设计
根据实验要求中的图2-2,在主面板中,
1.1.1有一个模块控制各个字符的生成并且控制他们的自动下落,并在正确触发时,字符不可见;
1.1.2有一个模块用于设置下落速度;
1.1.3有两个按键,分别为“开始”和“结束”,用于字符下落的开始和结束;
1.1.4整个面板处于键盘事件监听中,所以还有一个模块负责监听键盘事件;
1.1.5相应的,根据要求,会有一个模块用于将键盘事件和下落的字符进行操作,并且计算出积分。
2.2运行流程
1.2.1程序启动,程序等待按键“开始”的事件的触发;
1.2.2当“开始”键触发后,负责字符下落的模块,将持续产生字符,并使其下落;
1.2.3键盘开始被监听,从键盘的按键触发,向程序返回值;
1.2.3积分模块开始工作,将字符下落模块的字符和键盘事件返回的值进行比较,得出积分,并且将积分值显示在面板上;
1.2.4如果点击“停止”按键,所有模块停止工作,等待程序关闭,或者等待“开始”按键事件的再次触发,从1.2.1继续这一流程。
2.3逻辑设计
1.3.1字符不断产生并且下降,需要一个线程控制产生字符,然后还应该有一个线程对面一个字符,控制其下落。
1.3.2键盘被按下后,立刻会有值返回到程序中,积分模块会每隔一段时间将,键盘事件返回的值,和当前需要按下的值进行比较。
2.4积分说明
当开始产生字符后,会有很多字符都是可输入的,但是当前可输入的字符只有一个,所以可以考虑设计一个链表,没当产生一个字符,便将该字符存入链表中,并且有一个指针永远指向当前需要输入的值。
由于界面大小有限,当字符持续下落超过界面大小时,不能够通过玩家来猜测,已经不见的当前需要输入字符,所以当界面上字符超过十个时,便认为该玩家反应时间过长,判定其为错误,并且将当前需要输入的字符设置为下一个。
并且从游戏角度考虑,当这种情况出现3次后,便可以判定本轮游戏结束。
第3章详细设计
3.1主面板
publicclassGameFrameextendsJFrame
主面板中主要涉及的是两个按键,各个组件在面板上的布置,以及其他的全局变量的设置。
3.1.1两个按键JButtonbtnStart=newJButton()
JButtonbtnStop=newJButton()
ScoreLabelscoreLabel
KeyEventPanelkeyEventPanel
WordFallLabelwordFallLabel
JSliderslider
3.1.2相关的全局变量
booleanSTART_FLAG=false;
ArrayList
ArrayList
intCHAR_VALUE=0;
intKEY_VALUE=0;
intPOINTER=0;
intMAXFALSE=3;
intSUCCESSTIME=0;
intTRYTIME=3;
intSPEED=1400;
publicstaticvoidinit(){
CODE_LIST.clear();
wordLabels.clear();
CHAR_VALUE=0;
KEY_VALUE=0;
POINTER=0;
MAXFALSE=3;
SUCCESSTIME=0;
TRYTIME=3;
}
3.1.3全局变量说明:
START_FLAG:
由于在程序启动时,各个组件就已经开始工作,用START_FLAG使他们通过if语句,不做任何动作,当START_FLAG==true时,便可以开始进行游戏,避免了反复启动线程可能会造成意外情况的麻烦。
CODE_LIST:
在游戏线程启动后,会产生很多的字符,这些字符若存放在局部空间内,很有可能会出现其他组件需要调用该值并且需要通过一系列传值过程才能实现,将这些值放在一个公共空间内的列表中,虽然会出现安全上面的问题,但是无疑为程序的实现减少了很多的工作,宽且这也只是一个游戏,在安全上的问题可以忽略。
wordLabels:
这个全局变量的设置,主要是为了实现下落字符的消失。
产生的字符会放在label中,通过控制label的行为来控制字符的行为。
将每一个WordLabel实例放在该列表中,可以通过在其他空间的控制来实现自己的想法。
CHAR_VALUE:
里面存放的是产生的字符的值,每一个字符都可以通过ASCII码转变为一个整数类型的值,通过比较整数值来确定是否匹配。
KEY_VALUE:
存放了最近一次从键盘内获得的值,由于可能出现连续出现相同字符的情况,KEY_VALUE里的值必须定时清空,考虑之后,与每次在每次比较完之后进行清空操作比较合适。
POINTER:
在CODE_LIST中会有很多数,但是当前正确的值,只有一个,那就是POINTER指向的位置,通过判断KEY_VALUE和CHAR_VALUE的值,对POINTER进行操作,具体操作会在ScoreLabel中说明。
MAXFALSE,TRYTIME:
最大失误次数,当超过这个次数时,当局游戏就会结束。
SUCCESSTIME:
本轮当前成功次数,统计成功次数用来积分。
SPEED:
控制字符下落速度,这个值会与难度条上的值具有映射关系。
3.1.4全局方法说明:
publicstaticvoidinit();
在新的一轮游戏开始前,全局变量中的值任然是上一轮的数据,需要对其中的数据进行初始化,设置为公共方法便于调用,其中的操作都是必须的操作,无多余也无漏缺。
3.2字符下落模块
3.2.1publicclassWordLabelextendsJLabel{}:
这个类主要负责创建一个下落的字符。
由于共有26个字母和10个数字会在游戏中被记为字符,通过随机函数(int)(Math.random()*35)产生36个随机数,根据ASCII码的规则,字符0-9对应的职位48-57,根据产生的值加上48,便可以得到字符0-9,同理字符A-Z对应的值为65-90,根据产生的值,由于是从10开始,所以加上55,就可以得到对应的字母字符,每产生一个字符,便将该字符添加到CODE_LIST中,以作他用。
3.2.2publicclassWordFallControlextendsThread{}:
在WordLabel被实例化后,需要有个方法控制其下落,由于会产生喝多字符,对众多字符进行统一管理,并且还要考虑到字符在其他情况下的动作,太过复杂,所以在这个组件中,只考虑字符的下落,每个字符交由一个控制对象控制。
每过SD.SLEEP毫秒的时间,WordLabel的位置便会下移一个单位,这个单位设置为50。
交由线程使其实现持续下降。
3.2.3publicclassWordFallLabelextendsJLabelimplementsunnable{}:
将前两个组件进行组合便是这个类的作用,只要这个实例运行正常,那么出现问题就不会是该模块的问题,除非是出现对字符的艺术化或是下落的幅度的改变这一类的需求。
3.3下落速度模块
JSliderslider=newJSlider();
JSlider自带的方法个头getValue()可以获得滑块的值,向滑块添加监听事件——addChangeListener(),在滑块移动时,可以将改变之后的值映射到SD.SPEED上,以控制速度的变化。
滑块只能在一轮游戏开始前滑动,从程序实现角度考虑的理由是,当移动滑块时,整个面板的焦点便会由按键转移到滑块上来,这是键盘事件监听的对象也会转移到这个滑块部件上来,这时候有两种方法:
一是在游戏中不允许移动滑块,二是在滑块中添加键盘监听事件。
相比较之下第一种简单而且符合大多数人的操作习惯,完全可以施行。
3.4按键模块设计
同上一小节所说的焦点的转移问题,将“开始”和“结束”设计为一个键,使整个面板的焦点可以在游戏开始到游戏结束都一直在同一个部件上,而且实现也很简单,只要持续监听START_FLAG的值,分辨当前的游戏状态,就能确定是该显示“开始”或是”结束“了。
3.5键盘监听设计
键盘事件不是要向textarea之类的部件中输入字符,而是向KEY_VALUE赋值,重写KeyListener类,使键盘按下事件的响应设置为KEY_VALUE=event.getKeyCode()。
3.6积分模块设计
publicclassScoreLabelextendsJLabelimplementsRunnable
该模块涉及到的变量有KEY_VALUE,CHAR_VALUE,CODE_LIST,POINTER,SUCCESSTIME,TRYTIME。
此时键盘事件监听中,只要有按键被按下,就会给KEY_VALUE赋一个值,POINTER指向一个位置,将CODE_LIST.get(POINTER)的值与KEY_VALUE比较如果相等,则POINTER的值加一,指向列表中的下一个值(如果列表中还有的话),SUCCESSTIME加一;如果不相等,考虑这个值存在时间是否太长了,每个值都只有10个单位周期的生命这个可以通过列表的长度判断出来,每个单位周期,都会向列表中添加一个新的字符,当CODE_LIST.size()-POINTER>9时,POINTER自加一,指向下一个,TRYTIME减一,否则不进行任何操作。
3.7时间模块设计
这部分主要是为了熟悉一边线程的用法
publicclassTimeLabelextendsJLabelimplementsRunnable
{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
privateDatedate=newDate();
privateSimpleDateFormatsdFormat=newSimpleDateFormat("yyyy年MM月dd日hh:
mm:
ss");
publicTimeLabel(){
newThread(this).start();
}
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
inti=0;
while(i<10){
try{
date=newDate();
this.setText(sdFormat.format(date));
newThread();
Thread.sleep(1000);
}catch(Exceptione){
//TODO:
handleexception
e.printStackTrace();
}
}
}
}
第4章调试分析
几乎每写一个类就会调试一次,类里面的修改也是很多的,下面只是找了三次比较大的改动进行说明。
4.1第一次调试:
第一次调试没有,加入按钮和难度条,主要是为了确定程序的主体部分能够正确执行。
发现的问题有。
一超出范围异常:
在所有线程启动后,记分板会不断调用CODE_LIST.get(POINTER)的方法,在第一次成功输入后由于记分板线程的sleep时间短于,WordLabel产生线程的sleep时间,所以,列表内还没有第二个值的时候便会要取第二个,所以出现这个问题。
二START_FLAG在线程执行的过程中何时判断的问题,开始时是放在第一位进行测试的,但是线程会在进行到START_FLAG为false就结束,除非重新实例化各个线程,但是,重新实例化又会在面板上添加新部件,导致新建一个游戏面板,所以让游戏进程一直执行,遇到START_FLAG为false是不做任何操作,线程并不中断。
4.2第二次调试:
第二次调试也可以说是第二次大修改的主题内容就是全局变量的设计。
随着整个程序添加的不见越来越多,将各部分产生的值保存在局部,并且调用get和set方法去获得值显得越来越麻烦,而且很多地方涉及到部件之间的相互取值,如scorelabel和wordfallcontrol两块,score需要里面的字符的值,而wordfall需要score里面对值的判断情况,以便字符在被按下后及时消失。
需要在两个类中添加太多static数据和方法,同时,静态变量和方法的调用又出现了很多限制问题。
最后决定如3.1.1中列出的一系列全局变量,大大简化了调用复杂度,也使整个程序显得简洁明了。
4.3第三次调试:
第三次调试是这次试验中最简单的问题,也是最复杂的问题,经验问题。
在一步一步添加完所有部件,并且对所有部件单独测试后,我发现只要点击开始按钮后,不能够正常监听键盘事件了。
开始时,键盘监听事件是放在WordLabel中执行的,在单独测试时不会有任何问题。
多方面查找资料也没有发现类似的问题。
于是从书本上的实例翻起,不经意想到,如果两个文本框同时显示却只能向获得焦点的那个文本框内输入字符这个情况,瞬间清楚了问题所在。
在进行调整后,重新执行程序,已经能够完成预期目标。
第5章运行结果
主在程序调试完成后,可使用的稳定版本的使用情况如下:
图6-1打字游戏开始界面
如图6-1显示。
程序开始时,左上角为记分板,没有任何数据显示;右上角为显示当前时间;中间部分使游戏的主要界面,用来显示下落的字符,由于游戏尚未开始,没有任何显示;左下角是游戏开始的按钮,当前显示为“开始,”在点击后,变为“结束”,并且记分板开始积分,游戏住界面开始下落字符,参照图6-2;右下角为难度调整框可以设置难度,左低右高。
图6-2打字游戏进行中
如图6-2显示。
游戏正常开始后,记分板开始积分,会记录正确的个数,如果超出时间为按下正确的字符,剩余机会就会减少一次,在记分板的最后面,会有提示当前应当输入的正确字符;游戏主界面会有字符持续落下,当按下正确的字符后,该字符消失,正确字符更新;左下角的按钮在点击使游戏开始后,变为“结束”按钮;右下角的难度条,可以在游戏前移动,游戏中不可以移动,具体原因参照在第三章——详细设计中,设计键盘监听事件的时候已经说明。
图6-3打字游戏正常退出
如图6-3显示。
当点击结束按钮后,左下角的按钮将会变为“开始”按钮;记分板保持显示,用于玩家查看此次游戏的成绩,游戏主界面上不会在产生下落字符,直到下轮游戏的开始;该轮游戏产生的字符继续下落完毕,但是此时已经可以开始进行下轮游戏了。
这点是设计上的缺憾,在以后会进行修改使其更加完善。
图6-4打字游戏错误过多退出
如图6-4显示。
此次本轮游戏结束的原因是错误过多,没有剩余机会了。
玩家仍然可以在记分板上查看到自己的成绩。
左下角的按钮也适时变为了”开始“按钮。
第6章课程设计总结
本次实验的内容选取的是打字游戏,最后完成了实验要求内的全部内容。
实验过程中,没有借助外力,参考内容也只是Java的API文档,在这一点上自己还是比较满意的。
实验完成后,与其他同学比较的情况是,美工不足,界面只是按照实验要求上的例图设计的,没有添加更有意思的东西。
这次试验有两个小的收获。
一是加深的对线程的理解。
在设计之初,出现的一个最大问题就是在一个线程内添加了另外一个线程,而且副线程不是自启动的,在主线程中断时,副线程也是出于终端状态,没有被执行到,经过多次断点测试发现了这个问题,这个结论可能是错误的,但是的确适用于我遇到的情况。
二是发现编程这个东西,跟技术有60%的关系,跟知识储备有30%的关系,剩下的10%就要看个人的经验。
30%看看书,查查资料就行。
60%注重的是对代码量的考验。
10%是对代码复杂度的考验,相似的代码敲一万遍,也还是那样,时间长了不做,就忘了,各个组件都能正常运行,组合在一起后却会出现焦点变化的问题,如果不是这次遇到,并且发现了,以后遇到类似的问题,我还是不知道。
这个问题虽然简单,我也一直迟迟没有请教老师或同学,一是觉得放不下脸,二也是锻炼一下自己的思维能力,可能第一次解决没有遇到过的问题会花费一天两天,第二次可能就是半天,而且自己发现问题所在,在自己的闹钟印象更加深刻,自己也更加有成就感。
大的收获是,自己这次尝试着从结构层次的角度考虑程序的设。
将整个程序分为各个组件,最后通过组件的结合形成整个程序。
程序简单,并没有很多层次,而且层次对程序的重要性也不是那么明显,但是尝试着这么做,并且在以后的每一次都向这方面努力,我想对我程序员生活的提升是会有很大的帮助的。
实验只需要选取一个实验完成,但是其他实验也是老师花费心思,想出来的题目,比如说图形编辑系统,好像很少有人选,但是看上去也是挺有意思的,决定在寒假的时候,着手实现以下,虽然java的优势并不在于此,但是从以上所说的各个方面也很有必要。
第7章参考文献
JDK1.5API_CN(全).chm:
C:
\Users\admin\Desktop\API\JDK1.5API_CN(全).chm
第8章附录:
带注释的源代码
本章附上整个课程设计的游戏源代码,以及相关测试代码。
相关组件:
Compone
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 课程设计 打字 游戏