SpringBoot项目-双人对战五子棋实验报告

news2024/9/24 15:24:52

简单五子棋Web项目报告

课    程

Web应用程序设计

项目名称

简单双人五子棋对战

成绩

专业班级

XXX

组别

学号

XXX

指导教师

XXX

姓    名

XXX

同组人姓名

完成日期

XXX

功能描述

1.用户的注册及登录功能

        玩家可以在完成游戏账户的注册,注册完成后,此账号可以用来进行登录。

2.玩家匹配功能

        玩家登录之后,可以进入游戏大厅(人人对战),挑战在线的玩家,对方同意之后,双方即可进入对战界面。该游戏默认黑子是先手,在进入游戏页面的同时,随机分配黑白子。

3.玩家对战功能

玩家点击开始游戏,表示已准备,对战双方都准备之后,方可进行对战。屏幕上方会提示由谁落子,玩家交替落子,最后由系统判断输赢。

4.局内聊天功能

玩家在对战的同时,可以进行局内聊天。

5.认输功能

如果玩家想认输,点击认输按钮,即可进行结算,并退出游戏。

  • 前端页面设计

1.欢迎页面设计

选中状态:

点击登录按钮,弹出登录界面:

点击注册按钮,弹出注册界面:

2.游戏大厅页面设计

点击匹配按钮,进行匹配:

用户收到挑战时:

3.对战页面设计

 

战败界面:

战胜界面:

  • 后端接口的设计
  1. 玩家相关的接口

        登录接口(“/user/login”),请求方式为POST,接口参数为chessUser,HttpSession,前端请求需要传入的参数是用户id和用户密码password。这里有一个判断,当这个欢迎页面加载的时候,会首先判断用户是否已经登录。这里查询数据库的相关操作,使用了框架Mybatis-plus,目的是简化代码量。

        登录成功后,将用户的登录信息存储在会话对象中,并且,为了后面游戏玩家列表数据的获取,还需要把登录信息存储进applicationContext对象中。这里单独用了一个addUserList方法封装。

         注册接口(“/user/registry”),请求方式为POST,接口参数为chessUser和HttpSession.前端传入的参数是用户注册ID和用户注册密码,因为我将玩家数据表的ID字段设置为了主键,因此在这个接口中,需要判断用户注册的ID是否已经在数据表中存在了,并返回提示信息。

         注销登录接口(“/user/logout”),请求方式为POST,接口参数为chessUser和HttpSession,前端传入的是已登录用户ID,接口根据这个ID去session对象中移除记录,并且同时要在applicationContext中保存的用户列表List移除记录。

        获取已登录用户ID列表(“/user/getList”),请求方式是Get,接口参数为HttpSession,前端请求无参数。

2.对战相关的接口

        准备游戏接口(“/fight/start/”),该接口的意思是,玩家在游戏界面点击开始游戏,表示自己进入已准备状态,需要等待对方进入准备状态,当双方进入装备状态,即可激活棋盘,开始下棋。

        请求方式是Post,接口参数为Map<String,Boolean> map和HttpSession,前端传入的参数为isQuery,类型是boolean,如果isQuery为false,表示该请求是玩家点击开始游戏按钮触发的,表示玩家是准备状态;如果isQuery为true,表示是玩家轮询对方是否已经准备好的请求。

         玩家匹配接口(“/fight/match”),请求方式为Post,接口参数为Map<String,String>和HttpSession,前端传入的参数有enemyID和userID。

        当前端传入enemyID和userID时,说明是玩家发起匹配的请求,此时将玩家的匹配信息放入applicationContext中;若前端未传入参数,说明是玩家轮询是否有人挑战他的请求,此时就是取出applicationContext里的信息,并返回查询结果。如果双方都同意匹配,则直接跳转进游戏界面。

 

        玩家响应匹配接口(“/fight/response”),请求方式是Post,接口参数为Map<String,String>和HttpSession,前端传入的参数有三种情况,分别对应三种情况:

        如果传入的参数是userID和enemyID,说明这是玩家对用户发起匹配的成功响应,这时开始随机分配黑白子,然后进入游戏界面;如果没有收到任何数据,表示这是玩家在轮询对方是否对自己发送的匹配请求进行相应;如果收到的数据是“refuse”,表示这是玩家拒绝了对方的匹配请求,玩家会清空applicationContext对象里面保存的匹配信息,目的是:当对方轮询时,发现信息被清空就停止轮询,并显示被拒绝的信息。

         加载游戏玩家信息接口(“/fight/getMsg”),请求方式为Post,接口参数为Chessmessage和HttpSession,前端无需传入任何参数。这个接口完成的功能是在加载游戏界面时,显示对战双方的ID以及所执棋子的颜色。

        上传以及获取棋子信息接口(“/fight/fighting”),请求方式为Post,接口参数为ChessMessage和HttpSession,前端传入的参数有两种情况:如果前端传入的参数是id、color和position,那么表示这个请求是玩家在落完子之后上传的棋子的信息;如果前端请求时没有携带任何有效数据,说明这是玩家在轮询对方的落子信息。

        这里我直接将落子信息封装成ChessMessage,存储的时候直接用了key=”position”,value = chessMessage,这样其实每一次有新的棋子信息,就会覆盖原来的value。在获取信息的时候,判断了一下chessMessage里面的id成员变量是否和session里面的userID一致,这样是为了避免玩家获取自己的棋子信息。

         玩家认输接口(“/fight/giveup”),请求方式是Post,接口参数为ChessMessage和HttpSession,前端传入的参数也有两种方式:如果前端传入的是玩家id,说明这是玩家点击认输按钮触发的请求,此时将玩家认输信息保存在applicationContext中;如果前端未传入任何数据,说明这是玩家轮询对方是否认输,此时返回轮询结果。

         局内聊天接口(“/fight/chat”),请求方式为Post,接口参数为ChessMessage和HttpSession,前端传入的参数有两种:如果前端传入的参数为玩家id和消息内容chat,说明是玩家发送了聊天消息,此时将玩家聊天内容存储在applicationContext中;如果前端没有传入任何数据,说明是轮询对方的消息,这里要区别新旧消息,我是直接用的老师的方法,在返回消息列表之前,遍历消息,如果消息字串中包含”*”字符,说明是旧消息,就不获取,同时,获取之后,也要在新消息字符串中加入字符”*”,表示已读。最后返回新消息列表。

        判断输赢接口(“/fight/win”),请求方式为Post,接口参数为ChessMessage和HttpSession,前端的传入的参数也分两种:如果传入的参数为玩家id,说明玩家赢了棋局,此时在applicationContext保存该信息;如果前端没有传入任何数据,说明这是玩家在轮询对方是否赢得棋局,此时查询applicationContext中的相关数据,返回结果。

遇到的问题及解决方法

1.访问静态资源报404: 翻了一下SpringBoot的官方文档,SpringBoot静态资源的默认路径 是 classpath:/static 和 classpath:/public 和 classpath:/resources  和 classpath:/META-INF/resources,默认将/**所有访问映射到以下目录。

如果想修改默认配置,可以自己写一个MVC配置类去替代默认配置,一开始我也是这样做的,写了一个配置类:

也可以直接在yml里面配置:spring: mvc: static-path-pattern: /xxxx/**。

后来我发现上次没访问到是因为Maven项目没及时更新,静态资源没有在target目录生成,不是路径的问题,于是我把这个配置类删除了,用默认配置就够了。

我还经常遇到的坑就是:浏览器的自动缓存机制。

这个机制每次让我错的都摸不着头脑,就是明明修改了CSS样式或者JS代码,但是不生效,我打开F12查看源码才知道,浏览器启用了缓存的页面,导致我的网页没更新,于是我就把浏览器缓存关了。

JS动态渲染标签的获取,一开始我忘了动态渲染的元素绑定事件要用on(),导致我一直没获取到玩家列表项。后面查了博客,发现要用on,并且on前面选择器里面的元素必须是非动态渲染的元素,不然依旧获取不到,让我郁闷的是,我在这里卡了几个小时,最后终于成功了。但是这里依然存在BUG,这代码只适用于只有两个用户的情况。

Mybatis-Plus的不熟悉导致项目报错,因为这个框架会给开发者自动生成SQL语句,而我只要调用它封装好的方法就行了,结果我的实体类和数据库表的名字不匹配,生成的语句有问题,导致找不到数据表,或者一些对象属性的不匹配,我只好全部修改了实体类名字和成员变量,最后不报错了

实现局内聊天功能,我测试的时候,发现白子玩家一直获取不到对方发送的消息,我就一直调试检查我的chat接口的代码,发现根本没有问题,然后我也检查了前端JS代码,也没看出问题,最后我只好重构项目(有时候不能不相信一些玄学),最后还是不行,折腾了好久,终于在某天下午,我发现我前端代码给enemyID赋值的时候赋错了,然后这个变量是作为chat接口的参数传进去的,导致白子玩家把对方发的消息当做了自己发的消息,就一直不获取,所以导致白子玩家一直接收不到对方的消息。

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

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

相关文章

uni-app 数字输入框组件封装

文章目录 前言一、创建数字输入框文件二、制作数字输入框组件三、父组件调用 前言 数字输入框是一个项目中常见的需求&#xff0c;其中的耦合度很高&#xff0c;完全可以将其封装起来使用&#xff0c;在使用的时候传入五个参数&#xff0c;分别为&#xff1a; 最大值最小值默…

RUST 运行是报 linker `link.exe` not found

如下图所示&#xff1a; 解决方法&#xff1a; 第一步&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu 第二步&#xff1a; rustup default stable-x86_64-pc-windows-gnu 验证&#xff1a;

关于全局异常提示

项目中客户端请求如果后端出现技术上的bug&#xff0c;会报出网络异常&#xff0c;这对客户是很不友好的&#xff0c;比方说请求参数格式校验&#xff0c;如下&#xff1a; import com.fasterxml.jackson.annotation.JsonFormat; 假如日期格式传的不对&#xff0c;这个注解校验…

I3C协议手册研读-1

0 前言 对于I3C&#xff0c;我觉得有必要仔细分析一下手册&#xff0c;通过博客的方式来进行&#xff0c;可以更好的督促自己进行学习。 本次研读的I3C手册版本如下图所示。 1 介绍 阿兴分析如下&#xff1a; 目前比较成熟的协议有I2C、SPI、USART等&#xff0c;但是因为有一…

网络安全合规-ISO 27701(二)

隐私信息安全管理体系&#xff08;PIMS&#xff09;认证 是在隐私保护方面对 ISO/IEC 27001 和ISO/IEC 27002 的扩展&#xff0c;针对保护可能受到个人信息收集和处理影响的隐私提供了更多相关指南。获得PIMS认证的企业标志着其在保护用户数据和个人信息安全方面符合国际标准IS…

怎么学习和提升后端开发能力? - 易智编译EaseEditing

学习和提升后端开发能力可以通过以下步骤进行&#xff1a; 学习编程语言&#xff1a; 选择一种常用的后端编程语言&#xff0c;如Python、Java、C#等&#xff0c;并深入学习该语言的语法、特性和最佳实践。掌握基本的编程概念和技巧是提升后端开发能力的基础。 学习数据库&am…

微信小程序:期末大作业,毕业设计茶客堂商城微信小程序

1. 项目简介 茶客堂微信小程序是一个为茶叶爱好者提供优质茶叶和茶文化知识的平台。茶作为中国的传统文化&#xff0c;越来越受到各个年龄层的人们的喜爱。而传统的茶叶销售方式有一定的局限性&#xff0c;如茶叶品质无法保证、价格不透明等。茶客堂微信小程序应运而生&#x…

【软考网络管理员】2023年软考网管初级常见知识考点(23)- 路由器的配置

涉及知识点 华为路由器的配置&#xff0c;华为路由器命令大全&#xff0c;软考大纲路由命令&#xff0c;静态路由和动态路由的配置命令&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-…

GPT快速分区

经过刚刚的“转换分区表类型为GUID格式”设置之后&#xff0c;现在分区的分区表类型已经是GPT格式了。我们设置想要分区的数目&#xff0c;例如我想要分两个区&#xff0c;点击自定选择2个分区&#xff0c;系统C盘分了80G&#xff0c;剩下空间留给了D盘。默认勾选“创建新ESP分…

jenkins流水线Pipeline的使用

pipeline流水线 1、jenkins安装pipeline插件 2、创建流水线项目 1、创建pipeline的流水线项目 2、编写流水线 pipeline {agent anystages {stage(拉去代码) {steps {git credentialsId: gitee, url: https://gitee.com/xwb1056481167/jenkins-demo.gitecho 拉去代码}}stage(m…

C. Tenzing and Balls(dp)

Problem - C - Codeforces Tenzing在一条线上排列了n个球。从左边起第i个球的颜色是ai。 Tenzing可以进行以下操作任意次&#xff1a; 选择i和j&#xff0c;使得1≤i<j≤|a|且aiaj&#xff0c; 从数组中删除ai,ai1,…,aj&#xff08;并将所有元素的索引向右移动aj−i1&…

【Linux】基于FTP协议实现Linux与Windows文件传输

文章目录 前言(一) Linux FTP网络环境搭建1.安装ftp包2. 置匿名用户访问的FTP服务(最大权限)3.为匿名访问ftp的根目录下的pub子目录设置最大权限&#xff0c;以便匿名用户上传数据4. 开启服务&#xff0c;关闭防火墙和增强型安全功能 &#xff08;二&#xff09;Windows 设置测…

前端食堂技术周刊第 88 期:Svelte4、NestJS 10、State of CSS 2023、Vitest 1.0 Roadmap、Fresh 1.2

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;帝王蟹柳 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…

Insertion插入排序

原谅我接着偷懒&#xff0c;是真的没有什么写的内容了啊&#xff0c;好怀疑他们那些大佬是怎么那么多的文章和技术分享的&#xff0c;自闭中ing 最好情况的时间复杂度是 O(n)&#xff0c;最坏情况的时间复杂度是 O(n2)&#xff0c;然而时间复杂度这个指标看的是最坏的情况&…

Oracle 查询优化改写(第七章)

第七章 日志运算 1 加减年月日时分秒 替换为- --加减年月日时分秒 替换为- SELECT Add_Months(SYSDATE, 5 * 12) AS 加5年,Add_Months(SYSDATE, 5) AS 加5月&#xff0c;SYSDATE 5 AS 加5天,SYSDATE 5 / 24 AS 加5小时,SYSDATE 5 / 24 / 60 AS 加5分钟,SYSDATE 5 / 24 / …

【宝塔服务器】宝塔通过composer安装TP依赖

屡屡碰壁&#xff0c;安装一个项目&#xff0c;发现没有依赖&#xff0c;需要使用composer安装&#xff0c;没接触过&#xff0c;找了网上也没攻略&#xff0c;自己弄了后有以下问题&#xff0c;经过调整解决了&#xff1a; 报错1:没有安装fileinfo扩展 Loading composer rep…

Debian 安装gcc, g++

自从周日把刚把安装好的Debian12搞坏后&#xff0c;这两天一直在重装系统&#xff0c;就没有完全成功过&#xff0c;好在最后一次安装Debian11的时候&#xff0c;系统起来后有网络&#xff0c;但在安装桌面及GNOME时失败了&#xff0c;只能开机进入命令行模式。 安装gcc 和 g 只…

【VUE】ElementUI实现表格拖拽功能及行大图预览

一. 背景 elementui没自带的拖拽排序功能&#xff0c;所以需要借助第三方插件sortablejs 二. 步骤 安装 npm install sortablejs --save 引入 import Sortable from ‘sortablejs’ template文件应用 row-key填写唯一标识 id"dragTable"是为了通过document找到…

智能电网如何助力能源革命实现高效能源管理与分配?

能源革命是全球范围内的重要议题&#xff0c;为了实现可持续发展和应对能源挑战&#xff0c;人们对新的能源技术和能源管理方式寄予了厚望。智能电网作为能源革命的关键组成部分&#xff0c;利用先进的通信和信息技术&#xff0c;实现了高效能源管理与分配&#xff0c;为能源革…

MATLAB——信号处理仿真功能课程设计报告

目 录 摘 要... I 目 录. II 1 设计目的及内容. 1 1.1 课程设计目的. 1 1.2 课程设计内容. 1 2 课程设计基本原理. 3 2.1 基本信号. 3 2.2 计算原理. 3 3 设计与仿真. 4 3.1 基本信号. 4 3.2计算过程. 6 3.3 matlab仿真原理. 7 3.4 计算结果. 8 3.5结果…