1、 1 / 31成绩: 评语:华南理工大学广州学院2012-2013 学年度第一学期课程名称: 面向对象程序设计大作业 项目题目: 记忆测试系统 专业班级: 年 级: 2011 级 姓 名: 学 号: 2 / 31目录及程序设计说明书1.1 设计要求 1.2 总体设计31.2.1 MemoryGame.java(主类)1.2.2 MemoryTestArea.java 1.2.3 Block.java 1.2.4 Record.java 1.2.5 ShowRecordDialog.java 1.2.6 People.java 1.3 详细设计 41.3.1 MemoryGame 类 41.3.
2、2 MemoryTestArea 类 101.3.3 Block 类 181.3.4 ShowRecordDialog 类 191.3.5 People 类 231.3.6 Record 类 251.3.7 图像文件 281.4 课程设计总结 30(参考文献 )3 / 311.1 设计要求记忆测试系统是通过回忆法测试记忆能力,测试手段分为初、中、高三个级别。记忆测试系统设计要求如下:(1)单击“选择级别”菜单可以选择级别。(2)单击“查看排行榜”菜单可以查看初级、中级、高级记忆排行榜,通过记忆榜存储每个级别的成绩。(3)选择级别后,将出现相应级别的测试区。测试区由 mn 个方块组成,程序通过设
3、置 m 和 n 的来确定相应的测试级别。如对于初级级别,m=5,n=6。每个方块上都有一个图标,但该图标默认不可见。用鼠标单击测试区域中的任何一个方块,则计数器开始启动,同时该方块上的图标将显示出来。(4)mn 个方块组成的测试区域中有 m 个图标,每个图标出现 n 次,并且随机分布在测试区中的mn 方块上。用户必须用鼠标连续单击出 n 个图标相同的方块,也就是说,如果用户已经用鼠标连续单击出 p(pArrayList String Record Timer File Thread4 / 31图 1.1 类之间的组合关系以下是 6 个 java 源文件的总体设计。1.2.1 MemoryGam
4、e.java(主类)MemoryGame 类负责创建记忆测试系统的主窗口,该类含有 main 方法,记忆测试系统从该类开始执行。MemoryGame 类有 4 种重要类型的对象,分别是 String、File 、MemoryTestArea 和 ShowRecordDialog对象。MemoryGame 类创建的窗口对象以及其中的主要成员对象如图 1.2 所示。MemoryGame 类的主要成员的作用将在后面的详细设计中阐述。1.2.2 MemoryTestArea.javaMemoryTestArea 类是主类 MemoryGame 窗口中的一个 JPanel 容器,所创建的对象称为“测试区
5、” ,这个“测试区”被添加到 MemoryGame 窗口的中心。MemoryTestArea 主要有 6 种类型的成员:ArrayList、String、Record、Timer、File 和 Thread 对象。MemoryTestArea 类的主要成员的作用将在后面的详细设计中概述。1.2.3 Block.javaBlock 类是 JButton 的子类,负责为 MemoryTestArea 类中的 Array数组表提供 Block 对象。1.2.4 Record.javaRecord 类是 javax.swing 包中的 JDialog 对话框的子类,当用户成功单击出相应级别所要求的图标
6、相同的方块后,Record 创建的对象负责保存用用户的名字和成绩到相应的级别文件中。1.2.5 ShowRecordDialog.javaShowRecordDialog 类是 javax.swing 包中 JDialog 对话框的子类,当用户单击 “查看排行榜”时,ShowRecordDialog 创建的对象负责显示用户的成绩。1.2.6 People.javaPeople 对象封装用户的名字和成绩,以便 ShowRecordDialog 对象可以按成绩的高低排序用户。1.3 详细设计1.3.1 MemoryGame 类1. 效果图如下:5 / 31MemoryGame 创建的窗口2. UM
7、L 图MemoryGame 类是 javax.swing 包中 JFrame 的一个子类,并实现了 ActionListener 接口。该类的主要成员变量和方法如下图:MemoryGame 类的 UML 图以下是 UML 图中有关数据和方法的详细说明。JFrame ActionListenerMemoryGamebar:JMenuBar imageName:StringmenuGrade,menuResult,menuIcon:JMenu memoryArea:MemoryAreaoneGradeItem,twoGradeItem,threeGradeItem:JMenuItem showDi
8、alog:ShowRecordDialogoneGradeResult,twoGradeResult,threeGradeResult:JMenuItem m,n:intcarImageIcon,animalImageIcon:JMenuItemfileOneGrade, fileTwoGrade,fileThreeGrade,gradeFile:FileMemoryGame():无类型actionPerformed(ActionEvent ):voidmian(String ):void6 / 311) 成员变量bar 是 JMenuBar 类创建的菜单条,可以向 bar 中添加菜单。men
9、uGrade、menuResult、menuIcon 是 JMenu 类创建的三个菜单,这三个菜单的名称分别是“选择级别” 、“查看排行榜”和“选择图标” 。oneGradeItem、twoGradeItem 和 threeGradeIte 是 JMenuItem 类创建的三个菜单项,被添加到 menuGrade菜单中。这三个菜单项的名称分别是“初级” 、 “中级”和“高级” 。oneGradeResult、twoGradeResult 和 threeGradeResult 是 JMenuItem 类创建的三个菜单项,被添加到menuResult 菜单中。这三个菜单项的名称分别是“初级排行榜”
10、 、 “中级排行榜”和“高级排行榜” 。carImageIcon、animalImageIcon、fruitImageIcon 和 buildingImageIcon 是 JMenuItem 类创建的四个菜单项,被添加到 menuIcon 菜单中。这四个菜单项的名称分别是“汽车图标” 、 “动物图标” “水果图标” 、 “建筑图标” 。fileOneGradeResult、fileTwoGradeResult、fileThreeGradeResult 和 gardeFile 是 Fiel 类创建的四个文件对象。fileOneGrade、 fileTwoGradehe 和 fileThreeGr
11、ade 三个文件对象所引用的文件分别是“初级记忆排行榜.txt” 、“中级记忆排行榜.txt”和“高级记忆排行榜.txt” ,分别用来写入三个级别的成绩。gradeFile 可以是fileOneGrade、 fileTwoGrade 和 fileThreeGarde 中的某一个。imageName 是 String 类型的数组,每个单元是一个图像文件的名字。memoryArea 是测试区对象,由 MemoryArea 类负责创建。showDialog 是负责显示成绩对话框,由 ShowRecordDialog 类负责创建。m 和 n 是 int 型数据,其值可以确定相应级数中测试区中方块的数量
12、,例如,对于中级水平,m=6,n=7,测试区一共有 42 个方块。2)方法actionPerformed(ActionEvent )方法是 MemoryGame 类来实现的 ActionListener 接口中的方法,负责执行菜单项发出的有关命令。用户选择菜单中的菜单项可触发 ActionEvent 事件,导致actionPerformed(ActionEvent )方法执行相应的操作。MemoryGame()是构造方法,的负责完成窗口的初始化。main(String )方法是软件运行的入口方法。7 / 313. 代码(MemoryGame.java)import javax.swing.*;
13、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 oneGrad
14、eResult,twoGradeResult,threeGradeResult;JMenuItem carImageIcon,animalImageIcon,fruitImageIcon,buildingImageIcon;File fileOneGrade,fileTwoGrade,fileThreeGrade,gradeFile; / 创建四个File类的对象,分别引用文件“初级记忆排行榜.txt”等!String imageName; / 用于图片名称数组!MemoryTestArea memoryArea;ShowRecordDialog showDialog = null;int m
15、=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(“中级“)
16、;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(oneGra
17、deResult);menuResult.add(twoGradeResult);menuResult.add(threeGradeResult);menuIcon = new JMenu(“选择图标“);8 / 31carImageIcon = new JMenuItem(“汽车图标“);carImageIcon.addActionListener(this);animalImageIcon = new JMenuItem(“动物图标“ );animalImageIcon.addActionListener(this);fruitImageIcon = new JMenuItem(“水果图标
18、“); / 水果、建筑图标实例化!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
19、.add(menuIcon);setJMenuBar(bar);oneGradeItem.addActionListener(this);twoGradeItem.addActionListener(this);threeGradeItem.addActionListener(this);oneGradeResult.addActionListener(this);twoGradeResult.addActionListener(this);threeGradeResult.addActionListener(this);if (!fileOneGrade.exists() try fileO
20、neGrade.createNewFile();catch(IOException exp) if (!fileTwoGrade.exists() try fileTwoGrade.createNewFile();catch(IOException exp) if (!fileThreeGrade.exists() try fileThreeGrade.createNewFile();catch(IOException exp) setBounds(300,200,620,480); /设置组件在容器坐标系(300,200),尺寸为:宽620px,高480px !setVisible(true
21、); /设置窗户属性为可见memoryArea = new MemoryTestArea(); /MemoryTestArea()的一个对象 memoryAreaimageName = new StringimageNumber;for (int i=0; i showUsedTime:JTextFiledimageFileName:String hintMessage:JTextFiledopenIconList:LinkedList timer:TimeropenBlockList: LinkedList record:RecordMemoryTestArea():无类型initBlock
22、(int,int,String, File):voidsetImageName(String):voidactionPerformed(ActionEvent):voidrun():voidmemoryArea:MemoryTestArea12 / 311)成员变量row 和 col 的值确定测试区中方块的数量。MemoryTestArea 类创建的对象 memoryArea 是 MemoryGame中的成员,memoryArea 对象通过调用 initBlock(int,int,String,File)方法将 MemoryGame 类中的 m和 n 值传递给 row 和 col。usedTi
23、me 是用户的用时,单位是秒,iconNum 是用户鼠标单击的次数,单位是次。Success 的值是用户找到的具有相同的图标方块的个数。gradeFile 是级别文件,memoryArea 对象通过调用 initBlock(int,int ,String,File )方法见MemoryGame 类中的 gradeFile 的引用传递给 memoryArea 对象中的 gradeFile。 数组表 allBlockList 单元的个数是 row 和 col 的乘积,它的每个单元存放着一个 Block 对象。memoryArea对象在调用 intBlock(int,int,String,File)
24、方法时完成对 allBlockList 单元初始化,即创建单元中的Block 对象。 字符串数组 imageFileName 中的每个单元是一幅图像文件的文字。memoryArea 对象通过调用setImageName(String)方法将 MemoryGame 中存放图像文件名字的 imageName 数据的引用传递给imageFileName。链表 openIconList 用来存放用户找到的图标相同的方块上的图标。链表 openBlockList 用来存放用户找到的图标相同的方块。hintThread 是用 Thread 类创建的线程对象,用来提示测试区中的 Block 上的图标,提示方
25、式是将测试区中的各个 Block 上图标持续显示 1200 毫秒。hintButton 是注册了 ActionEvent 事件的监视器,当单击它时,启动 hintThread 线程。 showUsedTime 显示用户的用时,即显示 usedTime 的值,showIconNum 是显示用户单击鼠标的次数,即显示 showIconNum 的值。 record 负责提供保存成绩的界面,是一个对话框,默认不见。当用户寻找出级别所要求的相同的图标方块的数目后,该对话框可见,用户可以在该对话框中输入姓名,并保存所输入的姓名和 usedTime 的值到gradeFile 指定的级别文件中。2) 方法13
26、 / 31MemoryTestArea()是构造方法,创建 memoryArea 对象时需使用该构造方法。 initBlock(int,int,String, File)方法。memoryArea 对象调用该方法将参数的值传递给row、col、imageFileName 和 gradeFile,并依据这些值设置 allBlockList 数组表的大小,然后创建allBlockList 的单元中的 Block 对象,并设置 Block 对象上的图标。 setImageName(String)方法。memoryArea 对象调用该方法可以将 MemoryGame 中存放图像文件名字的 imageN
27、ame 数组的引用传递给 imageFileName。当用户单击 MemoryGame 主类窗口的 carImageIcon 和animalImageIcon 菜单项时, memoryArea 对象将调用该方法把存放图像文件名字的 imageName 数组的引用传递给 imageFileName。 actionPerformed(ActionEvent )方法。该方法是 MemoryArea 类实现的 ActionListener 接口中的方法。memoryArea 中的每个 Block 对象注册了 ActionEvent 事件监视器,当用户单击 memoryArea 中的某个Block 对象
28、时,actionPerformed(ActionEvent)方法将被调用执行,所执行的主要操作是:如果该 Block对象未显示图标,并且该 Block 对象设置的图标和 openIconList 的存放的图标相同,就将该图标添加到链表 openIconList 中同时将该 Block 对象上图标显示出来,并将 success 的值增 1;如果该 Block 对象未显示图标,并且该 Block 对象设置的图标和 OpenIconList 的中存放的图标不相同,就将 openIconList 清空,然后再将该图标添加到链表 openIconList 中,同时将该 Block 对象上图标显示出来,并
29、将 success 的值设置成 1。当用户单击 hintButton 按钮时,actionPerformed (ActionEvent)方法将被调用执行,执行的主要操作是启动 hintThread 线程。 run()方法。该方法是 MemoryArea 类实现 Runnable 接口中的方法,启动 hintThread 线程后,该方法将执行,其主要操作是将测试区中的未显示图标的各个 Block 对象上的图标持续显示 1200 毫秒。3. (MemoryTestArea.java)import javax.swing.*;import java.awt.event.*;import java.a
30、wt.*;import java.util.*;import java.io.*;import java.applet.AudioClip;import java.applet.Applet;import .*;public class MemoryTestArea extends JPanel implements ActionListener,Runnable /Runnbale int row, col;File gradeFile,musicFile;ArrayListallBlockList;String imageFileName;LinkedListopenIconList;Li
31、nkedListopenBlockList;int success = 0;Thread hintThread;JButton hintButton;14 / 31int usedTime = 0;int iconNum = 0; JTextField showIconNum; JTextField showUsedTime,hintMessage;javax.swing.Timer timer;Record record;JPanel center,south;MemoryTestArea()setLayout(new BorderLayout();allBlockList = new Ar
32、rayList();openIconList = new LinkedList();openBlockList= new LinkedList();hintThread = new Thread(this);hintMessage = new JTextField();hintMessage.setHorizontalAlignment(JTextField.CENTER);hintMessage.setEditable(false);hintMessage.setFont(new Font(“宋体“,Font.BOLD,18);center = new JPanel();south = ne
33、w JPanel();hintButton = new JButton(“提示“);hintButton.addActionListener(this);showUsedTime = new JTextField(8);showUsedTime.setEditable(false); /使调用这个函数的控件不能被编辑,如果设为true或者不调用这个函数,则控件可以编辑showIconNum = new JTextField(4);showIconNum.setEditable(false); showIconNum.setHorizontalAlignment(JTextField.CENTE
34、R);showUsedTime.setHorizontalAlignment(JTextField.CENTER);south.add(new JLabel(“用时:“);south.add(showUsedTime);south.add(new JLabel(“鼠标单击次数:“);south.add(showIconNum);south.add(new JLabel(“提示图标位置(导致用时增加: ) “);south.add(hintButton);add(south,BorderLayout.SOUTH);add(hintMessage,BorderLayout.NORTH);timer
35、 = new javax.swing.Timer(1000,this);record = new Record();public void initBlock(int m,int n,String name,File f)row = m;col = n;gradeFile = f;center.removeAll();imageFileName = name;15 / 31ImageIcon icon = new ImageIconimageFileName.length;for (int i=0; i20 / 312. UML 图ShowRecordDialog 类是 javax.swing
36、 包中 JDialog 的子类,并实现了 ActionListener 接口,该类创建的对象 showDialog 是 MemoryGame 窗口的成员之一。当用户选择窗口上的“查看排行榜”菜单中的菜单项,该对话框可见,并显示相应级别文件中存储的成绩。标明 ShowRecordDialog 类的主要成员变量、方法以及和 MemoryGame 类之间组合关系的 UML 图如下图所示ShowRecordDialoglei 类的 UML 图以下是 UML 图中有关数据和方法的详细说明。1)成员变量gradeFile 是对话框要读取的文件,该文件存储成绩。 clear 是注册了 ActionEvent
37、 事件的按钮。 showArea 文本区显示对话框从 gradeFile 文件中读出的成绩。 treeSet 负责将成绩按高低排序。2)方法JDialog ActionListenerShowRecordDialoggradeFile:Fileclear:JButtonshowArea:JTextAreatreeSet:TreeSetShowRecordDialog():无类型setGradeFile( File):voidshowRecord(): voidactionPerformed(ActionEvent ):voidMemoryGameshowDialog:ShowRecordDia
38、log21 / 31ShowRecordDialog()是构造方法,负责创新 showDialog 对象。 setGradeFile( File)方法。ShowRecordDialog 类创建的 ShowrecordDialog 对话框是主类 MemoryGame 窗口中的一个成员。当用户选择窗口上的“查看排行榜”菜单中的菜单项时,ShowrecordDialog 对话框调用setGradeFile( File)方法将相应的级别文件传递给 gradeFile。 showRecord()方法。 ShowrecordDialog 对话框调用该方法读取 gradeFile 文件中的成绩,为了将成绩按
39、高低顺序显示在 showArea 文本区中,showRecord()方法跟读取的名字和该名字的对应成绩,创建一个People 对象,并将该 People 对象存放在 treeSet 树集中。 actionPerformed(ActionEvent )是 ActionListener 接口中的方法,clear 注册了 ActionEvent 事件,当用户单击 clear 按钮时, actionPerformed(ActionEvent)方法被调用执行,所执行的操作是清除 gradeFile 文件中的内容。3. 代码(ShowRecordDialog)import java.io.*;import
40、 java.util.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;public class ShowRecordDialog extends JDialog implements ActionListenerFile gradeFile;JButton clear;JTextArea showArea = null;TreeSettreeSet;public ShowRecordDialog()treeSet = new TreeSet();showArea = new JTextArea(6,6);show
41、Area.setFont(new Font(“楷体“,Font.BOLD,20);clear = new JButton(“清空排行榜“);clear.addActionListener(this);add(new JScrollPane(showArea),BorderLayout.CENTER);add(clear,BorderLayout.SOUTH);setBounds(250,250,500,250);setModal(true);addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)
42、setVisible(false););22 / 31public void setGradeFile(File f)gradeFile = f;setTitle(f.getName();public void showRecord()showArea.setText(null);treeSet.clear();tryRandomAccessFile in = new RandomAccessFile(gradeFile,“rw“);long fileLength = in.length();long readPosition = 0;while (readPosition iter = tr
43、eeSet.iterator();while(iter.hasNext()People p = iter.next();showArea.append(“姓名: “ + p.getName()+ “,成绩 :“ + p.getTime() + “秒“ + “,鼠标单击次数:“ + p.getIconNum();/showArea.append(“姓名: “ + p.getName()+ “,成绩 :“ + p.getTime() + “秒“);showArea.append(“n“);catch(IOException exp) System.out.println(exp);public v
44、oid actionPerformed(ActionEvent e) if (e.getSource() = clear) try File f = gradeFile.getAbsoluteFile();gradeFile.delete();f.createNewFile();showArea.setText(“排行榜被清空“);catch(Exception ee)23 / 311.3.5 People 类1. 效果图People 是我们编写的一个类,该类对象中的数据是用户的姓名和成绩,被显示在 ShowRecordDialog对话框中的 showArea 文本区中(见下图) 。2. UM
45、L 图People 对象中的数据由 ShowRecordDialog 对话框从 gradeFile 文件中读取的用户姓名和成绩所构成。ShowRecordDialog 对话框将 People 对象作为其 treeSet 树集上的节点,以便按着成绩高低顺序排列 People对象。标明 People 类的主要成员变量、方法以及和 ShowrecordDialog 类之间关系的 UML 图如下图People 类的 UML 图 以下是 UML 图中有关数据和方法的详细说明。1) 成员变量Name 是用户的名字。 Time 是用户的用时。IconNum 是用户鼠标单击次数。2) 方法People Sho
46、wRecordDialogname:Stringtime:inticonNum:intgetTime():intgetName(): StringgetIconNum():intcompareTo(Object):inttreeSet:TreeSet24 / 31getTime()方法返回 time。 getName()方法返回 name。 getIconNum()方法返回 iconNum。 compareTo(Object)是 Compareable 接口中的方法,其操作是确定 People 对象的大小关系。3. 代码(People.java)import java.io.*;public
47、class People implements Serializable,ComparableString name = null;int iconNum = 0;int time = 0;public People (String name,int t,int n) this.name = name;time = t;iconNum = n;/public People(String name2, int time2, int iconNum) / TODO Auto-generated constructor stub/public int getTime() return time;public String getName() return name;public int getIconNum()return iconNum;public int compareTo(Object b) People p = (People) b;/* if (this.time-p.time)