【问题描述】
九宫格,一款数字游戏,起源于河图洛书,与洛书是中国古代流传下来的两幅神秘图案,历来被认为是河洛文化的滥觞,中华文明的源头,被誉为"宇宙魔方"。九宫格游戏对人们的思维锻炼有着极大的作用,从古时起人们便意识到九宫的教育意义。千百年来影响巨大,在文学、影视中都曾出现过。九宫格最早叫"洛书",现在叫"幻方" 。
【基本要求】
游戏包括界面,基本的控件,有文本框、选择框、按钮等。
用户信息:用户登录需要的账号和密码,新用户注册用到的信息;对玩家信息的记录、保存、读取。
界面信息:图片,九宫格规格;
交互信息:控制游戏的移动;
【问题分析】
本游戏主要完成:整幅图的现实,切换整幅图片、随机打乱图片、开始游戏,结束游戏。
【功能分析】
游戏界面设计:用户登录,进入游戏界面,有良好的功能可视化界面,有游戏规则介绍。例如有计时和分数的显示,游戏图片替换和打乱图片的按键,显示游戏界面的图像画面,游戏玩家开始游戏、悔一步,重新开始的按键。
原始图像的选择:游戏开始时,从准备好的图片中,选择想要拼的图片,要有不同难度的图片(可从相似度考虑);可选择重新开始;随机打乱图像:选择难度(1,2,3),根据难度将图片分成 3*3, 5*5,6*6 的规格,设计算法,随机打乱生成肯定有成功结果的初始化状态九宫格,要求有动态的打乱图片的显示过程(若产生的初始化九宫格无法到达最终状态,应该有提示 3 秒后自动刷新,重新生成);
计时器的设计:动态显示玩家本局的时间,可选择限时挑战;移动:用户可以拖动模块进行交换,直到拼出原图像。
1)通过 w, s, a, d(或者上,下,左,右)进行平移操作,动态的展示每一步移动的结果。如果操作违法,应不做该操作;
2)能够刷新界面;
3)游戏过程中,允许选择悔一步(不可后退多步,若用户悔步>1,给出提示且不执行多次后退操作)或者终止游戏(正常),继续下一步;系统能自动检查到用户拼合出原图。
结束游戏:可以提前结束游戏,若成功结束游戏,总分=时间分数+移动正确率(正确数/移动正确率)*100,将本场的游戏时间加入到游戏记录中,并按照排序显示之前游戏的时间和该用户信息。上传分数以及获取排名,可以选择删除之前的成功记录,但是不可以用户随意增加记录。
《数据结构课程设计》
报告一.课程设计目的
通过课程设计,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。
二.问题描述
九宫格,一款数字游戏,起源于河图洛书,与洛书是中国古代流传下来的两幅神秘图案,历来被认为是河洛文化的滥觞,中华文明的源头,被誉为"宇宙魔方"。九宫格游戏对人们的思维锻炼有着极大的作用,从古时起人们便意识到九宫的教育意义。千百年来影响巨大,在文学、影视中都曾出现过。九宫格最早叫"洛书",现在叫"幻方"。
三.需求分析
(1)游戏包括界面,基本的控件,有文本框、选择框、按钮等。
(2)用户信息:用户登录需要的账号和密码,新用户注册用到的信息;对玩家信息的记录、保存、读取。
(3)界面信息:图片,九宫格规格。
(4)交互信息:控制游戏的移动。
(5)本游戏主要完成:整幅图的现实,切换整幅图片、随机打乱图片、开始游戏,结束游戏。
四.概要设计
4.1系统用到的抽象数据类型定义:
1.ADT LoginFrame{
用途:用户登录的一些按钮
基本操作:
- public LoginFrame(String title);
- private void addComponent();
- private void addListener();
- public boolean test()
}
- ADT PreviewPanel{
用途:图片预览区设计
基本操作:
- public void paint(Graphics g)
}
- ADT GameFrame{
用途:游戏所有功能界面的实现
基本操作:
- public GameFrame(String user);
- public void gameOptions() ;
- private void addListener();
- public void top();
- public void limit()
}
- ADT EasyGame{
用途:实现九宫格游戏的主要代码
基本操作:
- public EasyGame(String user_name,boolean limit);
- public void addComponentNorth();
- public void addComponentCenter();
- public void addActionListener();
- public void start();
- public GamePanel(String picture_path);
- public void splitImage(String picture_path);
- public void createGame();
- public void actionPerformed(ActionEvent e);
- public void swap(String direction);
- public TopPanel();
- public boolean isFinish()
}
- ADT GameTimer{
用途:游戏计时
基本操作:
- public GameTimer(boolean limit);
- public void run() ;
- public void stopRunning()
}
4.2系统中子程序及功能要求:
- public void top():用于显示排行榜窗口并从文件中读取排行榜数据进行显示。
- public void start():初始化游戏的一些参数,创建游戏界面,为游戏按钮添加事件监听器,并启动游戏计时器。
3.public void splitImage(String picture_path):对一张图片进行分割,并创建按钮来打乱图像的顺序,以初始化一个拼图游戏的初始状态。
4.public void createGame():是根据打乱后的图像按钮的顺序,将这些按钮放置在界面上,并创建一个空白的按钮作为拼图的空位。这样就完成了拼图游戏界面的初始化。5.public void actionPerformed(ActionEvent e):处理了拼图游戏中按钮被点击的事件,并根据按钮的移动情况来更新游戏状态,计算得分,显示提示信息,并将玩家的成绩记录写入文件。
6.public void swap(String direction):实现了按钮位置的交换,用于在拼图游戏中实现按钮的移动。
7.public TopPanel():实现了一个菜单面板,包括"开始"按钮和用于显示步数、计时器和分数的标签。
8.public boolean isFinish():用于判断游戏是否结束。它通过检查游戏面板上的按钮的位置是否符合特定的条件来确定游戏是否结束。
8.public void run():实现了一个游戏计时器线程,用于在游戏中计时并根据需要终止计时器。
五.详细设计
5.1 创建拼图游戏的界面的伪码描述如下:
public void createGame(){
this.setLayout(null); //将布局设置为null,表示不使用任何布局管理器,而是手动设置组件的位置和大小。
for(int i = 0; i < rank*rank -1; i++) {
然后,通过一个循环,将打乱顺序后的图像按钮按照一定的规则放置在界面上。具体来说,它通过计算每个按钮的位置,使用`setLocation`方法将按钮放置在指定的位置,并通过`add`方法将按钮添加到界面上。
}
buttons[rank*rank-1] = new JButton(); //创建一个新的按钮`buttons[rank*rank-1]`
buttons[rank*rank-1].setBackground(new Color(0xd9d9d9)) //并设置其背景颜色为灰色(`new Color(0xd9d9d9)`)
buttons[rank*rank-1].setSize(image_width,image_height); //然后,设置该按钮的大小和位置 buttons[rank*rank-1].setLocation(20+image_width*(rank-1),20+image_height*(rank-1));this.add(buttons[rank*rank-1]); //并将其添加到界面上。
}
5.2 交换两个按钮实现拼图的移动的伪码描述如下:
public void swap(方法接受一个字符串参数`direction`,用于指示按钮的移动方向) {
//根据`direction`的取值,分别处理上、下、左、右四个方向的移动。
// 在每个分支中,通过调用`setLocation`方法,改变`clicked_button`和`gray_button`的位置,从而实现按钮的移动。
//具体来说,当`direction`为"up"时,表示向上移动,
// 交换了`clicked_button`和`gray_button`的位置;
// 当`direction`为"down"时,表示向下移动;
// 当`direction`为"right"时,表示向右移动
// 当`direction`为"left"时,表示向左移动。
}
5.3实现拼图游戏的初始化过程的伪码描述如下:
public void splitImage(String picture_path) {
try {
/*首先通过`ImageIO.read`方法读取指定路径的图片,并将其存储在`BufferedImage`对象中。*/
this.split_images = new Image[rank*rank];
this.image_width = bufferedImage.getWidth()/rank; //分割单元图像宽度
this.image_height = bufferedImage.getHeight()/rank; //分割单元图像高度
// 然后计算出每个分割后的图像单元的宽度和高度,并将这些分割后的图像通过两个for循环嵌套保存到一个一维数组`split_images`中。
}
}
/*接下来创建了`rank*rank`个按钮,并为每个按钮设置对应的图像。然后将这些按钮存储在一个集合`images_list`中,并通过`Collections.shuffle`方法来打乱这些按钮的顺序。*/
}
//将按钮写入集合,用集合的方式打乱分割后的图像
}
/*在打乱按钮顺序后,代码使用一个while循环来检查打乱后的顺序是否是可解的。它通过比较按钮的顺序来计算逆序数的个数,然后判断逆序数的奇偶性来确定图像是否可以被正确还原。如果逆序数为偶数,则拼图可以被正确还原;如果逆序数为奇数,则需要重新打乱按钮的顺序,直到找到一个可解的顺序。*/
} catch (IOException e) {
最后,通过异常处理来捕获可能发生的`IOException`异常。
}
六.测试分析
-
用户登录功能:
-
当我们从键盘输入已经记录的账号和密码时,可以弹出游戏开始界面,并且会在界面上显示"登录成功",若输入没有经过注册的账号密码则会出现"登录失败"。
-
当我们注册的时候可以自己输入账号和密码,密码要确认两次,注册成功的账号密码会保存在"user_message.txt"里面。
-
游戏功能:
(1) 当我们登录成功之后,可以看到"简单模式(3X3)","普通模式(5X5)","困难模式(6X6)","限时模式","历史记录","游戏规则",点击可以正常进入相应界面。
(2) 通过鼠标操作,动态的展示每一步移动的结果。
(3) 能够刷新界面;
(4) 结束游戏:可以提前结束游戏,若成功结束游戏,总分=时间分数+移动正确率(正确数/移动正确率)*100,将本场的游戏时间加入到游戏记录中,并按照排序显示之前游戏的时间和该用户信息。上传分数以及获取排名,不可以用户随意增加记录。
七.使用说明
1.运行程序,首先出现主界面。主界面为用户登录界面,需要用户输入账号和密码才能登录进入游戏,没有设立账号或者想设立多个账号可以点击注册。
2.游戏预选界面包括6个选项:"简单模式(3X3)","普通模式(5X5)","困难模式(6X6)","限时模式","历史记录","游戏规则",可以自行选择哪个难度,
3.进入游戏界面,左边是拼图区,右边是预览区,通过鼠标移动灰色方块,使得拼图区的其他八个小块恢复成右边预览区的样子即为游戏胜利,上面有步数,时间,分数的信息。
- 限时模式游戏规则一样,但是在固定时间之内没完成会显示游戏失败
5 历史记录只能查看前十次的游戏记录
八.测试数据
游戏登录成功界面截图:

简单模式(3X3)游戏成功界面截图:

限时模式失败的界面截图:

历史记录的界面截图:

九.源代码实现
具体源代码可以到我资源区下载,压缩包里包括《数据结构课程设计报告》,《课程设计报告PPT》,《程序说明文件》和源代码文件夹