记忆测试系统

更新时间:2024-04-27 03:48:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《 面向对象程序设计》

课程设计报告

题 目: 记忆测试系统软件设计与实现 院 (系): 信息科学与工程学院 专业班级: 计算机科学与技术1201班 学生姓名: 程 伟 学 号: 20121183011 指导教师: 吴 奕 20 14 年 12 月 29 日至20 15 年 1 月 9

华中科技大学武昌分校制

1

面向对象程序设计 课程设计任务书

一、设计(调查报告/论文)题目 记忆测试系统软件设计与实现 二、设计(调查报告/论文)主要内容 内容: 本游戏是通过由用户点击图片显示出图片后,如果是相同的,便保持图形,如果用户点开的是不同的图片则先前点击的图片被清空。当用户同时点击出规定数目的图片后,弹出保存成绩框。 基本功能与要求: 记忆测试系统是通过回忆法测试记忆能力,测试手段分为初级、中级、高级三个级别。 1、单击“选择级别”菜单可以选择初级、中级或高级。 2、单击“查看排行榜”菜单可以查看初级记忆榜、中级记忆榜或高级记忆榜,通过记忆榜存储每个级别的成绩。 3、选择级别后,将出现相应级别的测试区。 4、测试区能显示用户的同时,并根据级别的不同,提示用户必须用鼠标连续单击出多个图标相同的方块。 5、测试区有提示图标所在位置的功能。 6、单击“选择图标”菜单可重新选择方块图标样式,既可以重新选择m个图标。 三、原始资料 1.《面向对象程序设计课程设计》指导书 2. 耿祥义.JAVA大学实用教程.北京:清华大学出版社,2009. 2

四、要求的设计(调查/论文)成果 1.课程设计报告 2.课程设计软件 五、进程安排 布置任务,查找资料、需求分析1天 总体设计1天 详细设计1.5天 编制源程序实现3.5天 测试与修改1天 撰写课设报告2天 六、主要参考资料 [1] 张广彬. Java课程设计案例精编(第二版).北京:清华大学出版社, 2011. [2] 耿祥义. Java课程设计(第二版).北京:清华大学出版社, 2008. [3] 耿祥义.JAVA大学实用教程.北京:清华大学出版社,2009. [4] 邹林达.陈国君 Java2程序设计基础.北京:清华大学出版社,2010. [5] 邹林达.Java2程序设计基础实验指导.北京:清华大学,2010. 3

指导教师(签名): 20 年 月 日 4

目 录

1需求与总体设计 .......................................................... 1 1.1需求分析 .............................................................. 1 1.1.1功能结构图 .......................................................... 1 1.1.2 UML类图 ............................................................ 2 1.2总体设计模块 .......................................................... 2 1.2.1 MemoryGame主类 ..................................................... 2 1.2.2 MemoryTestArea类 ................................................... 3 1.2.3 Block类 ............................................................ 3 1.2.4 Record类 ........................................................... 3 1.2.5 ShowRecordDialog类 ................................................. 3 1.2.6 People类 ........................................................... 3 1.2.7 图像文件 ............................................................ 3 2详细设计 ................................................................ 4 2.1 MemoryGame主类 ....................................................... 5 2.2 MemoryTestArea类 ..................................................... 7 2.3 Block类 ............................................................. 11 2.4 Record类 ............................................................ 12 2.5 ShowRecordDialog类 .................................................. 13 2.6 People类 ............................................................ 15 3编码实现 ............................................................... 17 3.1 MemoryGame主类 ...................................................... 17 3.2 MemoryTestArea类 .................................................... 23 3.3 Block类 ............................................................. 32 3.4 Record类 ............................................................ 32 3.5 ShowRecordDialog类 .................................................. 35 3.6 People类 ............................................................ 38 4系统测试 ............................................................... 40 总 结 ................................................................... 41

5

1需求与总体设计

1.1需求分析

记忆测试系统是通过回忆法测试记忆能力,测试手段分为初级、中级和高级 三个级别,使用该系统以达到测试和锻炼记忆能力的目的。使用File技术保存用户信息,同时保存每个用户的不同等级的成绩

1.1.1功能结构图

记忆测试系统的功能结构图如图1.1所示。

在记忆测试系统中,编写6个Java类:MemoryGame.java、MemoryTestArea.java、Block.java、ShowRecordDialog.java、Record.java、People.java

记忆测试系统窗口及测试区测试级别级别记忆排行榜图标选择初级中级高级汽车图标初级记忆排行榜中级记忆排行榜高级记忆排行榜动物图标 图1.1 功能结构图

1

1.1.2 UML类图

记忆测试系统除了上述6个Java类外,还需要Java系统提供的一些重要的类。记忆测试系统所用到的一些重要的类以及之间的组合关系如图1.2所示。

图1.2 类之间的组合关系

1.2总体设计模块 1.2.1 MemoryGame主类

MemoryGame.java类负责创建记忆测试系统的主窗口,该类含有main方法,记忆测试系统从该类开始执行。MemoryGame类有四种重要类型的对象,分别是String、File、MemoryTestArea和ShowRecordDialog对象。

2

1.2.2 MemoryTestArea类

MemoryTestArea类是主类MemoryGame窗口中的一个JPanel容器,所创见的对象称为“测试区”,这个“测试区”别添加到MemoryGame窗口的中心。MemoryTestArea类主要有6种类型的成员:ArrayList、String、Record、Timer、File和Thread对象。

1.2.3 Block类

Block类是Jbubtton的子类,负责为MemoryTestArea类中的ArrayList数组表提供Block对象。

1.2.4 Record类

Record类是javax.swing包中Jdialog对话框的子类,当用户成功单击出相应级别所要求的图表相同的方块后,Record创建的对象负责保存用户的名字和成绩到相应的级别文件中。

1.2.5 ShowRecordDialog类

ShowRecordDialog类是java.swing包中JDialog对话框的子类,当用户单击“查看排行榜”时,ShowRecordDialog创建的对象显示用户的成绩。

1.2.6 People类

People对象封装用户的名字和成绩,以便ShowRecordDialog对象可以按成绩的高低排序用户。

1.2.7 图像文件

创建图标对象需如下两组图片:

(1)car0.jpg、car1.jpg、car2.jpg、car3.jpg、car4.jpg、car5.jpg、car6.jpg、car7.jpg

(2)ani0.jpg、ani1.jpg、ani2.jpg、ani3.jpg、ani4.jpg、ani5.jpg、ani6.jpg ani7.jpg

3

2详细设计

操作界面设计:

编译运行,选择级别,图标游戏开始,如果用户不清楚相同图标的位置时,点击提示。

界面方案:窗口大小:setBounds(100,100,400,360);setVisible(true); 字体的大小和颜色:hinMessage.setFont(new Font(“宋体”,Font.BOLD,18)); 布局控制:又上到下,先是菜单:选择级别,查看排行榜,选择图标; 提示信息:hintMessage.setText(“您需要用鼠标单击出” +col+“个同样图标的方块” );

图标随机排布,有M×N个方块随机分布,下面是一记录用户时间以及提示按钮,提示用户相同图标的位置。 程序流程图如图2.1所示:

4

开始界面Y用户点击测试区?N“运行记忆测试系统”菜单条查看排行榜?弹出“保存成绩”对话框YN级别?N选择图标?调用方法打开用户指定的排行榜YY重新构造界面关闭结束

图2.1 程序流程图

2.1 MemoryGame主类

MemoryGame创建窗口如图2.2所示

5

图2.2 MemoryGame创建窗口

MemoryGame主类与其他类间的交互关系如图2.3所示:

6

图2.3 MemoryGame主类与其他类间交互关系

以下是UML图中有关数据和方法的详细说明。 1)成员变量

?bar是JMenuBar类创建的菜单条,可以向bar中添加菜单。

?menuGrade、menuResult、menuIcon是JMenu创建的三个菜单,这三个菜单的名称分别是“选择级别”、“查看排行榜”和“选择图标”。

?oneGradeItem、twoGradeItem、threeGradeIte是JMenuItem类创建的三个菜单项,被添加到menuGrade菜单中,这三个菜单项的名称分别是“初级”,“中级”和“高级”。

?oneGradeResult、twoGradeResult、threeGradeResult是JMenuItem类创建的三个菜单项,被添加到menuResult菜单中,这三个菜单项的名称分别是“初级排行榜”,“中级排行榜”和“高级排行榜”。

?carImageIcon、animalImageIcon是JMenuItem类创建的两个菜单项,被添加到menuIcon菜单中,这两个菜单项的名称分别是“汽车图标”和“动物图标”。 ?fileOneGrade、fileTwoGrade、fileThreeGrade和gradeFile是File类创建的四个文件对象。fileOneGrade、fileTwoGrade、fileThreeGrade所引用的文件分别是“初级记忆排行榜.txt”、“中级记忆排行榜.txt”、“高级记忆排行榜.txt”,分别用来写入三个级别的成绩。gradeFile可以是fileOneGrade、fileTwoGrade、fileThreeGrade中的某一个。

?imageName是String类型的组件,每个单元是一个图像文件的名字。 ?memoryArea是测试区对象,由MemoryArea类负责创建。

?showDiolag是负责显示成绩的对话框,由ShowRecordDialog类负责创建 ?m和n的int型数据,其值可以确定相应级别中测试区中方块的数量,例如,对于中级水平,m=6,n=7,测试区一个有42个方块。 2)方法

?actionPerformed(ActionEvent)方法是MemoryGame类实现ActionListener接口中的方法,负责执行菜单项发出的有关命令。用户选择菜单中的菜单项可触发ActionEvent事件,导致actionPerformed(ActionEvent)方法执行相应的操作。 ?MemoryGame()是构造方法,负责完成窗口的初始化。 ?main(String[])方法是软件运行的入口方法。

2.2 MemoryTestArea类

MemoryTestArea创建的测试区如图2.4所示

7

图2.4 MemoryTestArea创建的测试区

MemoryTestArea类与其他类间的交互关系如图2.5所示:

8

图2.5 MemoryTestArea类与其他类间交互关系

以下是UML图中有关数据和方法的详细说明。 1)成员变量

?row和col的值确定测试区中方块的数量。MemoryTestArea类创建的对象memoryArea是MemoryGame中的成员,memoryArea对象通过调用initBlock(int,int,String[],file)方法将MemoryGame类中m和n的值传递给row和col。

?usedTime是用户的用时,单位是秒。

?success的值是用户找到的具有同样的图标的方块的个数。

?gradeFile是级别文件,memoryArea对象通过调用initBlock(int,int,String[],file)方法将MemoryGame类中的gradeFile的引用传递给memoryArea对象中的 gradeFile。

?数组表allBlockList单元的个数是row和col的乘积,它的每个单元存放着一个Block对象。memoryArea对象在调用initBlock(int,int,String[],file)方法时完成对

9

allBlockList单元的初始化,即创建单元中的Block对象。

?字符串数组imageFileName中的每个单元是一幅图像文件的文字。memoryArea对象通过调用setImageName(String[])方法将MemoryGame中存放图像文件名字的imageName数组的引用传递给imageFileName。

?链表openIconList用来存放用户找到的图标相同的方块上的图标。 ?链表openBlockList用来存放用户找到的图标相同的方块。

?hintThread是用Thread类创建的线程对象,用来提示测试区中的Block上的图标,提示方式是将测试区中的各个Block上图标持续显示1200毫秒。 ?hintButton是注册了ActionEvent事件的监听器,当单击它时,启动hintThread线程。

?showUsedTime显示用户的用时,即显示usedTime的值。

?hintMessage根据不同的级别显示相应的提示信息,如该级别需要用户寻找的相同图标方块的数目。

?timer是计时器,负责改变usedTime的值。

?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主类窗口的cartImageIcon和animalImageIcon菜单项时,memoryArea对象将调用该方法把存放图像文件名字的imageName数组的引用传递给imageFileName。

?actionPerformed(ActionEvent)方法。该方法是MemoryArea类实现的ActionListener接口中的方法。memoryArea中的每个Block对象都注册了ActionEvent事件监听器,当用户单击memoryArea中的某个Block对象时,actionPerformed(ActionEvent)方法将被调用执行,所执行的主要操作是:如果该Block对象未显示图标,并且该Block对象设置的图标和openIconList的中存放的图标相同,就将该图标添加到链表openIconList中,同时将该Block对象上

10

图标显示出来,并将success的值增1;如果该Block对象未显示图标,并且该Block对象设置的图标和openIconLis的中存放的图标不相同,就将openIconList清空,然后再将该图标添加到链表openIconList中,同时将该Block对象上图标显示出来,并将success的值设置成1。但用户单击hintButton按钮时,actionPerformed(ActionEvent)方法将被调用执行,执行的主要操作是启动hintThread线程。

?run()方法。该方法是MemoryArea类实现的Runnable接口中的方法,启动hintThread线程后,该方法将执行,其主要操作是将测试区中的未显示图标的各个Block对象上的图标持续显示1200毫秒。

2.3 Block类

Block类创建的按钮如图2.6所示

( a ) 图标不可见时的方块 ( b ) 图标可见时的方块

图2.6 Block创建的按钮

Block类与其他类间的交互关系如图2.7所示:

图2.7 Block类与其他类间交互关系

以下是UML图中有关数据和方法的详细说明。

11

1)成员变量

openStateIocn是方块上的图标。 2)方法

?Block对象调用setOpenStateIcon(ImageIcon)方法可以设置它上面的图标。 ?Block对象调用openStateIcon()方法可以获得它上面的图标。

2.4 Record类

Record类创建的保存成绩对话框,如图2.8所示

图2.8 Record类创建的保存成绩对话框

Record类与其他类间的交互关系如图2.9所示:

图2.9 People类与其他类间交互关系

以下是UML图中有关数据和方法的详细说明。 1)成员变量

? time是用户的用时。

? yourName是用户用来输入名字的文本框。

?enter,cancel是按钮对象,用户单击enter按钮可保存成绩,单击cancel按钮可放弃保存成绩。

12

?gradeFile是级别文件。 2)方法

?Record()是构造方法,负责创建record对象。

?setGradeFile(File)方法。Record类创建的Record对话框是测试区MemoryTestArea中的一个成员。当用户成功单击出相应级别所要求的图标相同的方块后,测试区弹出Record对话框,Record对话框将调用setGradeFile(File)方法将测试区中的级别文件传递给Record对话框gradeFile。

?setTime(int)方法。当用户成功单击出相应级别所要求的图标相同的方块后,测试区弹出Record对话框,Record对话框将调用setTime(int)方法将测试区记录的用户用时传递给Record对话框中的time。

?actionPerformed(ActionEvent)是ActionListener接口中的方法,enter和cancel按钮注册了ActionEvent事件,当用户单击enter时,actionPerformed(ActionEvent)方法被调用执行,其操作是将用户在文本框yourName中输入的名字以及time的值保存到gradeFile文件中,然后关闭当前对话框;当用户单击cancel按钮时,actionPerformed(ActionEvent)方法将被调用执行,其操作是关闭当前对话框。

2.5 ShowRecordDialog类

ShowRecordDialog类创建的查看排行榜对话框,如图2.10所示

图2.10 ShowRecordDialog类创建的查看排行榜对话框

ShowRecordDialog类与其他类间的交互关系如图2.11所示:

13

图2.11 ShowRecordDialog类与其他类间交互关系

以下是UML图中有关数据和方法的详细说明。 1)成员变量

?gradeFile是对话框要读取的文件,该文件存储成绩。 ?clear是注册了ActionEvent事件的按钮。

?showArea文本区显示对话框从gradeFile文件中读出的成绩。 ?treeSet负责将成绩按高低排序。 2)方法

14

?ShowRecordDialog()是构造方法,负责创建showDialog对象。

?setGradeFile(File)方法。ShowRecordDialog类创建的ShowRecordDialog对话框是主类MemoryGame窗口中的一个成员。当用户选择窗口上的“查看排行榜”菜单中的菜单项时,ShowRecordDialog对话框调用setGradeFile(File)方法将相应的级别文件传递给gradeFile。

?showRecord()方法。ShowRecordDialog对话框调用showRecord()方法读取gradeFile文件中的成绩,为了将成绩按高低顺序显示在showArea文本区中,showRecord()方法根据读取的名字和该名字的对应成绩,创建一个People对象,并将该People对象存放在treeSet树集中。

?actionPerformed(ActionEvent)是ActionListener接口中的方法,clear注册了ActionEvent事件,当用户单击clear按钮时,actionPerformed(ActionEvent)方法被调用执行,清除gradeFile文件中的内容。

2.6 People类

People类对象中的数据使用户的姓名和成绩,被显示在ShowRecordDialog对话框中shoeArea的文本区中,如图2.12所示

图2.12 People类在排行榜中的数据

People类与其他类间的交互关系如图2.13所示:

15

图2.13 People类与其他类间交互关系

以下是UML图中有关数据和方法的详细说明。 1)成员变量

?name是用户的名字。 ?time是用户的用时。 2)方法

?getTime()方法返回time。 ?getName()方法返回name。

?compareTo(Object)是comparable接口中的方法,其操作是确定People对象的大小关系。

16

3编码实现

3.1 MemoryGame主类

代码:

public class MemoryGame extends JFrame implements ActionListener{

public static void main(String args[]){

new MemoryGame(); }

//声明bar菜单条 JMenuBar bar;

//声明bar创建的三个菜单对象

JMenu menuGrade,menuResult,menuIcon; //声明菜单”选择级别“的三个菜单项对象

JMenuItem oneGradeItem,twoGradeItem,threeGradeItem; //声明菜单”查看排行榜“的三个菜单项对象

JMenuItem oneGradeResult,twoGradeResult,threeGradeResult; //声明菜单”选择图标“的两个菜单项对象 JMenuItem carImageIcon,animalImageIcon; //声明文件对象

File fileOneGrade,fileTwoGrade,fileThreeGrade,gradeFile; //声明图像文件的名字 String imageName[]; //声明测试区对象

MemoryTestArea memoryArea; //创建显示成绩的对话框

ShowRecordDialog showDiolag=null; //初始测试区中方块的数量、图片 int m=5,n=6;

final int imageNumber=7; //构造方法,为了初始化“记忆测试系统”窗口 MemoryGame(){

//创建三个文件对象

fileOneGrade=new File(\初级记忆排行榜.txt\

17

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(\选择图标\ //创建2个菜单项对象

carImageIcon=new JMenuItem(\汽车图标\

18

animalImageIcon=new JMenuItem(\动物图标\

menuIcon.add(carImageIcon);//向“选择图标”菜单中增加“汽车图标”选项

menuIcon.add(animalImageIcon);//向“选择图标”菜单中增加“动物图标”选项

bar.add(menuGrade);//向菜单条中增加“选择级别”菜单 bar.add(menuResult);//向菜单条中增加“查看排行榜”菜单 bar.add(menuIcon);//向菜单条中增加“选择图标”菜单

setJMenuBar(bar);//创建bar菜单条

setBounds(100,100,400,360);//设置出现在屏幕上时的初始位置(100,100)和大小

setVisible(true);//设置窗口可见

oneGradeItem.addActionListener(this);//菜单”初级“项注册监视器

twoGradeItem.addActionListener(this);//菜单”中级“项注册监视器

threeGradeItem.addActionListener(this);//菜单”高级“项注册监视器

oneGradeResult.addActionListener(this);//菜单”初级排行榜“项注册监视器

twoGradeResult.addActionListener(this);//菜单”中级级排行榜“项注册监视器

threeGradeResult.addActionListener(this);//菜单”高级排行榜“项注册监视器

animalImageIcon.addActionListener(this);//菜单”动物图标“项注册监视器

carImageIcon.addActionListener(this);//菜单”汽车图标“项注册监视器

//当”初级记忆排行榜.txt“文件不存在时,创建该文件 if(!fileOneGrade.exists()){ try { fileOneGrade.createNewFile();//以免发生异常

19

}

catch(IOException exp){} }

////当”中级记忆排行榜.txt“文件不存在时,创建该文件 if(!fileTwoGrade.exists()){ try { fileTwoGrade.createNewFile();//以免发生异常 }

catch(IOException exp){} }

////当”高级记忆排行榜.txt“文件不存在时,创建该文件 if(!fileThreeGrade.exists()){ try { fileThreeGrade.createNewFile();//以免发生异常 }

catch(IOException exp){} }

//创建测试区对象

memoryArea=new MemoryTestArea(); //初始化图片的数量

imageName=new String[imageNumber]; //将图片名字保存到imageName[]数组中 for(int i=0;i

gradeFile=fileOneGrade;

//调用类MemoryTestArea的initBlock方法初始化图标 memoryArea.initBlock(m,n,imageName,gradeFile); //将组件memoryArea增加到中间区域 add(memoryArea,BorderLayout.CENTER); //显示成绩对话框

showDiolag=new ShowRecordDialog();

//添加组件memoryArea后,让容器调用validate()方法,保证容器中的组件能正常显示 validate();

20

//设置“关闭程序后,结束窗体所在的应用程序” setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } 件

m=5;//初始化行数 n=6;//初始化列数

gradeFile=fileOneGrade;//将“初级记忆排行榜.txt”文件赋给gradeFile

//调用initBlock()方法创建和设置图标

memoryArea.initBlock(m,n,imageName,gradeFile); } 件

m=6;//初始化行数 n=7;//初始化列数

gradeFile=fileTwoGrade;//将“中级记忆排行榜.txt”文件赋给gradeFile

//调用initBlock()方法创建和设置图标

memoryArea.initBlock(m,n,imageName,gradeFile); } 件

m=7;//初始化行数 n=8;//初始化列数

gradeFile=fileThreeGrade;//将“高级记忆排行榜.txt”文件赋给gradeFile

//调用initBlock()方法创建和设置图标

if(event.getSource()==threeGradeItem){

//用户从菜单条点击菜单“选择级别”中的菜单项“高级”,触发事

if(event.getSource()==twoGradeItem){

//用户从菜单条点击菜单“选择级别”中的菜单项“中级”,触发事

//该方法是接口ActionListener的方法,触发ActionEvent事件,用来执public void actionPerformed(ActionEvent event){

if(event.getSource()==oneGradeItem){

//用户从菜单条点击菜单“选择级别”中的菜单项“初级”,触发事

行菜单项发出的有关命令

21

memoryArea.initBlock(m,n,imageName,gradeFile); }

if(event.getSource()==carImageIcon){

//用户从菜单条点击菜单“选择图标”中的菜单项“汽车图标”,触for(int i=0;i

imageName[i]=new String(\}

//调用方法把存放图像文件名字的imageName数组的引用传递

发事件

给imageFileName

memoryArea.setImageName(imageName);

//调用initBlock()方法创建和设置imageName数组图标 memoryArea.initBlock(m,n,imageName,gradeFile); }

if(event.getSource()==animalImageIcon){

//用户从菜单条点击菜单“选择图标”中的菜单项“动物图标”,触for(int i=0;i

imageName[i]=new String(\}

发事件

//调用方法把存放图像文件名字的imageName数组的引用传递给memoryArea.setImageName(imageName);

//调用initBlock()方法创建和设置imageName数组图标 memoryArea.initBlock(m,n,imageName,gradeFile);

imageFileName

}

if(event.getSource()==oneGradeResult){

//用户从菜单条点击菜单“查看排行榜”中的菜单项“初级记忆排showDiolag.setGradeFile(fileOneGrade);//调用setGradeFile()//对话框调用showRecord()方法读取gradeFile文件中的成绩,按

行榜”,触发事件

方法将级别文件传递给gradeFile 高低顺序显示在showArea文本区 showDiolag.showRecord(); //设置文本框可见

22

showDiolag.setVisible(true); }

if(event.getSource()==twoGradeResult){

//用户从菜单条点击菜单“查看排行榜”中的菜单项“中级记忆排

行榜”,触发事件

showDiolag.setGradeFile(fileTwoGrade);//setGradeFile()方法将级别文件传递给gradeFile

//对话框调用showRecord()方法读取gradeFile文件中的成绩,按高低顺序显示在showArea文本区 showDiolag.showRecord(); //设置文本框可见

showDiolag.setVisible(true); }

if(event.getSource()==threeGradeResult){

//用户从菜单条点击菜单“查看排行榜”中的菜单项“高级记忆排行榜”,

触发事件

showDiolag.setGradeFile(fileThreeGrade);//调用setGradeFile()方法将级别文件传递给gradeFile

//对话框调用showRecord()方法读取gradeFile文件中的成绩,按高低顺序显示在showArea文本区 showDiolag.showRecord();

//对话框调用showRecord()方法读取gradeFile文件中的成绩,按高低顺序显示在showArea文本区

showDiolag.setVisible(true); } } }

3.2 MemoryTestArea类

代码:

class MemoryTestArea extends JPanel implements ActionListener,Runnable {

//确定测试区中方块的数量row,col

23

int row,col;

//用户的用时,单位是秒 int usedTime=0;

//用户找到的具有同样的图标的方块的个数 int success=0; //级别文件 File gradeFile;

//数组表allBlockList的每个单元存放着一个Block对象 ArrayListallBlockList;

//字符串数组imageFileName中的每个单元是一幅图像文件的文字 String imageFileName[];

//链表openIconList用来存放用户找到的图标相同的方块上的图标 LinkedListopenIconList;

//链表openBlockList用来存放用户找到的图标相同的方块 LinkedListopenBlockList; //用Thread类声明的线程对象 Thread hintThead;

//hintButton是注册了ActionEvent事件的监听器,当单击它时,启动JButton hintButton;

//文本框组件:显示用户同时(usedTime的值),显示要寻找的方块数 JTextField showUsedTime,hintMessage; //计时器,负责改变usedTime的值 javax.swing.Timer timer; //声明”保存成绩“对话框对象 Record record;

//声明“中心”和“南”容器对象 JPanel center,south; //构造方法,构造测试区 MemoryTestArea(){

//使用BorderLayout布局 setLayout(new BorderLayout()); //创建数组表allBlockList对象 allBlockList=new ArrayList(); //创建链表openIconList对象

hintThread线程。

24

openIconList=new LinkedList(); //创建字符串数组imageFileName对象 openBlockList=new LinkedList(); //创建hintThead对象 hintThead=new Thread(this);

//创建显示要寻找的方块数hintMessage对象 hintMessage=new JTextField(); //组件的”对齐方式“为“中间对齐”

hintMessage.setHorizontalAlignment(JTextField.CENTER); //组件的“可编辑性'为“不可编辑” hintMessage.setEditable(false); //设置组件的字体

hintMessage.setFont(new Font(\宋体\//创建”中心“对象 center=new JPanel(); //创建”南“对象 south=new JPanel(); //创建”提示“按钮对象

hintButton=new JButton(\提示\//给”提示“按钮注册监听器

hintButton.addActionListener(this); //创建文本框对象,可以输入8个字符 showUsedTime=new JTextField(8); //组件的“可编辑性'为“不可编辑” showUsedTime.setEditable(false); //组件”对齐方式“为”中间对齐“

showUsedTime.setHorizontalAlignment(JTextField.CENTER); //在容器的南增加标签”用时“ south.add(new JLabel(\用时:\//在容器的南增加文本框”显示用户用时“ south.add(showUsedTime);

//在容器的“南”增加标签”提示图标位置(导致用时增加):“ south.add(new JLabel(\提示图标位置(导致用时增加):\//在容器的南增加按钮”提示“ south.add(hintButton);

25

//将组件”南“增加到南边区域 add(south,BorderLayout.SOUTH);

//将组件“hintMessage文本框”增加到北边区域 add(hintMessage,BorderLayout.NORTH); //每隔1000毫秒监视器给计时器计时一次 timer=new javax.swing.Timer(1000,this); //新建”保存成绩“对话框对象,默认对话框不可见 record=new Record(); }

//传递参数给row row=m;

//传递参数给col col=n;

//传递参数给gradeFile gradeFile=f; //去掉容器中的组件 center.removeAll(); //传递参数给imageFileName imageFileName=name; //定义图标

ImageIcon icon[]=new ImageIcon[imageFileName.length]; //载入图片

for(int i=0;i

icon[i]=new ImageIcon(imageFileName[i]); }

public void initBlock(int m,int n,String name[],File f){

if(allBlockList.isEmpty()){//判断数组表allBlockList的每个单元

for(int i=0;i

//清空数组表allBlockList

//给数组表allBlockList的每个单元中增加一个Block对象 allBlockList.add(new Block()); }

是否有一个Block对象

else{

26

allBlockList.clear();

//重新给数组表allBlockList的每个单元中增加一个Block对象 for(int i=0;i

//让数组表allBlockList的每个单元注册监视器 allBlockList.get(i).addActionListener(this); //获得每个单元上面的图标

allBlockList.get(i).setOpenStateIcon(icon[i%row]); }

allBlockList.add(new Block()); }

for(int i=0;i

Collections.shuffle(allBlockList);//随机排列数组表//将组件“center”设置为行为“row”,列为“col”的GridLayout布center.setLayout(new GridLayout(row,col)); for(int i=0;i

//将数组表allBlockList中的每个单元添加到“center”组件中 center.add(allBlockList.get(i)); }

allBlockList的每个单元

//将组件“center”添加到BorderLayout的中心区域 add(center,BorderLayout.CENTER); if(timer.isRunning()){//如果计时器在运行

timer.stop();//让计时器停止 }

//在组件“hintMessage文本框”添加文本\您需要用鼠标单击出+col+hintMessage.setText(\您需要用鼠标单击出\个同样图标的方块//用户用时初始化为0 usedTime=0;

//显示用户同时(usedTime的值)初始化为空 showUsedTime.setText(null);

//添加组件“center”后,让容器调用validate()方法,保证容器中的

个同样图标的方块\\

27

组件能正常显示 象

ImageIcon openStateIcon=block.getOpenStateIcon();//从Blockblock.setIcon(openStateIcon);//设定block的当前图标为上面取

if(openIconList.size()==0) {//如果打开图标列表为空

openIconList.add(openStateIcon);//将刚才的图标加入打开openBlockList.add(block);//将激发事件的对象追加到打开的success=1;//用户找到的具有同样的图标的方块的个数置1 }

对象block中取出打开的状态图标 出来的状态图标

validate(); }

//当用户单击MemoryGame主类窗口的cartImageIcon和animalImageIcon//将MemoryGame中存放图像文件名字的imageName数组的引用传递给public void setImageName(String name[]){

imageFileName=name; }

//如果事件源是Block类的实例

if(e.getSource() instanceof Block){//如果事件源是Block类的按钮

if(!timer.isRunning())//如果计时器没工作

timer.start();//启动计时器

Block block=(Block)e.getSource();//从事件e中取出源block对

菜单项时 imageFileName

public void actionPerformed(ActionEvent e){

图标列表 块列表

else{//如果打开图标列表为不为空

ImageIcon temp=openIconList.getLast();//用户当前打开的

图片图标

28

//判断用户当前打开的图片图标和已经打开的图标是否相同

if(temp==openStateIcon&&!(openBlockList.contains(block))){

}

//用户当前打开的图片图标和已经打开的图标不相同 else

//用户找到的具有同样的图标的方块的个数加1 success=success+1;

//将打开状态下的图标添加到打开图标列表 openIconList.add(openStateIcon); openBlockList.add(block);

//判断用户找到的具有同样的图标的方块的个数是否等于if(success==col){//测试结束

for(int i=0;i

//让数组表allBlockList的每个单元的Block对象allBlockList.get(i).setEnabled(false); }

Block b=openBlockList.get(j);

//让openBlockList的每个单元的Block对象变灰b.setDisabledIcon(b.getOpenStateIcon()); }

列数

变灰(不可点击)

for(int j=0;j

(不可点击)

//让计时器停止 timer.stop();

//将用户用时传递给Record对话框 record.setTime(usedTime);

//将级别文件gradeFile传递给Record对话框 record.setGradeFile(gradeFile); //让Record对话框可见 record.setVisible(true); }

29

if((temp!=openStateIcon)&&(!(openBlockList.contains(block)))){

}

}

//清空链表openIconList用来存放用户找到的图标相同的openIconList.clear();

//清空链表openBlockList用来存放用户找到的图标相同的openBlockList.clear();

//将用户点击的图标添加到链表openIconList openIconList.add(openStateIcon);

//将用户点击的图标添加到链表openBlockList openBlockList.add(block);

//用户找到的具有同样的图标的方块的个数置1 success=1;

//遍历所有测试区图标

for(int i=0;i

//判断测试区的每一个图标是否没有 if(allBlockList.get(i)!=block)

//设置图标为空

allBlockList.get(i).setIcon(null);

方块上的图标

方块

}

}

//如果事件源是按钮hintButton(“提示”) if(e.getSource()==hintButton){

//判断线程hintThead没运行 if(!hintThead.isAlive())

//创建线程hintThead hintThead=new Thread(this);

//遍历所有测试区图标

for(int i=0;i

//将测试区的每一个图标移除监视器

allBlockList.get(i).removeActionListener(this);

//用户用时加10

30

usedTime=usedTime+10; try{

//让线程hintThead启动 hintThead.start(); }

catch(IllegalThreadStateException ex){} }

//如果事件源是计时器“timer” if(e.getSource()==timer){ }

//用户用时加一 usedTime++; //显示用户用时

showUsedTime.setText(\您的用时:\秒\}

/*该方法将测试区中的未显示图标的各个Block对象上的图标持续显示public void run(){

allBlockList.get(i).setIcon(allBlockList.get(i).getOpenStateIcon(

try{ }

catch(InterruptedException exp){} //遍历所有测试区图标

for(int i=0;i

//给数组表allBlockList的每个单元注册监视器 allBlockList.get(i).addActionListener(this); //线程等待1200毫秒 Thread.sleep(1200); //遍历所有测试区图标

for(int i=0;i

//将测试区中的每一个图标显示

1200毫秒*/

));

//遍历所有测试区图标

for(int i=0;i

31

}

if(!openBlockList.contains(allBlockList.get(i)))

//设置图标为空

allBlockList.get(i).setIcon(null);

}

3.3 Block类

代码:

class Block extends JButton {

//方块上的图标

ImageIcon openStateIcon; //该方法设置它上面的图标

public ImageIcon getOpenStateIcon(){

//返回openStateIcon return openStateIcon; }

//该方法获得它上面的图标

public void setOpenStateIcon(ImageIcon icon){

//将icon传给openStateIcon openStateIcon=icon; }

}

3.4 Record类

代码:

class Record extends JDialog implements ActionListener{

//用户的用时 int time = 0;

//声明用户用来输入名字的\文本框\对象

JTextField yourName; //声明标签 JLabel label;

//声明\确定\和“取消”按钮对象

32

JButton enter,cancel ; //级别文件

File gradeFile = null ;

//构造方法,构造“保存成绩”对话框 public Record(){

//设置出现在屏幕上时的初始位置(100,100)和大小 setBounds(100,100,330,160); //设置窗口不可调整大小

setResizable(false);

//该窗口打开时其他窗口都被屏蔽了,点击程序的其他窗口是不允许的 setModal(true); //设置窗口为可见 setVisible(false); //创建“确定”按钮对象 enter=new JButton(\确定\ //创建“取消”按钮对象 cancel=new JButton(\取消\ //创建文本框对象

yourName=new JTextField(8); //设置文本框对象中的文本为“匿名” yourName.setText(\匿名\ //给“确定”按钮注册监视器 enter.addActionListener(this); //给“取消”按钮注册监视器 cancel.addActionListener(this);

//将容器设置为行为“2”,列为“1”的GridLayout布局 setLayout(new GridLayout(2,1)); //创建标签对象 label=new JLabel( );

//添加标签到Record类创建的对话框中 add(label); //声明和创建容器p JPanel p=new JPanel( );

//在容器p上添加“yourName”文本框

33

p.add(yourName);

//在容器p上添加“确定”按钮 p.add(enter);

//在容器p上添加“取消”按钮 p.add(cancel);

//添加容器p到Record类创建的对话框中 add(p) ; } /*

当用户成功单击出相应级别所要求的图标相同的方块后,将调用setGradeFile()

将级别文件传递给Record对话框gradeFile */

public void setGradeFile(File f){

gradeFile = f;

//给Record类创建的对话框添加标题

setTitle(\保存成绩到\ //给Record类创建的对话框添加标签

label.setText(\保存成绩到\

//添加组件后,让容器调用validate()方法,保证容器中的组件能正常显示

validate(); } /*

当用户成功单击出相应级别所要求的图标相同的方块后,测试区弹出Record对话框,

将调用setTime(int)方法,将测试区记录的用户用时传递给Record对话框中的time */

public void setTime(int time) { }

public void actionPerformed(ActionEvent e) {

//如果事件源是“确定”按钮 if(e.getSource() == enter ){ this.time=time ;

34

LinkedList list = new LinkedList (); try{

//以“读写”方式打开当前目录下的文件gradeFile

RandomAccessFile out=new RandomAccessFile(gradeFile,\

out.seek(out.length()) ;

//将用户在文本框yourName中输入的名字保存到gradeFile文件中

out.writeUTF(yourName.getText()); //将用户的time的值保存到gradeFile文件中 out.writeInt(time); //关闭当前对话框 out.close(); } } }

catch(Exception event){ }

//设置对话框不可见 setVisible(false) ; }

//如果事件源是“取消”按钮 if(e.getSource()==cancel){

//设置窗口不可见 setVisible(false) ; }

3.5 ShowRecordDialog类

代码:

class ShowRecordDialog extends JDialog implements ActionListener{

//声明对话框要读取的文件,该文件存储成绩 File gradeFile; //声明按钮

JButton clear;

//声明从gradeFile文件中读出的成绩为空

35

本文来源:https://www.bwwdw.com/article/isyg.html

Top