(5)测试区能显示用户的同时,并根据级别的不同,提示用户必须用鼠标连续单击出多个图标相同的方块。
(6)测试区有提示图标所在位置的功能。
用户单击测试区中的“提示”按钮后,测试区将持续1.2秒为用户显示全部方块上的图标。
用户每单击一次“提示”按钮,用户用时将增加10秒。
(7)连续单击出级别所要求的若干个相同的方块后,将弹出保存成绩对话框,用户可以通过该对话框选择是否将自己的成绩保存到成绩表中。
2需求分析
2.1设计目标
1.单击“记忆测试”菜单可以选择初级、中级、高级三个级别,通过记忆榜可以查看初级记忆榜、中级记忆榜或高级记忆榜。
2.选择级别后,将显示相应级别的测试区域。
测试区域由若干个方块组成,每个方块上都有一个图标,但该图标默认情况下不可见。
用鼠标单击测试区中的任何一个方块,则计时器开始启动,同时该方块上的图标将显示出来。
对于初级级别,用户必须用鼠标连续单击3个图标相同的方块,也就是说,如果用户已经用鼠标连续单击出n(n<3)个图标相同的方块,单击另一个方块时,如果该方块的图标和上一个相同,那么该方块的图标和前n次单击出的方块的图标仍然可见,否则,前n次单击出的方块的图标都变为不可见。
3.连续单击出该级别所要求的若干个图标形同的方块后,将显示保存成绩对话框,成绩按所用时间排序。
用户可以通过该对话框选择是否将自己的成绩保存到成绩表中。
2.2主体功能
本游戏是通过由用户点击图片显示出图片后,如果是相同的,便保持图形,如果用户点开的是不同的图片则先前点击的图片被清空。
当用户同时点击出规定数目的图片后,弹出保存成绩框。
2.3开发环境
Win7;MyEclipse8.5软件
3概要设计
3.1系统的功能模块划分
记忆测试系统共包含8个java源文件和若干个图像文件(用户可以增加)。
类之间的主要关系如下图所示。
在测试系统中,可以编写6个Java源文件:
MemoryGame.java、MemoryTestArea.java、Block.java、ShowRecordDialog.java、Record.java、People.java。
记忆测试系统除了上述6个Java源文件产生的类外,还需要Java系统提供的一些重要的类。
记忆测试系统所用到的一些重要的类以及之间的组合关系如图3.1所示。
图3.1类之间的组合关系
图3.1类之间的关系
3.2系统流程图
图3.2系统流程图
4详细设计
4.1工作原理
系统主体部分是在底层容器上插入面板,并在面板上安排按钮阵列,当用户点击按钮,经过随机安排在按钮后面的图片显示出来。
通过对比图片下标,如果所显示图片和前一个显示图片一样,则没变化;如果,不一样,则把以前所有显示的图片重新用按钮遮盖。
当用户点开指定数量的图片时,就进入记录数据部分。
在测试过程中,显示用户测试时间。
记录数据部分。
是把用户输入的姓名和系统记录用户测试时间写入指定文档中保存。
查阅数据部分,是把指定文档的数据显示给用户,包括姓名和测试时间。
用户此时可以清除文档中数据,即可删除排行榜。
4.2算法思路
主窗口安排指定数量按钮,是通过用户所选级别传参数计算后进行安排。
随机分布图片需要随机函数随机产生指定数量的图片下标,并传给主窗口的按对应按钮通过对比所显示图片的下标,统计显示的相同图片的数量。
用户测试开始后,记录测试时间,并保存。
4.3主类Memory
a).成员变量
主要成员变量(属性):
成员变量描述
变量类型
名称
菜单条
JMenuBar
Bar
菜单
JMenuItem
FileMenu
菜单项
JMenuBar
初级,中级,高级,初级排行榜,中级排行榜,高级排行榜
面板容器
MemoryTestPane
记忆测试板
方块数组
Block[]
block
显示成绩
ShowRecord
显示成绩表对话框
图标数组
ImageIcon[]
icon
b).方法
主要方法:
名称
功能
备注
Memory
创建窗口
构造方法
给出级别测试
选择级别
actionPerformed
处理ActionEvent事件
接口方法
Main
主程序开始执行
4.4类Block
a).成员变量
主要成员变量(属性):
成员变量描述
变量类型
名称
方块翻开时的图标
ImageIcon
翻开时的图标
方块关闭时的图标
ImageIcon
关闭时的图标
b).方法
主要方法:
名称
功能
备注
Block
创建方块对象的构造方法
获取翻开时的图标
获取方块翻开时的图标
获取关闭时的图标
获取方块关闭时的图标
设置翻开时的图标
设置翻开时的图标
设置关闭时的图标
设置关闭时的图标
设置图标
设置方块上的图标
actionPerformed
处理ActionEvent事件
处理ActionEvent事件
4.5类MemoryTestPane
a).成员变量
主要成员变量(属性):
变量描述
变量类型
名称
随机排列图标对象
RandomSetIcon
排列图标
方块数组
Block
block
图标数组
ImageIcon[]
icon
添加方块对象用的链表
LinkedList
listIcon
添加图标对象用的链表
LinkedList
listIcon
确定是否成功的对象
int
success
用来计时的对象
Timer
计时器
记忆测试板的行数和列数
int
行数,列数
b).方法
主要方法:
名称
功能
备注
MemoryTestPane
创建记忆测试板对象的构造方法
actionPerformed
处理ActionEvent事件
接口方法
4.6类ShowRecord
a).成员变量
主要成员变量(属性):
成员变量描述
变量类型
名称
存放成绩的文件
File
gradeFile
按钮对象
JButton
确定,清除
显示成绩的区域
JTextArea
show
b).方法
主要方法:
名称
功能
备注
ShowRecord
创建显示成绩窗口
构造方法
actionPerformed
处理ActionEvent事件
接口方法
4.7类Record
a).成员变量
主要成员变量(属性):
成员变量描述
变量类型
名称
用时
int
time
输入测试者的名字
JTextField
yourname
存放成绩的文件
File
gradeFile
是否保存成绩的按钮
JButton
确定,取消
b).方法
主要方法:
名称
功能
备注
Record
创建保存成绩窗口
构造方法
actionPerformed
处理ActionEvent事件
接口方法
setTime
设置时间
setFile
设置文件
4.8类RandomSetIcon
a).成员变量(无)
b).方法
主要方法:
名称
功能
备注
随机设置图标
随机排列记忆测试板中方块的图标
4.9类People
a)成员变量
主要成员变量(属性):
描述
变量类型
名称
测试者名字
String
name
用时
int
time
b)方法
主要方法:
名称
功能
备注
People
传递名字和时间
构造方法
getTime
返回使用者用时
getName
返回使用者名字
5测试
5.1测试方案
将7个java文件保存到一个文件夹中,例如,D:
\jiyiceshi。
将7个文件分别编译成相应的字节码(.class)文件。
然后,用java解释器运行主类:
C:
\jiyiceshi\javaMemory程序运行后选择各菜单,分别进行功能测试。
5.2测试结果
(1)运行效果
图5.2.1运行效果
(2)当选择“记忆力测试”后,自己可以设置游戏的难度,效果如图
图5.2.2初级效果图
图5.2.3中级效果图
图5.2.4高级效果图
图5.2.5排行效果图
(3)当游戏结束后,查看“初级排行榜”,将显示初级的成绩记录效果
图5.2.5初级成绩记录
6小结
Java程序设计是本专业的一门重要的面向对象的程序语言。
在刚开始学习时,一直担心自己、也没把握自己能否学好,也曾担心过不了考试这一关。
经过近大半学期老师您不厌其烦的教导,引导我们去学习。
我对Java语言有了一定的了解,但那绝对是远远不够的,还是要不断地把它应用到实践中去,融会贯通。
经过为期一周的Java课程设计,亲身感受体验敲、改写Java程序代码的乐趣,我对Java编程有了较为深入的了解,不仅巩固了以前在课本上学到的知识,还学会了很多其他东西,比如Java程序不同调试平台的使用、错误的调试及数据库路径的配置等等。
一直以来,或许有不少人跟我一样,总是觉得编程是很枯燥乏味的,但是这次
的体验下来,其实以前我们的想法错误的。
感觉到看着敲击的代码变为一个个可以自娱自乐小游戏程序,其实是一件非常有趣的事情。
并且在添加功能的过程中,不仅可以启发自己的想象力,还可以培养灵活运用知识的能力。
在此过程中,我们认识到编程的重要步骤是分析,分析问题的本身和现实要求。
分析过程中采用根据设置框架选择功能使我的思路特别清晰。
拿到一个题目不能只局限在一种思想一种方法上,要尽量的多尝试其他的做法,然后比较,集各家之所长,拿出最优秀的程序来。
其次也是最重要的就是我们应当打开我们的视野,我们应当从我们的生活的这个世界中去领悟解决问题的思想和方法
通过这次课程设计,我收获的不仅仅是课程上的知识得到实际应用,还有编程的基本习惯和开发系统时应注意的流程。
作为一个程序编程人员,要保持清醒的头脑,以现实为依据,让自己的每一行代码都能实现自己的意义。
参考文献
文献写法如下:
1.专著、论文集、毕业论文、报告等
疯狂Java讲义(2008-09)李刚著
附录
附录1源程序清单
Memory.java
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjava.util.LinkedList;
publicclassMemoryextendsJFrameimplementsActionListener
{
JMenuBarbar;
JMenufileMenu;
JMenuItem初级,中级,高级,初级排行榜,中级排行榜,高级排行榜;
Blockblock[];
ImageIconicon[];
MemoryTestPane记忆测试板=null;
Filefile初级=newFile("初级记忆排行榜.txt"),
file中级=newFile("中级记忆排行榜.txt"),
file高级=newFile("高级记忆排行榜.txt");
LinkedList成绩表=null;
ShowRecord显示成绩表对话框=null;
intm=5,n=6;
int图标个数=0;
Containercon=null;
JTextField提示条=null;
FilegradeFile=null;
publicMemory()
{
block=newBlock[m*n];
图标个数=m;
icon=newImageIcon[图标个数];
for(inti=0;i{
icon[i]=newImageIcon("a"+i+".gif");
}
for(inti=0;i{
block[i]=newBlock();
block[i].设置关闭时的图标(newImageIcon("关闭.gif"));
}
bar=newJMenuBar();
fileMenu=newJMenu("记忆力测试");
初级=newJMenuItem("初级");
中级=newJMenuItem("中级");
高级=newJMenuItem("高级");
fileMenu.setMnemonic('G');
初级.setMnemonic('B');
中级.setMnemonic('I');
高级.setMnemonic('E');
高级排行榜=newJMenuItem("高级排行榜");
中级排行榜=newJMenuItem("中级排行榜");
初级排行榜=newJMenuItem("初级排行榜");
初级.setMnemonic('T');
fileMenu.add(初级);
fileMenu.add(中级);
fileMenu.add(高级);
fileMenu.add(初级排行榜);
fileMenu.add(中级排行榜);
fileMenu.add(高级排行榜);
bar.add(fileMenu);
setJMenuBar(bar);
初级.addActionListener(this);
中级.addActionListener(this);
高级.addActionListener(this);
初级排行榜.addActionListener(this);
中级排行榜.addActionListener(this);
高级排行榜.addActionListener(this);
成绩表=newLinkedList();
if(!
file初级.exists())
{
try{
FileOutputStreamout=newFileOutputStream("初级记忆排行榜.txt");
ObjectOutputStreamobject_out=newObjectOutputStream(out);
object_out.writeObject(成绩表);
object_out.close();
out.close();
}
catch(IOExceptione)
{
}
}
if(!
file中级.exists())
{
try{
FileOutputStreamout=newFileOutputStream("中级记忆排行榜.txt");
ObjectOutputStreamobject_out=newObjectOutputStream(out);
object_out.writeObject(成绩表);
object_out.close();
out.close();
}
catch(IOExceptione)
{
}
}
if(!
file高级.exists())
{
try{
FileOutputStreamout=newFileOutputStream("高级记忆排行榜.txt");
ObjectOutputStreamobject_out=newObjectOutputStream(out);
object_out.writeObject(成绩表);
object_out.close();
out.close();
}
catch(IOExceptione)
{
}
}
gradeFile=file初级;
setBounds(100,100,300,260);
setVisible(true);
addWindowListener(newWindowAdapter()
{
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
});
con=getContentPane();
记忆测试板=newMemoryTestPane(block,icon,m,n,gradeFile);
提示条=newJTextField("初级:
您需要连续找出"+6+"个相同图标的方块");
提示条.setEditable(false);
提示条.setForeground(Color.red);
con.add(记忆测试板,BorderLayout.CENTER);
con.add(提示条,BorderLayout.SOUTH);
con.validate();
this.validate();
}
publicvoid给出级别测试(int宽,int高,Filef)
{
m=宽;
n=高;
图标个数=m;
gradeFile=f;
block=newBlock[m*n];
icon=newImageIcon[图标个数];
for(inti=0;i{
icon[i]=newImageIcon("a"+i+".gif");
}
for(inti=0;i{
block[i]=newBlock();
block[i].设置关闭时的图标(newImageIcon("关闭.gif"));
}
记忆测试板=newMemoryTestPane(block,icon,m,n,gradeFile);
con.removeAll();
con.add(记忆测试板,BorderLayout.CENTER);
con.add(提示条,BorderLayout.SOUTH);
con.validate();
this.validate();
}
publicvoidactionPerformed(ActionEventevent)
{
if(event.getSource()==初级)
{
给出级别测试(3,3,file初级);
setBounds(100,100,300,260);
this.validate();
提示条.setText("初级:
您需要连续找出"+3+"个相同图标的方块");
}
if(event.getSource()==中级)
{
给出级别测试(4,4,file中级);
setBounds(100,100,340,280);
this.validate();
提示条.setText("中级:
您需要连续找出"+4+"个相同图标的方块");
}
if(event.getSource()==高级)
{
给出级别测试(5,5,file高级);
setBounds(100,100,360,300);
this.validate();
提示条.setText("高级:
您需要连续找出"+5+"个相同图标的方块");
}
if(event.getSource()==高级排行榜)
{
显示成绩表对话框=newShowRecord(this,file高级);
显示成绩表对话框.setVisible(true);
}
if(event.getSource()==中级排行榜)
{
显示成绩表对话框=newShowRecord(this,file中级);
显示成绩表对话框.setVisible(true);
}
if(event.getSource()==初级排行榜)
{
显示成绩表对话框=newShowRecord(this,file初级);
显示成绩表对话框.setVisible(true);
}
}
publicstaticvoidmain(Stringargs[])
{
newMemory();
}
}
Block.java
importjavax.swing.*;
importjava.awt.event.*;
publicclassBlockextendsJButtonimplementsActionListener
{
ImageIcon翻开时的图标=null,关闭时的图标=null;
publicBlock()
{
addActionListener(this);
}
publicImageIcon获取翻开时的图标()
{
return翻开时的图标;
}
publicImageIco