数据结构课程设计(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{

   用途用户登录的一些按钮

   基本操作:

  1. public LoginFrame(String title);
  2. private void addComponent();
  3. private void addListener();
  4. public boolean test()

}

  1. ADT PreviewPanel{

  用途:图片预览区设计

    基本操作:

  1. public void paint(Graphics g)

}

  1. ADT GameFrame{

用途:游戏所有功能界面的实现

基本操作:

  1. public GameFrame(String user);
  2. public void gameOptions() ;
  3. private void addListener();
  4. public void top();
  5. public void limit()

}

  1. ADT EasyGame{

      用途:实现九宫格游戏的主要代码

基本操作:

  1. public EasyGame(String user_name,boolean limit);
  2. public void addComponentNorth();
  3. public void addComponentCenter();
  4. public void addActionListener();
  5. public void start();
  6. public GamePanel(String picture_path);
  7. public void splitImage(String picture_path);
  8. public void createGame();
  9. public void actionPerformed(ActionEvent e);
  10. public void swap(String direction);
  11. public TopPanel();
  12. public boolean isFinish()

}

  1. ADT GameTimer{

   用途:游戏计时

   基本操作:

  1. public GameTimer(boolean limit);
  2. public void run() ;
  3. public void stopRunning()

}

4.2系统中子程序及功能要求:

  1. public void top():用于显示排行榜窗口并从文件中读取排行榜数据进行显示。
  2. 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):实现了按钮位置的交换,用于在拼图游戏中实现按钮的移动。

7public 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. 用户登录功能:

  1. 当我们从键盘输入已经记录的账号和密码时,可以弹出游戏开始界面,并且会在界面上显示登录成功,若输入没有经过注册的账号密码则会出现登录失败
  2. 当我们注册的时候可以自己输入账号和密码,密码要确认两次,注册成功的账号密码会保存在user_message.txt里面

2. 游戏功能:

(1)  当我们登录成功之后,可以看到简单模式(3X3),普通模式(5X5),困难模式(6X6),限时模式,历史记录,游戏规则,点击可以正常进入相应界面。

(2)  通过鼠标操作,动态的展示每一步移动的结果。

(3)  能够刷新界面;

(4)   结束游戏:可以提前结束游戏,若成功结束游戏,总分=时间分数+移动正确率(正确数/移动正确率)*100,将本场的游戏时间加入到游戏记录中,并按照排序显示之前游戏的时间和该用户信息。上传分数以及获取排名,不可以用户随意增加记录。

七.使用说明

1.运行程序,首先出现主界面。主界面为用户登录界面,需要用户输入账号和密码才能登录进入游戏,没有设立账号或者想设立多个账号可以点击注册。

2.游戏预选界面包括6个选项:”简单模式(3X3),普通模式(5X5),困难模式(6X6),限时模式,历史记录,游戏规则,可以自行选择哪个难度,

3.进入游戏界面,左边是拼图区,右边是预览区,通过鼠标移动灰色方块,使得拼图区的其他八个小块恢复成右边预览区的样子即为游戏胜利,上面有步数,时间,分数的信息。

4.  限时模式游戏规则一样,但是在固定时间之内没完成会显示游戏失败

5   历史记录只能查看前十次的游戏记录

八.测试数据

游戏登录成功界面截图:

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

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

历史记录的界面截图:

九.源代码实现

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT-4.5 怎么样?如何升级使用ChatGPTPlus/Pro? GPT-4.5设计目标是成为一款非推理型模型的巅峰之作

GPT-4.5 怎么样&#xff1f;如何升级使用ChatGPTPlus/Pro? GPT-4.5设计目标是成为一款非推理型模型的巅峰之作 今天我们来说说上午发布的GPT-4.5&#xff0c;接下来我们说说GPT4.5到底如何&#xff0c;有哪些功能&#xff1f;有哪些性能提升&#xff1f;怎么快速使用到GPT-4.…

【vscode-解决方案】vscode 无法登录远程服务器的两种解决办法

解决方案一&#xff1a; 查找原因 命令 ps ajx | grep vscode 可能会看到一下这堆信息&#xff08;如果没有大概率不是这个原因导致&#xff09; 这堆信息的含义&#xff1a;当你使用 vscode 远程登录服务器时&#xff0c;我们远程机器服务端要给你启动一个叫做 vscode serv…

一、对4*3按键模块编程分析

一、4*3键盘模块实物分析 说明&#xff1a; 1、横着4排&#xff0c;竖着3列&#xff0c;加起来共7组&#xff0c;所以对外引出7根线。 2、根据排针终端引脚又可分两类。即横排和竖列对应的引脚。 二、代码编写构想&#xff1a; 1、使用7个gpio输入中断&#xff0c;检测7个…

自然语言处理NLP入门 -- 第十节NLP 实战项目 2: 简单的聊天机器人

一、为什么要做聊天机器人&#xff1f; 在互联网时代&#xff0c;我们日常接触到的“在线客服”“自动问答”等&#xff0c;大多是以聊天机器人的形式出现。它能帮我们快速回复常见问题&#xff0c;让用户获得及时的帮助&#xff0c;并在一定程度上减少人工客服的压力。 同时&…

linux(1)文件管理

文章目录 文件目录系统相对路径绝对路径命令解析器文件管理 文件目录系统 bin&#xff1a; 二进制文件目录&#xff0c;存储可执行文件 dev&#xff1a;设备目录&#xff0c;所有的硬件都会抽象成文件存储&#xff0c;比如鼠标键盘 home&#xff1a;存储普通用户的家目录 li…

CSS—选择器详解:5分钟动手掌握选择器

个人博客&#xff1a;haichenyi.com。感谢关注 1. 目录 1–目录2–引言3–种类4–优先级 引言 什么是选择器&#xff1f; CSS选择器是CSS&#xff08;层叠样式表&#xff09;中的一种规则&#xff0c;用于指定要应用样式的HTML元素。它们就像是指向网页中特定元素的指针&#…

大模型微调入门(Transformers + Pytorch)

目标 输入&#xff1a;你是谁&#xff1f; 输出&#xff1a;我们预训练的名字。 训练 为了性能好下载小参数模型&#xff0c;普通机器都能运行。 下载模型 # 方式1&#xff1a;使用魔搭社区SDK 下载 # down_deepseek.py from modelscope import snapshot_download model_…

DeepSeek实战

DeepSeek 接入实战&#xff1a;从零开始快速上手 引言 在当今的 AI 领域&#xff0c;DeepSeek 作为一个强大的自然语言处理&#xff08;NLP&#xff09;平台&#xff0c;提供了丰富的 API 接口&#xff0c;帮助开发者快速实现智能对话、文本生成、语义分析等功能。本文将带你…

Android NDK打包封装教程与优化技巧

关于NDK打包封装的问题。首先,用户可能不太清楚NDK的基本概念,所以我应该先解释NDK是什么以及它的作用。然后,用户可能想知道如何在Android项目中使用NDK,所以需要分步骤说明配置过程,包括安装NDK、配置CMake或ndk-build,创建JNI接口,编写C/C++代码,编译和打包。 接下…

【告别双日期面板!一招实现el-date-picker智能联动日期选择】

告别双日期面板&#xff01;一招实现el-date-picker智能联动日期选择 1.需求背景2.DateTimePicker 现状图3.日期选择器实现代码4.日期选择器实现效果图5.日期时间选择器实现代码6.日期时间选择器实现效果图 1.需求背景 在用户使用时间查询时&#xff0c;我们经常需要按月份筛选…

Linux(ftrace)__mcount的实现原理

Linux 内核调试工具ftrace 之&#xff08;_mcount的实现原理&#xff09; ftrace 是 Linux 内核中的一种跟踪工具&#xff0c;主要用于性能分析、调试和内核代码的执行跟踪。它通过在内核代码的关键点插入探针&#xff08;probe&#xff09;来记录函数调用和执行信息。这对于开…

Java注解(Annotation)

一、注解的定义 核心概念 注解是Java中一种特殊形式的“元数据”&#xff0c;用于为类、方法、字段、参数等代码元素附加说明信息。它不会直接影响代码逻辑&#xff0c;但可以通过编译器、框架或反射机制进行解析和处理。 与注释&#xff08;Comment&#xff09;的区别 注释&a…

tauri2+typescript+vue+vite+leaflet等的简单联合使用(一)

项目目标 主要的目的是学习tauri。 流程 1、搭建项目 2、简单的在项目使用leaflet 3、打包 准备项目 环境准备 废话不多说&#xff0c;直接开始 需要有准备能运行Rust的环境和Node&#xff0c;对于Rust可以参考下面这位大佬的文章&#xff0c;Node不必细说。 Rust 和…

深入解析 Svelte:下一代前端框架的革命

深入解析 Svelte&#xff1a;下一代前端框架的革命 1. Svelte 简介 Svelte 是一款前端框架&#xff0c;与 React、Vue 等传统框架不同&#xff0c;它采用 编译时&#xff08;Compile-time&#xff09; 方式来优化前端应用。它不像 React 或 Vue 依赖虚拟 DOM&#xff0c;而是…

关于流水线的理解

还是不太理解&#xff0c;我之前一直以为&#xff0c;对axis总线&#xff0c;每一级的寄存器就像fifo一样&#xff0c;一级一级的分级存储最后一级需要的数据。 像这张图&#xff0c;一开始是在解析axis流形式的数据包&#xff0c;数据包一直都能输入&#xff0c;所以valid一直…

Python代码之美:从规范到艺术

基础规范&#xff1a;代码的"颜值"很重要 &#x1f449;大礼包&#x1f381;&#xff1a;&#x1f448; PEP 8&#xff1a;不只是规范&#xff0c;是写作艺术 良好的代码格式就像优美的书法&#xff0c;让人赏心悦目。比如&#xff1a; # 不推荐的写法 def calcul…

【AI+智造】在阿里云Ubuntu 24.04上部署DeepSeek R1 14B的完整方案

作者&#xff1a;Odoo技术开发/资深信息化负责人 日期&#xff1a;2025年2月28日 一、部署背景与目标 DeepSeek R1作为国产大语言模型的代表&#xff0c;凭借其强化学习驱动的推理能力&#xff0c;在复杂任务&#xff08;如数学问题、编程逻辑&#xff09;中表现优异。本地化部…

8 SpringBoot进阶(上):AOP(面向切面编程技术)、AOP案例之统一操作日志

文章目录 前言1. AOP基础1.1 AOP概述: 什么是AOP?1.2 AOP快速入门1.3 Spring AOP核心中的相关术语(面试)2. AOP进阶2.1 通知类型2.1.1 @Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行(通知的代码在业务方法之前和之后都有)2.1.2 @Before:前置通知,此…

【react】快速上手基础教程

目录 一、React 简介 1.什么是 React 2.React 核心特性 二、环境搭建 1. 创建 React 项目 2.关键配置 三、核心概念 1. JSX 语法 表达式嵌入 样式处理 2. 组件 (Component) 3. 状态 (State) 与属性 (Props) 4. 事件处理 合成事件&#xff08;SyntheticEvent) 5. …

七星棋牌 6 端 200 子游戏全开源修复版源码(乐豆 + 防沉迷 + 比赛场 + 控制)

七星棋牌源码 是一款运营级的棋牌产品&#xff0c;覆盖 湖南、湖北、山西、江苏、贵州 等 6 大省区&#xff0c;支持 安卓、iOS 双端&#xff0c;并且 全开源。这个版本是 修复优化后的二开版本&#xff0c;新增了 乐豆系统、比赛场模式、防沉迷机制、AI 智能控制 等功能&#…