《面向对象程序设计(Java)》课程设计报告
华 北 科 技 学 院
课程设计说明书
班级: 网络B071 姓名: 徐成胜
设计题目: 抢钱游戏
设计时间: 2009.12.28 至 2010.1.22
指导教师: 孙改平
评 语:
评阅成绩: 评阅教师:
目 录
11 引 言
11.1课程设计选题
11.2课程设计的目的
11.3本选题的设计背景
12 系统分析与设计
12.1 功能需求
12.2 系统的开发运行环境
12.3 系统总体设计
23 数据库设计
23.1 数据库概念结构
23.2 数据库逻辑结构
23.3 数据库的实现
24 详细设计与实现
24.1 登录模块
24.2 ×××模块
24.3 ×××模块
24.4 ×××模块
24.5 ×××模块
3结 论
3参 考 文 献
[单击此处键入附录题名]附录
[可选项]
3
1 引 言
1.1课程设计选题
《抢钱游戏》
1.2课程设计的目的
使学生巩固和加深以Java 语言为基础的面向对象编程技术理论知识的理解,提高实际动手编程能力的培养,掌握以Java为核心的应用软件开发
,达到能独立阅读、编制和调试一定规模的Java程序的水平。
1.3本选题的设计背景
1.3.1选题原因:
开始本来想做一个简单一点的电话号码查询系统,因为其题目要求只是简单的涉及了表的查询,修改,插入,删除等要求,以前学习别的语言时对其接触的比较深,因此我想选其作为我这次课程设计的题目。
然而当真的选择其作为题目时,和老师商量时,却听老师说其设计方法和题目难度不大,相应的即使你做得再好,分数也不会太高!听老师建议做抢钱游戏更能体现Java这门学科语言的特点,因此我就选择其作为我的课程设计题目。
因为我真的想学好这门编程语言,所以当时虽然对这个编程一点头绪都没有,但是我还是选择其作为我的课程设计题目。
1.3.2选题设计意义:
因为其是java游戏的设计,所以所先必须体现的就是java的AWT组件的使用,这是我这个游戏设计的最根本的体现。还有就是游戏操作时需要用到鼠标,所以鼠标监视器必不可少,还有动作监视器这个跟组件一起用得就更不用说了!由于随着对程序的编写,一步一步的完善了其功能,本着更深一步的原则,我还把数据库的一些操作加了进去,虽然对数据库的设计并没有什么深层次的考虑,只是建了几张表,然后用java对其操作,但却使得游戏的功能更加完善!
最后需要提的一点,就是使用的Timer 类这个完成时间控制,可以说前期使用这个类真的是我很烦恼,查阅了大量的资料,才最终在网上找到了一个类似的方法使用,并通过大量的数据分析才弄懂了这个类方法的使用。
系统分析与设计
2.1 功能需求
游戏提供一个窗口,在窗口中显示一个钱币。每个钱币在窗口中显示一段时间后消失。游戏玩家使用鼠标点击钱币,如果在钱币消失之前点到钱币,玩家得分,游戏继续;否则游戏结束。当游戏玩家得分数达到一定数值时,钱币显示时间减少。当游戏结束后,提供一个分数
功能。显示分数最高的三个玩家姓名和分数。下面对游戏的规则细节进行说明。
· 钱币显示的位置。在窗口中给出了4行4列16个位置,在这些位置上可以放置钱币。
· 钱币显示的时间长度。最初每个钱币显示的时间长度为2秒钟,以后每次晋级,显示时间长度减少1/3。
· 加分规则。每次点到一个钱币玩家的分数加10分。
· 钱币更新规则。当玩家点到钱币后,钱币消失,在另一个位置上重新出现一枚钱币。
· 分数显示。在游戏进行过程中,在窗口中显示玩家得到的分数。
· 晋级规则。每次分数达到160的整倍数时,游戏晋升一级。
排行榜。游戏结束后,如果玩家的分数比当前的第三名高,进入排行榜显示。
2.2 系统的开发运行环境
本系统开发平台: Java + Microsoft Access2003
本系统集成开发环境: Eclipse
本系统运行环境: windows xp
2.3 系统总体设计
2.3.1游戏操作面版
一个游戏开始必须的就是一个游戏面板,里面包括游戏的所有操作按钮,游戏使用者可以通过点击相应的按钮对游戏进行简单的设置,比如设置游戏的难度,游戏开始,游戏结束,游戏暂停,游戏继续,观看游戏的积分排行榜等等!
这些都是游戏面板必须包括的,所以建一个类继承JFrame组件来完成游戏面版的这些功能,里面必须设置一些按钮,菜单栏和菜单条。
2.3.2游戏工作面板
这个面板是游戏“钱”币显示的地方,当游戏开始时,“钱”通过随机数字处理在游戏工作面版里不断的显示,然后游戏用户可以通过点击游戏工作面版里出现的“钱”使钱不断的变幻位子。
若是一定时间后,用户始终没点“钱”,那么游戏就将失败。玩家可以通过游戏操作界面的开始按钮,重新开始新游戏。
2.3.3游戏难度设定
这个需要设置一下时间的长短,通过主操作界面调用后,调用设置不同的时间,还有就是当分数到达一定后,对时间进行处理函数,使时间减少!
2.3.4分数设置
这个是分数处理,一个继承标签的类,可以加到主界面中。
2.3.5钱币
这也是一个继承标签的类,里面只有标题的设置。
2.3.6数据库的操作
这里包括了4个类,当然可以简化成两个说明,因为其事实上只实现了两个功能,a.就是对数据库中表的查询,然后显示b.就是对数据库中的表中数据进行更新。
A. 对数据库中表的查询,是根据游戏操作界面中的查询成绩难度而选着查询表的,这样可以宣示不同难度等级的分数的记录
B. 对数据库中表的更新也是得根据游戏设置难度进行更新的,当游戏设置的难度不同,调用不同的方法队数据库处理,然后用玩家得分与数据库中的成绩进行比较,当高于数据库中的成绩时更新。
因为其具体功能实现过程比较复杂,这里就不介绍显示具体过程,将在后面的功能模块中详细介绍这部分功能。
程序大体功能大致就上述这些,关键是操作界面把所有的功能连接起来,这就得通过监视器来实现功能的调用,通过不同的调用类功能里的方法,游戏才能进行下去。
数据库设计
1.1 数据库概念结构
在这个数据库我建了3个表,表名分别为show1,show2,show3这是用来存防游戏的前3名记录的,每个表中的数据属性都是相同的,之间没有什么相互的约束。
因为在使用这些表时都是分开用的,其之间的数据没什么关系,所以没有相应的约束。每个表都有3个属性,rank(文本),name(文本),grade(数字),然后rank为主码。
上面的是整个表的E-R图。
3.2 数据库逻辑结构
各个表的逻辑设计模式如下:
show1(rank,name,grade)
show2(rank,name,grade)
show3(rank,name,grade)
其中每个表的rank是主键,注意一点是,每个表中的rank,name,grade都是独立的,并不是指同一个,他们是毫无关系,独立存在的。
3.3 数据库的实现
表的建立过程如下图所示:
上述为建表的过程,完成以后如下图所示:
表show2和show3的建表过程和上述表show1的建立过程大致相同,在这里就不一一详细说明了,到此数据库建立完成,接下来就可以使用了SQL语句进行相应的操作了。
详细设计与实现
4.1 操作界面模块
4.1.1模块功能演示
上图为游戏的操作界面,玩家可以通过上面的按钮对游戏进行相应的操作。第一个为游戏菜单栏,里面有游戏开始,继续和结束菜单,如下图所示:
接下来在等级设置的菜单栏中有等级的设置,如下图所示:
暂停和继续菜单栏中有暂停和继续菜单,玩家可以点击暂停按钮对游戏进行暂停,点击继续按钮可以继续游戏。排名显示里有游戏的不同难度等级的分数记录,点击可以显示记录。
帮助菜单栏里有帮助菜单,点击帮助菜单会弹出一个消息提示对话框,里面有游戏的操作方法,和制作人信息。具体信息如下图所示:
4.1.2模块算法
因为这个游戏操作页面大部分都是按钮的创建和按钮的组合,所以就不多说这些的按键组合的方法了。
在这里介绍一下动作监视器的动作方法,因为其把所有的功能组合起来了,是最主要的一段代码,缺少了不行。代码算法如下:
public void actionPerformed(ActionEvent e){
if(e.getSource()==item10){
tmr.stop();}
else if(e.getSource()==item11){
JOptionPane.showMessageDialog(this, "用手标点击画面中出现得“钱”,每点中一次得10分,没点中游戏结束。 制作人:徐成胜", "抢钱游戏", JOptionPane.INFORMATION_MESSAGE);}
else if(e.getSource()==item7){
init();
start();}
else if(e.getSource()==item9){
tmr.start();}
else if(e.getSource()==item8){
System.exit(0);}
else if(e.getSource()==item1){
dur.setTimeLength(2000);
d=1;}
else if(e.getSource()==item2){
dur.setTimeLength(1500);
d=2;}
else if(e.getSource()==item3){
dur.setTimeLength(1000);
d=3;}
else if(e.getSource()==item4){
show=new Show("显示排名",1);
show.setVisible(true);}
else if(e.getSource()==item5){
show=new Show("显示排名",2);
show.setVisible(true);}
else if(e.getSource()==item6){
show=new Show("显示排名",3);
show.setVisible(true);}
else if(e.getSource()==tmr) {
stop();
board.dispear();
JOptionPane.
showMessageDialog(this,(new StringBuilder("您的分数是:")).append(s.getScore()),"分数提示",JOptionPane.INFORMATION_MESSAGE);
if(d==1){
new getData(s.getScore(),1);}
else if(d==2){
new getData(s.getScore(),2);}
else if(d==3){
new getData(s.getScore(),3);}
}
}
4.1.3功能介绍
这个操作界面的功能监视器功能就是把所有的按钮个监视起来,当点击相应的按钮时,动作被激发,就进行不同的调用,使其进行相应的操作。
这里面还要说一下的就是tmr = new Timer(dur.getTimeLength(), this)这个代码和对应的else if(e.getSource()==tmr),这个方法的使用比较难,许多书本上都没有相关的介绍,这个是时间监视操作,在网上查找了很多资料才发现相关的Timer(2000,ActionListener)这个方法。
4.2 游戏工作模块
4.2.1模块功能演示
当点击游戏开始时,游戏开始进行,工作面板上出现“钱”,玩家需要用手标去点击钱,当点中时,分数增加10,不点击的话一段时间钱消失,游戏结束并弹出得分对话框
4.2.2模块算法
这部分的主要算法应该在钱的随即出现的处理上,主要代码如下:
public int getRow()
{
return (int)(Math.random() * 4D);
}
public int getCol()
{
return (int)(Math.random() * 4D);
}
public void placeMoney()
{
m.setLocation(getRow() * 116, getCol() * 117);
m.setVisible(true);
}
然后对于处理鼠标点钟钱以后,钱就会出现在另外一个地方,这里用到了鼠标的监视器,其主要代码如下:
board.getM().addMouseListener(this);
public void mouseClicked(MouseEvent e)
{
board.dispear();
addScore();
s.display();
stop();
start();
}
4.2.3功能介绍
其功能主要是当鼠标点击中钱时,激发鼠标点击事件,然后执行board.dispear();s.display();stop();start();这些方法使的钱在当前位子消失,然后出现在另外一个随机位子。
4.3 难度设置模块
4.3.1模块功能演示
当玩家点击不同低级,中级,高级不同的按钮时,设置不同的游戏起始间隔时间其主要是通过类中的监视器调用时间SetTimer类中的函数对起始时间进行设置。
4.3.2模块算法
这里SetTimer类中的设置时间函数代码如下:
public int getTimeLength()
{
return timeLength;
}
public void setTimeLength(int len)
{
timeLength = len;
}
然后主类通过
else if(e.getSource()==item1)
{
dur.setTimeLength(2000);
d=1;
}
else if(e.getSource()==item2)
{
dur.setTimeLength(1500);
d=2;
}
else if(e.getSource()==item3)
{
dur.setTimeLength(1000);
d=3;
}
对其进行调用。
4.3.3功能介绍
当点击低级时,起始时间设置为2秒,也就是说开始时,你需要在两秒种之内点击画面中出现的钱,点击中级按钮设置起始时间为1.5秒,高级时为1秒。
4.4 数据库显示模块
4.4.1模块功能演示
因为数据库这方面的东西处理起来可以多种多样,选择的数据库不一样,连接方法上有点少许的差别。
我选用的是Mcrosoft access2003,因为这个数据库的使用方法是课本上介绍的,用这个数据库更能体现课本和实践的结合。功能显示分为3个不同难度的显示,因为保存的数据是3个不同难度的记录,所以需要对3个不同的表进行相应的操作,不能在一个表中包括所有的。演示图如下:
这个是低难度的成绩排行榜,根据题目要求只要求前3名的成绩记录,所以显示成绩时,我只是把成绩记录前3名保存了下来,然后通过表组建显示了出来,其余低于前3名的分数记录不作处理。
这个是难度为中级的排名显示
这个是难度为高级的排名显示,因为这个当时还没玩高难度的游戏,所以里面的姓名,分数都是空的。当然只要有人玩的时候数据库就会保存数据的,若是想试验一下,可以自己运行程序,设置高难度后进行游戏。
4.4.2模块算法
这里面主要一点就是与数据库的连接,用不同的数据连接代码有少许差别。因为我运用的数据库系统是Microsofr Access2003,因此用的是数据库的连接代码如下:
con=DriverManager.getConnection("jdbc:odbc:getMoney","","");
sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
从代码可以看出我用的是桥接器形式来处理数据库与java的连接的,开始的时候还得创建桥接器,这个创建桥接器的方法是通用的,代码如下:
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e)
{
System.out.println(""+e);
}
4.4.3功能介绍
这部分功能就是用来显示玩家游戏成绩的排行,当然只是显示前3名的。当用户的成绩达到了前3名的成绩时,系统将自动保存其成绩到数据库里面,然后再通过数据库的查询把成绩记录调出来,用java里面的表组件进行输出。
可以显示不同难度的成绩记录,这是通过查询不同表实现的,在保存时也是把不同难度的成绩记录保存再不同的表中。所以可以通过不同的查询不同的表,进行相应的显示操作.
4.5 数据库更新模块
4.5.1模块功能演示
这部分功能是用来向数据库中的表输入记录的,当玩家的分数打破记录,达到前3名时,或调用这部分功能,让玩家输入自己的姓名,然后通过数据库的更新语句,把玩家的信息保存到数据库中,替换原来的信息。当然根据不同的难度等级,系统会对不同的数据库中的表进行相应的更新。演示图如下:
当你输入你的姓名后,点击确认键,你的分数和排名就会被自动的加入到数据库中,在数据库里就有你的信息了。你可以通过排名显示功能,就可以显示你在数据库中的排名和成绩等信息了。
点击显示后如下图:
在上图中可以清晰地看到你的排名和分数。这个是难度为低的前3名的成绩,然后中级难度和高级难度的成绩录入功能就不详细的讲解了,大家可以自己运行成绩,设置难度,然后观看得分记录情况。
4.5.2模块算法
这面运用的与数据库连接方法与前面的数据显示功能的方法一样,这里就不再详细说明此部分的代码了,然后就把数据库更新的部分功能说一下吧,具体代码如下:
if(num>a[0])
{
String str=JOptionPane.showInputDialog(null, "请输入您的姓名","你的分数打破记录啦!",JOptionPane.INFORMATION_MESSAGE);
sql.execute("UPDATE show1 SET name='"+str+"',grade="+num+" WHERE rank='1'");
}
else if(num>a[1])
{
String str=JOptionPane.showInputDialog(null, "请输入您的姓名","你的分数打破记录啦!",JOptionPane.INFORMATION_MESSAGE);
sql.execute("UPDATE show1 SET name='"+str+"',grade="+num+" WHERE rank='2'");
}
else if(num>a[2])
{
String str=JOptionPane.showInputDialog(null, "请输入您的姓名","你的分数打破记录啦!",JOptionPane.INFORMATION_MESSAGE);
sql.execute("UPDATE show1 SET name='"+str+"',grade="+num+" WHERE rank='3'");
}
这就是运用的数据库更新算法,需要注意的是,更新时注意与数据库中的数据类型与代码中的数据类型得一致,我在编程过程中就出现了此问题,费了很大劲才弄明白问题的所在,当然这都是编程经验不足的问题,大家需得注意。
4.5.3功能介绍
这部分就是数据库录入功能,当玩家成绩打破记录,数据库信息更新,然后玩家可以通过显示记录功能观看记录的分数和名次。
结 论
在完成这个程序时,遇到不少困难。由于编程经验的缺乏,使得编写程序时没有一个具体清晰的方案,无重下手,就是不知道怎么写。所以就重网上下了几份编好的了程序,其中大多错误不能运行。看了大体过程,明白了需编写的功能和算法,开始着手写自己的程序。虽然有程序可以参照,使得自己编写程序的过程相对简单的多,然而却也遇到不少困难。
首先,由于学到的东西和实际运用的东西有很大差别,学的东西都比较简单,而且并不是很深,对于实际编程来说缺乏很多东西,比如设置对话框时,书本只有.showConfirmDialog()这样的,然而却不知道其具体参数怎么设定,像.showConfirmDialog(null,"文件 " + file.getName() + "已经改变\n想保存当前已修改文件吗?","写字板",1,2);这样的一个语句当时根本不是很清楚其具体含义,所以不是很清楚,只有网上查找,而且网上这样的分析句子的含义却并不多!再比如System.err.println("文件未找到");这么简单的一个报错输出,自己就没学到,当时还以为这句话有错,应改成System.out.println("文件未找到");。通过查找相关东西才知道,这只不过是系统报错处理的显示方法。
其次,就是编程经验的缺乏,使得编写程序的过程中不经意就出现一些错误,比如忘了在一个语句后打;,或是忘了一个},或是编程的时候把System中的S写成了小写s,然后就不能运行程序了,当然这些都是小问题。但是由于第一次编写这么长的代码使得自己有一种厌烦感,就是觉得太长了,而又一种不可完成的思想,写着写着就不想写了,而且有时出现一些问题时由于代码太长,系统报错后并不能找到其错误的地点,还得重新看一次代码,仔细分析才能知道问题出在那,不像有些编程经验丰富的人一眼就能看出问题所在。
最后,通过这次综合实验使得我学到了Java编程过程的实际运用方法,宽展了书本上学到的东西,并认识到自己学习java中的不足,使自己明白了许多在学习时没有清楚的东西,并深层明白了许多Java的功能,在编程过程中还加深了自己的编程经验,使得自己调试大程序有了一定得经验,明白了一些经常出错的地方,使得自己在今后编程可以少出错。(宋体,小四号,1.5行距)
结论应当准确、完整、明确精练,不是正文中各段的小结的简单重复。可以阐明本人在设计中的体会和见解,对存在的问题和不足应作出客观的叙述。
参 考 文 献
[1] 孙家广, 杨长青. 计算机图形学 [M]. 北京:清华大学出版社, 1995.
[2] 李旭东,宗光华,毕树生等. 基于J2EE的排课系统关键问题研究 [J]. 华北科技学院报, 2002, 28(3): 249-252.(宋体,小四号,1.5行距)
附录 MACROBUTTON NoMacro [单击此处键入附录题名][可选项]
MACROBUTTON NoMacro [单击此处键入内容](宋体,小四号,1.5行距)
�
�
�
���
�
�
�
�
�
�
�
�
�
show1
rank
grade
name
show2
rank
name
grade
show3
rank
name
grade
�
建表的开始。
�
��
�
�
-16-