Java课程设计打字游戏
- 格式:docx
- 大小:43.71 KB
- 文档页数:10
中南大学Java课程设计报告题目打字游戏学生姓名窦立阳指导教师陈丽萍学院信息科学与工程学院专业班级计科1204完成时间 2015年1月15日目录第二章总体设计界面设计 (4)运行流程 (4)逻辑设计 (4)积分设计 (4)第三章详细设计主面板 (5)两个按键 (5)相关全局变量 (5)全局变量说明 (5)相关全局函数 (7)字符下落模块 (7)WordLabel (7)WordFallControl (8)WordFallLabel (8)速度控制模块 (8)按键模块设计 (8)键盘监听事件 (9)积分模块设计 (9)事件模块设计 (10)第四章调试分析第一次调试 (11)第二次调试 (11)第三次调试 (12)第五章运行结果 (13)第六章课程设计总结 (17)第七章参考文献 (19)第八章附录:带注释的源代码Wordfall (20)WordFallControl类 (20)WordLabel类 (22)WordFallLabel类 (23)ScoreLabel类 (24)StartButton类 (25)TimeLabel类 (26)AAAAA类:程序的主函数入口 (28)Maintain类 (30)第一章实验要求【问题描述】设计实现一个打字游戏,界面参见图2-2,具备如下功能:●点击“开始”按钮,产生随机字符从屏幕上方下落;●点击键盘上按钮,如果正确,当前的字符消失,产生新的按钮从上方继续落下。
●提供速度调整和积分功能。
图2-2 打字游戏界面第二章总体设计界面设计根据实验要求中的图2-2,在主面板中,有一个模块控制各个字符的生成并且控制他们的自动下落,并在正确触发时,字符不可见;“开始”和“结束”,用于字符下落的开始和结束;运行流程程序启动,程序等待按键“开始”的事件的触发;当“开始”键触发后,负责字符下落的模块,将持续产生字符,并使其下落;键盘开始被监听,从键盘的按键触发,向程序返回值;积分模块开始工作,将字符下落模块的字符和键盘事件返回的值进行比较,得出积分,并且将积分值显示在面板上;如果点击“停止”按键,所有模块停止工作,等待程序关闭,或者等待“开始”逻辑设计字符不断产生并且下降,需要一个线程控制产生字符,然后还应该有一个线程对面一个字符,控制其下落。
键盘被按下后,立刻会有值返回到程序中,积分模块会每隔一段时间将,键盘事件返回的值,和当前需要按下的值进行比较。
积分说明当开始产生字符后,会有很多字符都是可输入的,但是当前可输入的字符只有一个,所以可以考虑设计一个链表,没当产生一个字符,便将该字符存入链表中,并且有一个指针永远指向当前需要输入的值。
由于界面大小有限,当字符持续下落超过界面大小时,不能够通过玩家来猜测,已经不见的当前需要输入字符,所以当界面上字符超过十个时,便认为该玩家反应时间过长,判定其为错误,并且将当前需要输入的字符设置为下一个。
并且从游戏角度考虑,当这种情况出现3次后,便可以判定本轮游戏结束。
第三章详细设计主面板public class GameFrame extends JFrame主面板中主要涉及的是两个按键,各个组件在面板上的布置,以及其他的全局变量的设置。
= new JButton()= new JButton()ScoreLabel scoreLabelKeyEventPanel keyEventPanelWordFallLabel wordFallLabelJSlider slider相关的全局变量boolean START_FLAG = false;ArrayList<Integer> CODE_LIST = newArrayList<Integer>();ArrayList<WordLabel> wordLabels = newArrayList<WordLabel>();int CHAR_VALUE = 0;int KEY_VALUE = 0;int POINTER = 0;int MAXFALSE = 3;int SUCCESSTIME = 0;int TRYTIME = 3;int SPEED = 1400;public static void init(){();();CHAR_VALUE = 0;KEY_VALUE = 0;POINTER = 0;MAXFALSE = 3;SUCCESSTIME = 0;TRYTIME = 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:控制字符下落速度,这个值会与难度条上的值具有映射关系。
public static void init();在新的一轮游戏开始前,全局变量中的值任然是上一轮的数据,需要对其中的数据进行初始化,设置为公共方法便于调用,其中的操作都是必须的操作,无多余也无漏缺。
字符下落模块public class WordLabel extends JLabel{}:这个类主要负责创建一个下落的字符。
由于共有26个字母和10个数字会在游戏中被记为字符,通过随机函数(int)()*35) 产生36个随机数,根据ASCII码的规则,字符0-9对应的职位48-57,根据产生的值加上48,便可以得到字符0-9,同理字符A-Z对应的值为65-90,根据产生的值,由于是从10开始,所以加上55,就可以得到对应的字母字符,每产生一个字符,便将该字符添加到CODE_LIST中,以作他用。
public class WordFallControl extends Thread{}:在WordLabel被实例化后,需要有个方法控制其下落,由于会产生喝多字符,对众多字符进行统一管理,并且还要考虑到字符在其他情况下的动作,太过复杂,所以在这个组件中,只考虑字符的下落,每个字符交由一个控制对象控制。
每过毫秒的时间,WordLabel 的位置便会下移一个单位,这个单位设置为50 。
交由线程使其实现持续下降。
public class WordFallLabel extends JLabel implements unnable{}: 将前两个组件进行组合便是这个类的作用,只要这个实例运行正常,那么出现问题就不会是该模块的问题,除非是出现对字符的艺术化或是下落的幅度的改变这一类的需求。
下落速度模块JSlider自带的方法个头getValue()可以获得滑块的值,向滑块添加监听事件——addChangeListener(),在滑块移动时,可以将改变之后的值映射到上,以控制速度的变化。
滑块只能在一轮游戏开始前滑动,从程序实现角度考虑的理由是,当移动滑块时,整个面板的焦点便会由按键转移到滑块上来,这是键盘事件监听的对象也会转移到这个滑块部件上来,这时候有两种方法:一是在游戏中不允许移动滑块,二是在滑块中添加键盘监听事件。
相比较之下第一种简单而且符合大多数人的操作习惯,完全可以施行。
按键模块设计同上一小节所说的焦点的转移问题,将“开始”和“结束”设计为一个键,使整个面板的焦点可以在游戏开始到游戏结束都一直在同一个部件上,而且实现也很简单,只要持续监听START_FLAG的值,分辨当前的游戏状态,就能确定是该显示“开始”或是”结束“了。
键盘监听设计键盘事件不是要向text area 之类的部件中输入字符,而是向KEY_VALUE赋值,重写KeyListener类,使键盘按下事件的响应设置为KEY_VALUE = ()。
积分模块设计public class ScoreLabel extends JLabel implements Runnable该模块涉及到的变量有KEY_VALUE,CHAR_VALUE,CODE_LIST,POINTER,SUCCESSTIME,TRYTIME。
此时键盘事件监听中,只要有按键被按下,就会给KEY_VALUE赋一个值,POINTER指向一个位置,将(POINTER)的值与KEY_VALUE比较如果相等,则POINTER的值加一,指向列表中的下一个值(如果列表中还有的话),SUCCESSTIME加一;如果不相等,考虑这个值存在时间是否太长了,每个值都只有10个单位周期的生命这个可以通过列表的长度判断出来,每个单位周期,都会向列表中添加一个新的字符,当()-POINTER > 9时,POINTER自加一,指向下一个,TRYTIME减一,否则不进行任何操作。
时间模块设计这部分主要是为了熟悉一边线程的用法public class TimeLabel extends JLabel implements Runnable{/****/private static final long serialVersionUID = 1L;private Date date = new Date();private SimpleDateFormat sdFormat= new SimpleDateFormat("yyyy 年MM月dd日 hh:mm:ss");public TimeLabel(){new Thread(this).start();}@Overridepublic void run() {hm:第四章附录:带注释的源代码本章附上整个课程设计的游戏源代码,以及相关测试代码。