数据结构课程设计(java实现)---九宫格游戏,也称幻方
【问题描述】
九宫格,一款数字游戏,起源于河图洛书,与洛书是中国古代流传下来的两幅神秘图案,历来被认为是河洛文化的滥觞,中华文明的源头,被誉为"宇宙魔方"。九宫格游戏对人们的思维锻炼有着极大的作用,从古时起人们便意识到九宫的教育意义。千百年来影响巨大,在文学、影视中都曾出现过。九宫格最早叫“洛书”,现在叫“幻方” 。
【基本要求】
游戏包括界面,基本的控件,有文本框、选择框、按钮等。
用户信息:用户登录需要的账号和密码,新用户注册用到的信息;对玩家信息的记录、保存、读取。
界面信息:图片,九宫格规格;
交互信息:控制游戏的移动;
【问题分析】
本游戏主要完成:整幅图的现实,切换整幅图片、随机打乱图片、开始游戏,结束游戏。
【功能分析】
游戏界面设计:用户登录,进入游戏界面,有良好的功能可视化界面,有游戏规则介绍。例如有计时和分数的显示,游戏图片替换和打乱图片的按键,显示游戏界面的图像画面,游戏玩家开始游戏、悔一步,重新开始的按键。
原始图像的选择:游戏开始时,从准备好的图片中,选择想要拼的图片,要有不同难度的图片(可从相似度考虑);可选择重新开始;随机打乱图像:选择难度(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`异常。
}
六.测试分析
1. 用户登录功能:
- 当我们从键盘输入已经记录的账号和密码时,可以弹出游戏开始界面,并且会在界面上显示”登录成功”,若输入没有经过注册的账号密码则会出现”登录失败”。
- 当我们注册的时候可以自己输入账号和密码,密码要确认两次,注册成功的账号密码会保存在”user_message.txt”里面。
2. 游戏功能:
(1) 当我们登录成功之后,可以看到”简单模式(3X3)”,”普通模式(5X5)”,”困难模式(6X6)”,”限时模式”,”历史记录”,”游戏规则”,点击可以正常进入相应界面。
(2) 通过鼠标操作,动态的展示每一步移动的结果。
(3) 能够刷新界面;
(4) 结束游戏:可以提前结束游戏,若成功结束游戏,总分=时间分数+移动正确率(正确数/移动正确率)*100,将本场的游戏时间加入到游戏记录中,并按照排序显示之前游戏的时间和该用户信息。上传分数以及获取排名,不可以用户随意增加记录。
七.使用说明
1.运行程序,首先出现主界面。主界面为用户登录界面,需要用户输入账号和密码才能登录进入游戏,没有设立账号或者想设立多个账号可以点击注册。
2.游戏预选界面包括6个选项:”简单模式(3X3)”,”普通模式(5X5)”,”困难模式(6X6)”,”限时模式”,”历史记录”,”游戏规则”,可以自行选择哪个难度,
3.进入游戏界面,左边是拼图区,右边是预览区,通过鼠标移动灰色方块,使得拼图区的其他八个小块恢复成右边预览区的样子即为游戏胜利,上面有步数,时间,分数的信息。
4. 限时模式游戏规则一样,但是在固定时间之内没完成会显示游戏失败
5 历史记录只能查看前十次的游戏记录
八.测试数据
游戏登录成功界面截图:
简单模式(3X3)游戏成功界面截图:
限时模式失败的界面截图:
历史记录的界面截图:
九.源代码实现
具体源代码可以到我资源区下载,压缩包里包括《数据结构课程设计报告》,《课程设计报告PPT》,《程序说明文件》和源代码文件夹
相关文章:

数据结构课程设计(java实现)---九宫格游戏,也称幻方
【问题描述】 九宫格,一款数字游戏,起源于河图洛书,与洛书是中国古代流传下来的两幅神秘图案,历来被认为是河洛文化的滥觞,中华文明的源头,被誉为"宇宙魔方"。九宫格游戏对人们的思维锻炼有着极大…...
[思考记录]AI时代下,悄然的改变
尝试用 xAI-Grok 去了解DS开源周的信息,有那么点被Grok的输出惊艳到。“请你以技术编辑的角色,重点参考官方文档,介绍DeepSeek开源周的内容,写一篇技术分享文章。”,得到的文字看起来很是舒服,内容靠谱、结…...
JAVA笔记【一】
现实 (抽象) 类 (创建) 对象 特点: 1.面向对象 2.跨平台 3.安全性 4.多线程 java程序基本结构 1. java源代码文件实际是普通的文本文件,源代码文件必须是.java扩展名,且必须小写 2. …...
[Java基础] 常用注解
文章目录 1. 元注解2. 非元注解2.1 常用JDK自带注解2.2 常用Spring相关注解2.2.1 在Spring框架中,注解用于简化配置和增强代码的可读性。以下是常用的Spring注解的一部分2.2.2 针对controller的相关注解2.2.3 AOP相关注解2.2.4 Enable系列注解 2.3 常用Lombok注解 1…...
uvm中的run_test作用
在SystemVerilog和UVM验证环境中,run_test() 是启动UVM仿真流程的核心函数。它负责初始化UVM框架、创建测试用例实例,并触发UVM的Phase机制来执行验证环境的构建和运行 1. run_test() 的作用 run_test() 是UVM提供的内置函数,定义在UVM库中…...
brew search报错,xcrun:error:invalid active developer path CommandLineTools
问题出现的原因 出现“xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun”错误,通常是因为Xcode命令行工具未正确安装或其路径已损坏。以下是几种常见的…...
C#内置委托(Action)(Func)
概述 在 C# 中,委托是一种类型,它表示对具有特定参数列表和返回类型的方法的引用。C# 提供了一些内置委托,使得开发者可以更方便地使用委托功能,无需手动定义委托类型。本文将详细介绍 Action 和 Func 这两个常用的内置委托。 A…...
kubernetes 部署项目
随着容器化技术的发展,使用Kubernetes(简称K8s)来部署和管理应用已经成为现代软件开发的标准实践之一。Kubernetes提供了一套强大的工具集,使得部署、扩展和管理应用程序变得更为简便高效。本文将带你走过从准备环境到部署一个实际…...

《几何原本》命题I.2
《几何原本》命题I.2 从一个给定的点可以引一条线段等于已知的线段。 设 A A A 为给定点, B C BC BC 为给定线段 连接 A B AB AB,作等边 △ A B D \triangle ABD △ABD 以 B B B 为圆心, B C BC BC 为半径作小圆 延长 D B DB DB 交小圆…...

【我的 PWN 学习手札】House of Kiwi
House of Kiwi 之前我们利用IO_FILE一般是通过劫持vtable来实现的, House of Kiwi虽然不是通过劫持vtable来实现,但实质上是劫持vtable指向的全局的_IO_file_jumps_表来实现的。注意:对于某些版本的glibc,_IO_file_jumps_并不可写…...
nvm的学习
学习 nvm(Node Version Manager) 是掌握 Node.js 开发的关键技能之一。以下是系统的学习路径和实战指南,涵盖从基础到进阶的内容: 一、基础入门 1. nvm 的核心作用 多版本共存:安装和管理多个 Node.js 版本ÿ…...

haclon固定相机位标定
什么是标定? 工业应用中相机拍到一个mark点的坐标为C1(Cx,Cy),C1点对应的龙门架/机械手等执行端对应的坐标是多少? 标定就是解决这个问题,如相机拍到一个点坐标C1(Cx,Cy),…...

stm32(hal库)学习笔记-时钟系统
在stm32中,时钟系统是非常重要的一环,他控制着整个系统的频率。因此,我们有理由好好学一下时钟系统。 什么是时钟? 时钟是具有周期性的脉冲信号,一般我们常用占空比为50%的方波。可以形象的说,时钟就是单…...

【Java项目】基于SpringBoot的财务管理系统
【Java项目】基于SpringBoot的财务管理系统 技术简介:采用Java技术、SpringBoot框架、MySQL数据库等实现。系统基于B/S架构,前端通过浏览器与后端数据库进行信息交互,后端使用SpringBoot框架和MySQL数据库进行数据处理和存储,实现…...

Qt中如果槽函数运行时间久,避免阻塞主线程的做法
Qt中如果槽函数运行时间久,避免阻塞主线程的做法 一、解决步骤 创建一个工作线程类:继承自QObject,并在其中实现槽函数的逻辑。将工作线程类的实例移动到单独的线程中:通过moveToThread()方法将对象移动到新线程。启动线程&…...

曹操智行构建国内首个全域自研闭环智驾生态
2月28日,曹操出行举办曹操智行自动驾驶平台上线仪式,宣布已成功构建国内首个“F立方”全域自研闭环智驾生态,同时在苏杭两地开启Robotaxi运营试点,并投放搭载吉利最新智驾系统的车辆。 此次试点运营,标志着曹操出行在…...

day02_Java基础
文章目录 day02_Java基础一、今日课程内容二、数组(熟悉)1、定义格式2、基本使用3、了解数组的内存图介绍4、数组的两个小问题5、数组的常见操作 三、方法(熟悉)1、定义格式2、方法重载overload 四、面向对象(掌握&…...
SpringSecurity 实现token 认证
配置类 Configuration EnableWebSecurity EnableGlobalMethodSecurity(prePostEnabledtrue) public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { Bean Override public AuthenticationManager authenticationManagerBean() throws Exception {return s…...

轻松实现语音生成:GPT-SoVITS V2整合包的远程访问操作详解
文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天要给大家安利一个绝对能让你大呼过瘾的声音黑科技——GPT-SoVITS!这款由花儿不哭大佬精心打造的语音克隆神…...
解锁状态模式:Java 编程中的行为魔法
系列文章目录 后续补充~~~ 文章目录 一、状态模式:概念与原理二、状态模式的深度剖析(一)模式定义与核心思想(二)模式结构与角色 三、状态模式的实际应用场景(一)电商系统中的订单状态管理&…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...