中南大学Java课设打字游戏报告.docx
- 文档编号:18247044
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:40
- 大小:1.72MB
中南大学Java课设打字游戏报告.docx
《中南大学Java课设打字游戏报告.docx》由会员分享,可在线阅读,更多相关《中南大学Java课设打字游戏报告.docx(40页珍藏版)》请在冰点文库上搜索。
中南大学Java课设打字游戏报告
中南大学
Java课程设计报告
题目打字游戏
学生姓名
学号
指导教师穆帅
学院信息科学与工程学院
专业班级计科12xx
完成时间2015.1.22
第一章绪论
1.1课题研究背景
如今java应用范围越来越广,人们对打字的速度要求越来越高,此次设计的内容就是打字游戏的实现,通过在游戏的欢愉中训练个人的打字速度。
1.2研究的意义和目的
这次课程设计通过java编程来实现打字游戏的功能,人们总是不能熟悉的键盘上字母的位置,从而导致打字速度慢,致使一些操作让人感觉反应慢。
现在是电脑时代,为了能让人们熟悉键盘上字,为了让工作变的更顺利。
在今天科技时代,人们闲时来耍耍对工作有意义的小游戏是很多人的选择。
所以这款打字母小游戏是很有意义的。
本次课程设计题目主要应用到java面向对象程序设计语言中Swing组件和GUI(图形用户界面)当中的一些知识,当然也用java中大部分基础知识,如JAVA的基本控制结构、数组、输入与输出等等。
1.3题目描述和要求
【问题描述】设计实现一个打字游戏,界面参见下图,具备如下功能:
(1)点击“开始”按钮,产生随机字符从屏幕上方下落;
(2)点击键盘上按钮,如果正确,当前的字符消失,产生新的按钮从上方继续落下。
(3)提供速度调整和积分功能。
第二章系统需求分析
2.1系统流程分析
本游戏主要有五个部分:
开始、结束、排行榜、选关、滑动条。
这五个部分中开始表明游戏开始进行;结束表明游戏结束,同时提交分数;排行榜则排出当前提交过的分数的前几名,如果只有一个分数,则此分数为第一名,若两名,则比较后,较大的为第一名,另一个为第二名,以此类推,控制最多显示前五名;选关主要是选择不同的游戏模式;滑动条主要是调节字母下降的速度。
游戏首先要点击开始按钮,默认的关数是第一关,开始后字母开始下降,通过玩家消去对的个数来计分,第一关顺利完成后,弹出一个窗口,然后进入下一关,若错误过多则仍停留在此关,直到完成本关,才能进入下一关。
在每一关中,都可以通过调节滑动条来改变字母下降到速度。
在游戏界面,可以看到玩家自己当前的正确个数以及错误个数和当前的所得总分,此外,在游戏进行中,还有一些干扰的字母,即这些字母主要是用来干扰玩家的注意力的,这些字母用黄色表示,这些字母是无法消去的,不计入分数。
为了游戏的交互性,还设置了按键声音,即当正确消除一个字母时有一种声音,丢失一个字母时也有一种声音。
最后,当玩家点击结束按钮时,此游戏结束,同时将此玩家的分数数据存入文档,并和之前的分数排序。
2.2系统设计要求
这个游戏的主要目的是练习打字,因此,设计的最基本效果是打出相应的字符,游戏中的字符就消失。
再由此功能上完善本游戏,如滑动条的提速,选择不同的关数模式,排行版,积分以及干扰的字符等。
本次课程设计题目主要应用到java面向对象程序设计语言中的一些知识,运行的环境是java环境。
第三章系统总体设计
3.1系统界面结构图
图3.1系统界面结构图
3.2模块关系
本游戏主要有两个模块,一个是游戏模块,一个是排行模块,这两个模块的连接是通过结束按钮来实现的,即通过点击结束按钮来结束游戏,同时将要排序的新数据传入文档中。
游戏模块包括之前提及的开始,选关,滑动条等,排行模块包括排行榜按钮部分以及连接的结束部分。
第四章系统详细设计
4.1数据结构描述
游戏中的最重要部分是下降的字母,而这些字母是通过一个个线程来实现的,因此需要多线程来实现,即利用一个while循环来实现Threadt=newThread(newTthread());t.start();的多线程启动。
本程序中,主函数中是一个函数Frameframe=newFrame();主要是定义一些参数,而在Frame()中调用了jbInit();即给面板布局以及给开始,结束,排行榜,滑动条,选关加一些监听。
4.2成员函数定义
PublicFrame()是类publicclassFrameextendsJFrameimplementsRunnable的构造函数,其中主要是定义音乐文件参数以及jbInit()函数(用于布局以及对按钮增加监听)。
而在类classTthreadimplementsRunnable中的run()函数定义了对每个线程的操作,即针对每个字母下降过程的相关定义,字母的下降效果主要通过坐标值的改变来实现,X是以随机产生的数,即在顶端的任意位置出现,继而通过对Y的改变来实现位置的下降或者左右摇摆的效果。
而在最外层的run()函数中,通过循环来实现多线程的启动,以及完成每关后或者未完成本关的效果。
4.3重要模块说明
4.3.1Jpanel背景图片的实现:
classGetPanelextendsJPanel
{
intwidth=0,hight=0;
Stringimgpath="";
publicGetPanel(intwidth,inthight,Stringfile)
{
this.width=width;
this.hight=hight;
imgpath=file;
}
protectedvoidpaintComponent(Graphicsg)
ImageIconicon=newImageIcon(imgpath);
Imageimg=icon.getImage();
g.drawImage(img,0,0,width,hight,this);
}
}
通过JPaneljPanel1=newGetPanel(573,419,"D:
//p4.jpg");来完成面板的背景图片的添加。
4.3.2字符输入响应:
classMyListenerextendsKeyAdapter{
publicvoidkeyPressed(KeyEvente){
Stringuu=e.getKeyChar()+"";
for(inti=0;i Beanbean=((Bean)number.get(i)); if(uu.equalsIgnoreCase(bean.getParameter())){ zhengque+=1; number.removeElementAt(i); bean.getShow().setVisible(false); jLabel2.setText("正确: "+zhengque+"个,错误: "+cuowu+"个"); sum=sum+1; jLabel5.setText("本关总分: "+sum); Music_chenggong.play(); break; } }//endoffor Musci_anjian.play(); }//endofpublicvoidkeyPressed(KeyEvente) }//endofclassMyListenerextendsKeyAdapter 当键盘输入的字符与下降的字符中的字母有相同的时候,就把那个字符所在的标签设为不可见,同时正确的个数加一。 4.3.3每个字符的下降线程: classTthreadimplementsRunnable{ publicvoidrun(){ booleanfo=true; intY=0,X=0; JLabelshow=newJLabel(); show.setFont(newjava.awt.Font("微软雅黑",Font.PLAIN,33)); show.setForeground(Color.white); jPanel1.add(show); X=20+(int)(Math.random()*500); Stringparameter=list[(int)(Math.random()*list.length)]+""; Beanbean=newBean(); bean.setParameter(parameter); bean.setShow(show);//this.show=show; number.add(bean); show.setText(parameter); while(fo){ //---------------------数字下移-------------------- if(rush_count==0) show.setBounds(newRectangle(X,Y+=2,33,33)); if(rush_count==1) { if(X<565) { show.setBounds(newRectangle(X+=1,Y+=1,33,33)); } if(X==565) { X=0; show.setBounds(newRectangle(X+=1,Y+=1,33,33)); } } if(rush_count==2) { if(Y<=50) { if(X<280)show.setBounds(newRectangle(X+=1,Y+=1,33,33)); if(X>=280)show.setBounds(newRectangle(X-=1,Y+=1,33,33)); } if(Y<280&&Y>50) { h=2*((int)(Math.random()*2))-1;//0-0.9999999 show.setBounds(newRectangle(X=X+h*6,Y+=2,33,33)); } if(Y>=280) { show.setBounds(newRectangle(X,Y+=10,33,33)); } } try{ Thread.sleep(100-rapidity); jLabel1.setText("速度: "+rapidity); }catch(InterruptedExceptione){ e.printStackTrace(); } if(rush_count==1) { jLabel4.setText("第二关: 15个"); } if(rush_count==2) { jLabel4.setText("第三关: 20个"); } if(Y>=419){ fo=false; for(inti=number.size()-1;i>=0;i--){ Beanbn=((Bean)number.get(i)); if(parameter.equalsIgnoreCase(bn.getParameter())){ //超过419的parameter是出现在屏幕上存在bean中的 cuowu+=1; jLabel2.setText("正确: "+zhengque+"个,错误: "+cuowu +"个"); number.removeElementAt(i); Music_shibai.play(); if(cuowu==5) { JOptionPane.showMessageDialog(null,"错误太多,请重新开始! ","打字母游戏规则",JOptionPane.PLAIN_MESSAGE); //paiduan='false'; } break; } } } //endofif(Y>=419) } //endofwhile } //endofvoidrun() } //endofclassTthread 主要是对每个字符下降的线程内容进行定义,包括现场中X的随机产生位置,以及针对不同关数Y的变化,主要体现为,第一关中,Y的值是常量递增的,第二关中,主要是整体右移,第三关中,包括左右移,左右颤抖,以及快速下降。 4.3.4外层run函数各个关卡的说明: if(paiduan.equals("true")) { //判断是否是自然结束 if(zhengque/cuowu>=2) { if(cuowu==100){cuowu=0;zhengque=rush[rush_count];} //有问题 JOptionPane.showMessageDialog(null,"恭喜你过关了"); rush_count+=1; //自动加1关 if(rush_count { Threadt=newThread(this); //调用run()函数 t.start(); } else { JOptionPane.showMessageDialog(null,"...恭喜过了最后一关..."); count=1; }//endofif(zhengque/cuowu>=2)*/ } else { //elseofif(zhengque/cuowu>=2) JOptionPane.showMessageDialog(null,"请再接再励"); //rush_count还是原来的值,从当前关重新开始 //rush_count=0; count=1; } //endofif(paiduan.equals("true")) } else { //elseofif(paiduan.equals("true")) rush_count=0; count=1; } 此部分主要是对每关结束时的判断部分,若正确错误个数达到一定要求,显示“恭喜你过关了”,关数加一,若此关为最后一关,显示为“恭喜你过了最后一关”。 否则显示“请再接再励”。 第五章调试分析 5.1问题及解决方法 一开始程序的主要问题是计数方面的问题,即正确错误个数的统计问题,即每次的总数总是不和设置的值intrush[]={10,15,20}相同,相反,是一个累加过程,这是一个很奇怪的现象,这个功能的错误还影响到后面的计分的难以实现和排序的错误。 根据分析这个问的可能起源,通过多次的实验,找到了问题的起源即在每关结束时的判断部分中的每关完成后,没有对count,cuowu,zhengque的值重新置为初始值,这导致了数据的累加。 此外还有的问题是排行榜的问题,之前绞尽脑汁也没有发现哪里出错了,所得的数据就是写不进文档中存储起来,查阅资料也查不出问题的所在,后来通过对一个可以实现的程序相比较发现,是少了bw.close();关闭文件流这个过程。 就是这样一个简单的细节就造成了如此大的影响。 第六章运行结果 6.1程序运行结果截图 图6.1.1游戏界面图 图6.1.2游戏运行界面图 图6.1.3游戏第一关过关界面图 图6.1.4游戏最后一关过关界面图 图6.1.5加黄色字符干扰图 图6.1.6排名图 第七章课程设计总结 7.1总结内容 第八章参考文献 [1]丁振凡.Java语言使用教程第二版[M].清华大学出版社,2008.1. [2]张桂珠.Java面向对象程序设计第二版.北京邮电大学出版社,2003.3. [3]耿祥义,张跃平.java2实用教程第三版[M].清华大学出版社,2006。 8 [4]卫建文.计算机网络编程语言—java.电子工业出版社,2006.5 附录: importjava.applet.Applet; importjava.applet.AudioClip; importjava.awt.Color; importjava.awt.Dimension; importjava.awt.Font; importjava.awt.Graphics; importjava.awt.Image; importjava.awt.Rectangle; importjava.awt.Toolkit; importjava.awt.event.ActionEvent; importjava.awt.event.ActionListener; importjava.awt.event.KeyAdapter; importjava.awt.event.KeyEvent; importjava.io.BufferedReader; importjava.io.BufferedWriter; importjava.io.File; importjava.io.FileReader; importjava.io.FileWriter; importjava.io.IOException; importjava.util.Vector; importjava.util.Arrays; importjavax.swing.BorderFactory; importjavax.swing.ImageIcon; importjavax.swing.JButton; importjavax.swing.JComboBox; importjavax.swing.JFrame; importjavax.swing.JLabel; importjavax.swing.JOptionPane; importjavax.swing.JPanel; importjavax.swing.JSlider; importjavax.swing.UIManager; importjavax.swing.event.ChangeEvent; importjavax.swing.event.ChangeListener; publicclassFrameextendsJFrameimplementsRunnable{ JPanelcontentPane;//最外面最大的面板 JPaneljPanel1=newGetPanel(573,419,"D: //p4.jpg");//一般轻量级面板容器.GetPanel继承Jpanel的类的构造函数 JButtonjButton1=newJButton(); JButtonjButton2=newJButton(); JButtonjButton3=newJButton();//规则 JSliderjSlider1=newJSlider();//java滑块 JLabeljLabel1=newJLabel();//速度 JLabeljLabel2=newJLabel();//正确错误个数 JLabeljLabel3=newJLabel();//选关 JLabeljLabel4=newJLabel();//告知第几关,有几个 JLabeljLabel5=newJLabel(); JLabeljLabel6=newJLabel(); JLabelimag=newJLabel(newImageIcon("D: //bzx.gif")); privateJComboBoxbox; privateString[]a={"1","2","3"}; intcount=1,rapidity=50;//count当前进行的个数,rapidity游标的位置 intzhengque=0,cuowu=0; intrush[]={10,15,20};//游戏每关的个数可以自由添加.列{10,20,30,40,50} intrush_count=0;//记录关数 inth; staticintsum=0; doublescore[]; charlist[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9'};//,'^','%','@',',','.'随机出现的数字可以自由添加 charlist2[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','$','#','*','/'}; Vectornumber=newVector(); Stringpaiduan="true"; AudioClipMusci_anjian,Music_shibai,Music_chenggong;//AudioClip接口是用于播放音频剪辑的简单抽象 publicFrame(){ try{ setDefaultCloseOperation(EXIT_ON_CLOSE);//在关闭窗口的同时,会结束这个进程 Musci_anjian=Applet.newAudioClip(newFile("sounds//anjian.wav").toURI().toURL());//URI用来表示抽象路径名 Music_shibai=Applet.newAudioClip(newFile("sounds//shibai.wav").toURI().toURL());//通过toURI方法将其转换为URI, Music_chenggong=Applet.newAudioClip(newFile(//然后通过URI.toURL方法将URI装换为URL "sounds//chenggong.wav").toURI().toURL()); box=newJComboBox(a); jbInit(); }catch(Exceptionexception){ exception.printStackTrace();//printStackTrace()表示打印异常堆栈信息,一般是打印到控制台,方便问题的定位和分析。 } } privatevoidjbInit()throwsException{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 Java 打字 游戏 报告