资源描述
计算机科学与技术学院
《面向对象程序设计》课程设计报告
(2015/2016学年 第二学期)
学生姓名: 刘丽敏
学生专业: 软件工程
学生班级: 142601
学生学号: 201426170114
指导教师: 秦怡
2016年 7月 5日
计算机科学与技术学院
课程设计任务书
课程设计名称
面向对象程序设计
课程设计题目
记忆测试系统
学生姓名
刘丽敏
专业班级
软件工程142601
学号
201426170114
课程设计任务内容
设计内容:
记忆测试系统通过回忆法测试记忆,分为初级、中级、高级三个级别,并通过记忆榜存储每个级别的成绩。
设计要求:
1. 单击“记忆测试”菜单可以选择初级/中级/高级,也可以查看初级记忆榜/中级记忆榜或高级记忆榜。
2. 选择级别后,将显示相应级别的测试区域。测试区域由若干个方块组成,每个方块都有一个图标,但该图标默认情况下不可见。用鼠标单击测试区中的任何一个方块,则计时器开始启动,同时该方块上的图标将显示出来。对于初级级别,用户必须用鼠标连续单击出6个图标相同的方块,也就是说,如果用户已经用鼠标连续单击出n(n<6)个图标相同的方块,单击另一个方块时,如果该方块的图标和上一个相同,那么该方块的图标和前n 次单击出的方块的图标仍然可见,否则,前n次单击出的方块的图标都变为不可见。
3. 连续单击出该级别所要求的若干个图彪相同的方块后,将显示保存成绩对话框,成绩按所用时间排序。用户可以通过该对话框选择是否将自己的成绩保存到成绩表中。
指导教师:秦怡
时 间: 2016 年 7月 4 日
计算机科学与技术学院
课程设计成绩评审表
课程设计名称
面向对象程序设计
课程设计题目
记忆测试系统
学生姓名
刘丽敏
专业班级
软件142601
学号
201426170114
同组人
指导教师
秦怡
设计成绩
评价内容
签 字:
时 间: 年 月 日
目录
一.功能需求描述…………………………………………………1
二.设计描述………………………………………………………3
1 MemoryGame.java(主类)…………………………………………………3
2 MemoryTestArea.java ………………………………………………………3
3 Block.java ……………………………………………………………………4
4 Record.java …………………………………………………………………4
5 ShowRecordDialog.java ……………………………………………………4
6 People.java ……………………………………………………………………4
三.算法描述 ………………………………………………………4
1 MemoryGame类 ………………………………………………………………4
2 MemoryTestArea类 …………………………………………………………7
3 Block类 ……………………………………………………………………9
4 ShowRecordDialog类 ………………………………………………………10
5 People类 ……………………………………………………………………11
6 Record类 ………………………………………………………………………12
7 图像文件 ………………………………………………………………………13
四.开发过程描述……………………………………………………14
五.设计心得体会……………………………………………………27
一.功能需求描述
设计内容:
记忆测试系统通过回忆法测试记忆,分为初级、中级、高级三个级别,并通过记忆榜存储每个级别的成绩。
设计要求:
4. 单击“记忆测试”菜单可以选择初级/中级/高级,也可以查看初级记忆榜/中级记忆榜或高级记忆榜。
5. 选择级别后,将显示相应级别的测试区域。测试区域由若干个方块组成,每个方块都有一个图标,但该图标默认情况下不可见。用鼠标单击测试区中的任何一个方块,则计时器开始启动,同时该方块上的图标将显示出来。对于初级级别,用户必须用鼠标连续单击出6个图标相同的方块,也就是说,如果用户已经用鼠标连续单击出n(n<6)个图标相同的方块,单击另一个方块时,如果该方块的图标和上一个相同,那么该方块的图标和前n 次单击出的方块的图标仍然可见,否则,前n次单击出的方块的图标都变为不可见。
6. 连续单击出该级别所要求的若干个图彪相同的方块后,将显示保存成绩对话框,成绩按所用时间排序。用户可以通过该对话框选择是否将自己的成绩保存到成绩表中。
运行效果图:
二.设计描述
在记忆测试系统中,可以编写6个java源文件:MemoryGame.java、MemoryTestArea.java、Block.java、ShowRecordDialog.java、Record.java和People.java。
记忆测试系统除了上述6个java源文件产生的类之外,还需要java系统提供一些重要的类。记忆测试系统所用到的一些重要的类以及之间的组合关系如图1.1所示。
以下是6个java源文件的总体设计。
1 MemoryGame.java(主类)
MemoryGame类负责创建记忆测试系统的主窗口,该类含有main方法,记忆测试系统从该类开始执行。MemoryGame类有4种重要类型的对象,分别是String、File、MemoryTestArea和ShowRecordDialog对象。MemoryGame类创建的窗口对象以及其中的主要成员对象如图1.2所示。MemoryGame类的主要成员的作用将在后面的详细设计中阐述。
2 MemoryTestArea.java
MemoryTestArea类是主类MemoryGame窗口中的一个JPanel容器,所创建的对象称为“测试区”,这个“测试区”被添加到MemoryGame窗口的中心。MemoryTestArea主要有6种类型的成员:ArrayList<Block>、String、Record、Timer、File和Thread对象。MemoryTestArea类的主要成员的作用将在后面的详细设计中概述。
3 Block.java
Block类是JButton的子类,负责为MemoryTestArea类中的Array<Block>数组表提供Block对象。
4 Record.java
Record类是javax.swing包中的JDialog对话框的子类,当用户成功单击出相应级别所要求的图标相同的方块后,Record创建的对象负责保存用用户的名字和成绩到相应的级别文件中。
5 ShowRecordDialog.java
ShowRecordDialog类是javax.swing包中JDialog对话框的子类,当用户单击“查看排行榜”时,ShowRecordDialog创建的对象负责显示用户的成绩。
6 People.java
People对象封装用户的名字和成绩,以便ShowRecordDialog对象可以按成绩的高低排序用户。
三.算法描述
1 MemoryGame类
UML图
MemoryGame类是javax.swing包中JFrame的一个子类,并实现了ActionListener接口。该类的主要成员变量和方法如下图:
JFrame
ActionListener
MemoryGame
bar:JMenuBar imageName:String[]
menuGrade,menuResult,menuIcon:JMenu memoryArea:MemoryArea
oneGradeItem,twoGradeItem,threeGradeItem:JMenuItem showDialog:ShowRecordDialog
oneGradeResult,twoGradeResult,threeGradeResult:JMenuItem m,n:int
carImageIcon,animalImageIcon:JMenuItem
fileOneGrade,fileTwoGrade,fileThreeGrade,gradeFile:File
MemoryGame():无类型
actionPerformed(ActionEvent):void
mian(String[]):void
MemoryGame类的UML图
以下是UML图中有关数据和方法的详细说明。
1) 成员变量
bar是JMenuBar类创建的菜单条,可以向bar中添加菜单。
menuGrade、menuResult、menuIcon是JMenu类创建的三个菜单,这三个菜单的名称分别是“选择级别”、“查看排行榜”和“选择图标”。
oneGradeItem、twoGradeItem和threeGradeIte是JMenuItem类创建的三个菜单项,被添加到menuGrade菜单中。这三个菜单项的名称分别是“初级”、“中级”和“高级”。
oneGradeResult、twoGradeResult和threeGradeResult是JMenuItem类创建的三个菜单项,被添加到menuResult菜单中。这三个菜单项的名称分别是“初级排行榜”、“中级排行榜”和“高级排行榜”。
carImageIcon、animalImageIcon、fruitImageIcon和buildingImageIcon是JMenuItem类创建的四个菜单项,被添加到menuIcon菜单中。这四个菜单项的名称分别是“汽车图标”、“动物图标”“水果图标”、“建筑图标”。
fileOneGradeResult、fileTwoGradeResult、fileThreeGradeResult和gardeFile是Fiel类创建的四个文件对象。fileOneGrade、fileTwoGradehe和fileThreeGrade三个文件对象所引用的文件分别是“初级记忆排行榜.txt”、“中级记忆排行榜.txt”和“高级记忆排行榜.txt”,分别用来写入三个级别的成绩。gradeFile可以是fileOneGrade、fileTwoGrade和fileThreeGarde中的某一个。
imageName是String类型的数组,每个单元是一个图像文件的名字。
memoryArea是测试区对象,由MemoryArea类负责创建。
showDialog是负责显示成绩对话框,由ShowRecordDialog类负责创建。
m和n是int型数据,其值可以确定相应级数中测试区中方块的数量,例如,对于中级水平,m=6,n=7,测试区一共有42个方块。
2)方法
actionPerformed(ActionEvent)方法是MemoryGame类来实现的ActionListener接口中的方法,负责执行菜单项发出的有关命令。用户选择菜单中的菜单项可触发ActionEvent事件,导致actionPerformed(ActionEvent)方法执行相应的操作。
MemoryGame()是构造方法,的负责完成窗口的初始化。
main(String[])方法是软件运行的入口方法。
2 MemoryTestArea类
UML图
MemoryTestArea类是javax.swing包中JPanel容器的子类,实现了ActionListener和Runnable接口,所创建的对象:memoryArea是MemoryGame类的最重要的成员之一,作为一个容器添加到MemoryGame窗口的中心。标明MemoryTestGame类的主要成员变量、方法以及和MemoryGame类之间组合关系的UML图如下图所示。
JPanel
ActionListener
Runnable
MemoryGame
MemoryTestArea
memoryArea:
MemoryTestArea
row,col,usedTime,success:int hintTread:Thread
gradeFile:File hintButton:JButton
allBlockList:ArrayList<Block> showUsedTime:JTextFiled
imageFileName:String[] hintMessage:JTextFiled
openIconList:LinkedList<ImagaIcon> timer:Timer
openBlockList:LinkedList<Block> record:Record
MemoryTestArea():无类型
initBlock(int,int,String[],File):void
setImageName(String[]):void
actionPerformed(ActionEvent):void
run():void
以下是UML图中有关数据和方法的详细说明。
1)成员变量
row和col的值确定测试区中方块的数量。MemoryTestArea类创建的对象memoryArea是MemoryGame中的成员,memoryArea对象通过调用initBlock(int,int,String[],File)方法将MemoryGame类中的m和n值传递给row和col。
usedTime是用户的用时,单位是秒,iconNum是用户鼠标单击的次数,单位是次。
Success的值是用户找到的具有相同的图标方块的个数。
gradeFile是级别文件,memoryArea对象通过调用initBlock(int,int,String[],File)方法见MemoryGame类中的gradeFile的引用传递给memoryArea对象中的gradeFile。
数组表allBlockList单元的个数是row和col的乘积,它的每个单元存放着一个Block对象。memoryArea对象在调用intBlock(int,int,String[],File)方法时完成对allBlockList单元初始化,即创建单元中的Block对象。
字符串数组imageFileName中的每个单元是一幅图像文件的文字。memoryArea对象通过调用setImageName(String[])方法将MemoryGame中存放图像文件名字的imageName数据的引用传递给imageFileName。
链表openIconList用来存放用户找到的图标相同的方块上的图标。
链表openBlockList用来存放用户找到的图标相同的方块。
hintThread是用Thread类创建的线程对象,用来提示测试区中的Block上的图标,提示方式是将测试区中的各个Block上图标持续显示1200毫秒。
hintButton是注册了ActionEvent事件的监视器,当单击它时,启动hintThread线程。
showUsedTime显示用户的用时,即显示usedTime的值,showIconNum是显示用户单击鼠标的次数,即显示showIconNum的值。
record负责提供保存成绩的界面,是一个对话框,默认不见。当用户寻找出级别所要求的相同的图标方块的数目后,该对话框可见,用户可以在该对话框中输入姓名,并保存所输入的姓名和usedTime的值到gradeFile指定的级别文件中。
2) 方法
MemoryTestArea()是构造方法,创建memoryArea对象时需使用该构造方法。
initBlock(int,int,String[],File)方法。memoryArea对象调用该方法将参数的值传递给row、col、imageFileName和gradeFile,并依据这些值设置allBlockList数组表的大小,然后创建allBlockList的单元中的Block对象,并设置Block对象上的图标。
setImageName(String[])方法。memoryArea对象调用该方法可以将MemoryGame中存放图像文件名字的imageName数组的引用传递给imageFileName。当用户单击MemoryGame主类窗口的carImageIcon和animalImageIcon菜单项时,memoryArea对象将调用该方法把存放图像文件名字的imageName数组的引用传递给imageFileName。
actionPerformed(ActionEvent)方法。该方法是MemoryArea类实现的ActionListener接口中的方法。memoryArea中的每个Block对象注册了ActionEvent事件监视器,当用户单击memoryArea中的某个Block对象时,actionPerformed(ActionEvent)方法将被调用执行,所执行的主要操作是:如果该Block对象未显示图标,并且该Block对象设置的图标和openIconList的存放的图标相同,就将该图标添加到链表openIconList中同时将该Block对象上图标显示出来,并将success的值增1;如果该Block对象未显示图标,并且该Block对象设置的图标和OpenIconList的中存放的图标不相同,就将openIconList清空,然后再将该图标添加到链表openIconList中,同时将该Block对象上图标显示出来,并将success的值设置成1。当用户单击hintButton按钮时,actionPerformed(ActionEvent)方法将被调用执行,执行的主要操作是启动hintThread线程。
run()方法。该方法是MemoryArea类实现Runnable接口中的方法,启动hintThread线程后,该方法将执行,其主要操作是将测试区中的未显示图标的各个Block对象上的图标持续显示1200毫秒。
3 Block类
(1)效果图
Block创建的方块效果下如图所示。
(a) 图标不可见时的方块 (b) 图标可见时的方块
Block创建的方块效果图
(2)UML图
Block类是javax.swing包中JButton的子类,所创建的对象作为MemoryTestArea测试区中的方法,被添加到测试区的allBlockList数组表中。标明Block类的主要成员变量、方法以及和MemoryTestArea类之间的关系的UML图如下图所示
以下是UML图中有关数据和方法的详细说明。
1) 成员变量
openStateIcon是方块上的图标。
2) 方法
Block对象调用setOpenStateIcon(ImageIcon)方法可以设置它上面的图标。
Block对象调用getOpenStateIcon()方法可以获得它上面的图标。
JButton
allBlockList:ArrayList<Block>
MemoryTestArea
openStateIcon:ImageIcon
setOpenStateIcon(ImageIcon):void
getOpenStateIcon():ImageIcon
Block
1.3.4 ShowRecordDialog类
UML图
ShowRecordDialog类是javax.swing包中JDialog的子类,并实现了ActionListener接口,该类创建的对象showDialog是MemoryGame窗口的成员之一。当用户选择窗口上的“查看排行榜”菜单中的菜单项,该对话框可见,并显示相应级别文件中存储的成绩。标明ShowRecordDialog类的主要成员变量、方法以及和MemoryGame类之间组合关系的UML图如下图所示
ActionListener
JDialog
MemoryGame
ShowRecordDialog
showDialog:ShowRecordDialog
gradeFile:File
clear:JButton
showArea:JTextArea
treeSet:TreeSet<People>
ShowRecordDialog():无类型
setGradeFile(File):void
showRecord():void
actionPerformed(ActionEvent):void
ShowRecordDialoglei类的UML图
以下是UML图中有关数据和方法的详细说明。
1)成员变量
gradeFile是对话框要读取的文件,该文件存储成绩。
clear是注册了ActionEvent事件的按钮。
showArea文本区显示对话框从gradeFile文件中读出的成绩。
treeSet负责将成绩按高低排序。
2)方法
ShowRecordDialog()是构造方法,负责创新showDialog对象。
setGradeFile(File)方法。ShowRecordDialog类创建的ShowrecordDialog对话框是主类MemoryGame窗口中的一个成员。当用户选择窗口上的“查看排行榜”菜单中的菜单项时,ShowrecordDialog对话框调用setGradeFile(File)方法将相应的级别文件传递给gradeFile。
showRecord()方法。ShowrecordDialog对话框调用该方法读取gradeFile文件中的成绩,为了将成绩按高低顺序显示在showArea文本区中,showRecord()方法跟读取的名字和该名字的对应成绩,创建一个People对象,并将该People对象存放在treeSet树集中。
actionPerformed(ActionEvent)是ActionListener接口中的方法,clear注册了ActionEvent事件,当用户单击clear按钮时,actionPerformed(ActionEvent)方法被调用执行,所执行的操作是清除gradeFile文件中的内容。
5 People类
UML图
People对象中的数据由ShowRecordDialog对话框从gradeFile文件中读取的用户姓名和成绩所构成。ShowRecordDialog对话框将People对象作为其treeSet树集上的节点,以便按着成绩高低顺序排列People对象。标明People类的主要成员变量、方法以及和ShowrecordDialog类之间关系的UML图如下图
treeSet:TreeSet<People>
ShowRecordDialog
People
name:String
time:int
iconNum:int
getTime():int
getName():String
getIconNum():int
compareTo(Object):int
People类的UML图
以下是UML图中有关数据和方法的详细说明。
1) 成员变量
Name是用户的名字。
Time是用户的用时。
IconNum是用户鼠标单击次数。
2) 方法
getTime()方法返回time。
getName()方法返回name。
getIconNum()方法返回iconNum。
compareTo(Object)是Compareable接口中的方法,其操作是确定People对象的大小关系。
6 Record类
UML图
Record是javax.swing包中JDialog的子类,并实现了ActionListener接口,该类创建的对象record是MemoryTestArea类的成员之一。当用户成功单击出相应级别所要求的图标相同的方块后,程序弹出Record对话框,用户使用对话框提供的界面将成绩保存到相应的级别文件中。标明了Record类的主要成员变量、方法以及和MemoryTestArea类之间关系的UML图如下图所示。
record:Record
time:int enter,cancel:JButton
yourName:JTextFiled gradeFile:File
lable:JLable
Record():无类型
setGradeFile:void
setTime(int):void
actionPerformed(ActionEvent):void
ActionListener
JDialog
MemoryTestAea
Record
Record类的UML图
以下是UML图中有关数据和方法的详细说明。
1) 成员变量
time是用户的用时。
yourName是用户用来输入名字和文本框。
enter和cancel是按钮对象,用户单击enter按钮可以保存成绩,单击cancel可以放弃保存成绩。
gradeFile是级别文件。
2) 方法
Record()是构造方法,负责创建record对象。
setGradeFile(File)方法。Record类创建的Record对话框时测试区MemoryTestArea中一个成员。当用户成功单击出相应级别所要求的图标相同的方块后,测试区弹出Record对话框,Record对话框将调用setGradeFile(File)方法将测试区中的级别文件传递给Record对话框gradeFile。
setTime(int)方法。当用户成功单击出相应的级别所要求的图标相同的方块后,测试区弹出对话框,Record对话框将调用setTime(int)方法将测试区记录的用户用时传递给Record对话框中的time。
actionPerformed(ActionEvent)是ActionListener接口中的方法,enter和cancel按钮注册了ActionEvent事件,当用户单击enter时,actionPerformed(ActionEvent)方法被调用执行,其操作是将用户在文本框yourName中输入的名字以及time的值保存到gradeFiel文件中,然后关闭当前对话框;当用户单击cancel按钮时,actionPerformed(ActionEvent)方法被调用执行,其操作是关闭当前对话框。
7 图像文件
创建图标对象需使用如下四组图像文件:
(1) car0.jpg、car1.jpg、car2.jpg、car3.jpg、car4.jpg、car5.jpg、car6.jpg、car7.jpg、car8.jpg;
(2) animal0.jpg、animal1.jpg、animal2.jpg、animal3.jpg、animal4.jpg、animal5.jpg、animal6.jpg、animal7.jpg、animal8.jpg;
(3) fruit0.jpg、 fruit1.jpg、fruit2.jpg、fruit3.jpg、fruit4.jpg、fruit5.jpg、fruit6.jpg、fruit7.jpg、fruit8.jpg;
(4) building0.jpg、building1.jpg、building2.jpg、building3.jpg、building4.jpg、building5.jpg、building6.jpg、building7.jpg、building8.jpg。
四.开发过程描述
源代码
(MemoryGame.java)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.LinkedList;
public class MemoryGame extends JFrame implements ActionListener {
JMenuBar bar; // 创建 一个菜单栏(条)
JMenu menuGrade,menuResult,menuIcon; // 创建三个菜单
JMenuItem oneGradeItem,twoGradeItem,threeGradeItem; // 创建菜单项
JMenuItem oneGradeResult,twoGradeResult,threeGradeResult;
JMenuItem carImageIcon,animalImageIcon,fruitImageIcon,buildingImageIcon;
File fileOneGrade,fileTwoGrade,fileThreeGrade,gradeFile; // 创建四个File类的对象,分别引用文件“初级记忆排行榜.txt”等!!!
String imageName[]; // 用于图片名称数组!!!
MemoryTestArea memoryArea;
ShowRecordDialog showDialog = null;
int m=5,n=6;
final int imageNumber = 7;
MemoryGame() {
fileOneGrade = new File("初级记忆排行榜.txt"); // 创建txt文本文件(对象)
fileTwoGrade = new File("中级记忆排行旁.txt");
fileThreeGrade = new File("高记忆排行榜.txt");
bar = new JMenuBar();
menuGrade = new JMenu("选择级别");
oneGradeItem = new JMenuItem("初级");
twoGradeItem = new JMenuItem("中级");
threeGradeItem = new JMenuItem("高级");
menuGrade.add(oneGradeItem);
menuGrade.add(twoGradeItem);
menuGrade.add(threeGradeItem);
menuResult = new JMenu("查看排行榜");
oneGradeResult = new JMenuItem("初级排行榜");
twoGradeResult = new JMenuItem("中级排行榜");
threeGradeResult = new JMenuItem("高级排行榜");
menuResult.add(oneGradeResult);
menuResult.add(twoGradeResult);
menuResult.add(threeGradeResult);
menuIcon = new JMenu("选择图标");
carImageIcon = new JMenuItem("汽车图标");
carImageIcon.addActionListener(this);
animalImageIcon = new JMenuItem("动物图标");
animalImageIcon.addActionListener(this);
fruitImageIcon = new JMenuItem("水果图标"); // 水果、建筑图标实例化!!!
fruitImageIcon.addActionListener(this);
buildingImageIcon = new JMenuItem("建筑图标");
buildingImageIcon.addActionListener(this);
menuIcon.add(carImageIcon);
menuIcon.add(animalImageIcon);
menuIcon.add(fruitImageIcon);
menuIcon.add(buildingImageIcon);
bar.add(menuGrade);
bar.add(menuResult);
bar.add(menuIcon);
setJMenuBar(bar);
oneGradeItem.addActionListener(this);
twoGradeItem.addActionListener(this);
threeGradeItem.addActionListener(this);
oneGradeResult.addActionListener(this);
twoGradeResult.addActionListener(this);
threeGradeResult.addActio
展开阅读全文