网页版五子棋——匹配模块(客户端开发)

前一篇文章:网页版五子棋——用户模块(客户端开发)-CSDN博客

目录

·前言

一、前后端交互接口设计

二、游戏大厅页面

1.页面代码编写

2.前后端交互代码编写

3.测试获取用户信息功能

·结尾


·前言

        前面文章介绍完了五子棋项目用户模块的代码编写,从本篇文章就开始介绍五子棋项目匹配模块的代码编写了,匹配模块这里要做的事情就是可以让多个用户在游戏大厅中能够进行匹配,我们会按照天梯积分,把实力相近的两个玩家匹配到一起进行对战,本篇文章要介绍的内容是前后端交互接口的设计,以及游戏大厅页面的编写,还有前后端交互代码的编写,本篇文章新增的代码文件如下图圈起来的文件所示:

        下面就开始本篇文章的内容介绍。 

一、前后端交互接口设计

        我们先来设计一下匹配模块这里前后端交互的接口,像匹配这样的功能就需要用到前面文章中提到的消息推送机制了(文章链接:网页版五子棋—— WebSocket 协议-CSDN博客)这是因为玩家发送匹配请求的事情是可以确定的(当玩家点击匹配按钮,就会发送匹配请求),但是服务器什么时候告诉玩家匹配结果是不确定的,这就需要等待匹配结束的时候才能告知,如下图的场景:

        如上图所示,此时玩家2 点击匹配按钮,给服务器发送“我要进行匹配”这样的请求,服务器就会响应玩家2 的请求,同时要主动告诉玩家1 匹配成功,并告诉玩家1 它匹配到了哪个对手,这也就是消息推送的机制 ,所以我们下面要设计的前后端交互接口也都是基于 WebSocket 来展开的,前面文章介绍了 WebSocket 可以传输文本数据也可以传输二进制数据,我们这里就直接设计成让 WebSocket 传输 JSON 格式的文本数据即可,那么接口的设计就如下所示了:

  • 匹配连接:

                ws://127.0.0.1:8080/findMatch


  • 匹配请求:

                {

                        message: 'startMatch' / 'stopMatch',   // 开始/结束匹配

                }


  • 匹配响应1:

                {

                        ok: true / false,   // 匹配成功/失败

                        reason: "",          // 匹配如果失败, 失败原因的信息

                        message: 'startMatch' / 'stopMatch',

                }

        这个响应是客户端给服务器发送匹配请求之后,服务器立即返回的匹配响应。


  • 匹配响应2:

                {

                        ok: true / false,   // 匹配成功/失败

                        reason: "",

                        message: 'matchSuccess',

                }        

        这个响应是真正匹配到对手后,服务器主动推送回来的信息,匹配到的对手不需要在这个响应中体现,仍然都放在服务器中保存即可。

        上面设计好匹配模块中前后端交互的接口后,在通过 WebSocket 传输请求数据的时候,数据中不需要带有用户的身份信息,当前用户的身份信息在前面登录完成后就已经保存在 HttpSession 中了,在 WebSocket 中也是可以拿到之前登录完存在 HttpSession 中的信息。 

        关于上面的响应还要注意两点:

  • 客户端(页面)收到匹配的响应之后,就直接跳转到游戏房间页面;
  • 如果返回的匹配响应 ok 的值为 false,则弹框的方式显示错误原因,并跳转回登录页面。

二、游戏大厅页面

1.页面代码编写

        我们要编写游戏大厅页面的大致轮廓如下图所示:

        上图中的导航栏与页面主题区域的样式在前面已经编写过了,存放在了公共样式设置的 common.css 代码中,在下面编写游戏大厅页面的代码时就可以直接进行引用了,下面我们就来创建  game_hall.html 在这里编写游戏大厅的代码,这里主要包含:

  • #screen 用于显示玩家的分数信息;
  • #match-button 作为匹配按钮

        代码及详细的介绍如下所示: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>游戏大厅</title>
    <!-- 引入 css 样式 -->
    <link rel="stylesheet" href="css/common.css">
    <link rel="stylesheet" href="css/game_hall.css">
</head>
<body>
    <div class="nav">五子棋对战</div>
    <!-- 整个页面的容器元素 -->
    <div class="container">
        <!-- 这个 div 在 container 中是处于垂直水平居中这样的位置 -->
        <div>
            <!-- 展示用户信息 -->
            <div id="screen"></div>
            <!-- 匹配按钮 -->
            <div id="match-button">开始匹配</div>
        </div>
    </div>

</body>
</html>

        游戏大厅样式 game_hall.css 的代码及介绍如下所示:

/* 游戏大厅样式 */

/* 设置页面主体区域样式 */
.container {
    width: 100%;
    /* 导航栏已经占据 50px 像素
       这里使游戏大厅界面把剩余部分铺满 */
    height: calc(100% - 50px);
    /* 设置弹性布局 */
    display: flex;
    /* 设置位置
       垂直水平居中 */
    align-items: center;
    justify-content: center;
}

/* 设置用户信息的展示框样式 */
#screen {
    width: 400px;
    height: 200px;
    /* 设置文字样式 */
    font-size: 20px;
    /* 设置背景颜色 */
    background-color: gray;
    /* 设置文字颜色 */
    color: white;
    /* 把边框的棱角钝化 */
    border-radius: 10px;
    /* 设置玩家信息内部位置 */
    text-align: center;
    /* 两行文本 */
    line-height: 100px;
}

/* 设置匹配按钮的样式 */
#match-button {
    width: 400px;
    height: 50px;
    /* 设置字体样式 */
    font-size: 20px;
    color: white;
    /* 设置背景颜色 */
    background-color: orange;
    /* 去除边框与轮廓线 */
    border: none;
    outline: none;
    /* 把边框的棱角钝化 */
    border-radius: 10px;
    /* 设置文字位置 */
    text-align: center;
    /* 使文字垂直居中 */
    line-height: 50px;
    /* 增加与上面 div 的间距 */
    margin-top: 20px;
}

/* 设置按钮被点击后的样式 */
#match-button:active {
    background-color: gray;
}

        到这里,游戏房间页面的代码就编写完毕了, 页面如下图所示:

        由于没有进行前后端交互代码的编写,所以这里的玩家信息还暂且获取不到。 

2.前后端交互代码编写

        为了让游戏大厅的页面能够获取到用户的信息,我们使用 Ajax 来使页面和服务器之间进行交互,这里的步骤是先引入 jQuery 代码,然后根据前面文章中规定好的获取用户信息的接口来编写这里前后端交互的代码,获取用户信息的接口如下图所示:

        在 game_hall.html 中编写 js 代码,通过 jQuery 中的 Ajax 来和服务器进行交互,同时创建 WebSocket 实例,建立 WebSocket 连接,来为后续匹配功能做准备,代码及详细介绍如下所示: 

    <!-- 引入 jQuery 代码 -->
    <script src="js/jquery.min.js"></script>
    <script>
        // 由于当前请求是在页面加载时就发送的
        // 所以直接进行前后端交互
        $.ajax({
            type: 'get',
            url: '/userInfo',
            success: function(body) {
                let screeDiv = document.querySelector('#screen');
                // 把要显示的数据组织好,放入 inneerHTML 中,进而显示到页面上
                screeDiv.innerHTML = '玩家: ' + body.username + " 分数: " + body.score
                    + "<br> 比赛场次: " + body.totalCount + " 获胜场次: " + body.winCount;
            },
            error: function() {
                alert("获取用户信息失败!");
            }
        });

        // 此处进行初始化 WebSocket, 并且实现前端的匹配逻辑.
        let websocket = new WebSocket("ws://127.0.0.1:8080/findMatch");
        websocket.onopen = function() {
            console.log("onopen");
        }
        websocket.onclose = function() {
            console.log("onclose");
        }
        websocket.onerror = function() {
            console.log("onerror");
        }
        // 监听页面关闭事件,在页面关闭之前,手动调用这里的 websocket 的 close 方法.
        websocket.onbeforeunload = function() {
            websocket.close();
        }
        // 处理服务器返回的响应数据
        websocket.onmessage = function(e) {
            // 这个响应是针对 "开始匹配" / "停止匹配" 来对应的
            // 解析得到的响应对象,返回的数据是一个 JSON 字符串,解析成 js 对象
            let resp = JSON.parse(e.data);
            let matchButton = document.querySelector('#match-button');
            if (!resp.ok) {
                console.log("游戏大厅中接收到了失败响应! " + resp.reason);
                return;
            }
            if (resp.message == 'startMatch') {
                // 开始匹配请求发送成功
                console.log("进入匹配队列成功!");
                matchButton.innerHTML = '匹配中...(点击停止)';
            } else if (resp.message == 'stopMatch') {
                // 结束匹配请求发送成功
                console.log("离开匹配队列成功!");
                matchButton.innerHTML = '开始匹配';
            } else if (resp.message == 'matchSuccess') {
                // 已经匹配到对手
                console.log("匹配到对手! 进入游戏房间!");
                location.assign("/game_room.html");
            } else {
                console.log("收到了非法的响应! message = " + resp.message);
            }
        }

        // 给匹配按钮添加一个点击事件
        let matchButton = document.querySelector('#match-button');
        // 点击匹配按钮后触发的操作
        matchButton.onclick = function() {
            // 在触发 websocket 请求之前,先确认下 websocket 连接是否正常
            if (websocket.readyState == websocket.OPEN) {
                // 当前 readyState 处在 OPEN 状态,表示连接正常
                // 这里发送的数据有两种可能, 开始匹配/停止匹配
                if (matchButton.innerHTML == '开始匹配') {
                    console.log("开始匹配");
                    // 通过 websocket 发送数据
                    // send 是把一个 JSON 类型的数据进行发送
                    // JSON.stringify() 先把我们要发送的数据转换成 JSON 字符串
                    websocket.send(JSON.stringify({
                        message: 'startMatch',
                    }));
                } else if (matchButton.innerHTML == "匹配中...(点击停止)") {
                    console.log("停止匹配");
                    websocket.send(JSON.stringify({
                        message: 'stopMatch',
                    }));
                }
            } else {
                // 这是说明连接当前是异常的状态
                alert("当前您的连接已经断开! 请重新登录!");
                location.assign("/login.html");
            }
        }
    </script>

       在上面前后端交互代码的编写中,我们还要注意一点, JSON 字符串和 JS 对象的转换,这里 JSON 字符串转成 JS 对象用到的方法是 JSON.parse,JS 对象转成 JSON 字符串使用的方法是 JSON.stringify。

        编写完前后端交互的代码后,我们要注意一点,当我们修改完 css 样式或者 js 文件之后,往往需要在访问的页面中使用 Ctrl + F5 强制刷新一下页面才能生效,否则,浏览器可能仍然使用旧版本的代码,这是由于 css / js 的代码一般比较大,加载会比较慢,服务器会在第一次加载页面的时候把 css / js 部分的代码下载下来作为缓存,这样下次访问速度就会变快,Ctrl + F5 就是清除页面缓存让浏览器重新加载 css / js 代码。 

3.测试获取用户信息功能

        前后端交互做好之后,我们就可以启动服务器,在浏览器中输入:http://127.0.0.1:8080/login.html 进入登录页面,通过登录跳转到游戏大厅页面,来观察是否可以正确获取到用户信息,测试过程如下图所示:

        经过测试,图中的结果符合预期,游戏大厅页面中获取用户信息的功能就算是一个正常的功能了。 

·结尾

        文章到此就要结束了,本篇文章对匹配模块要用到的前后端交互接口进行了设计,并将游戏大厅的页面进行了编写,完成了获取用户信息的前后端交互代码,并测试了其功能的正确性,那么到这,五子棋匹配模块中的客户端代码开发也就基本完成了,如果对本篇文章内容有所疑惑,欢迎在评论区进行留言,如果感觉本篇文章还不错,希望能收到你的三连支持,下一篇文章就开始五子棋项目匹配模块中服务器端的代码开发了,我们下一篇文章再见吧~~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10. java基础知识(下)

文章目录 一、一带而过二、字符串类型String1. 简单了解2. 关于结束符\03. 自动类型转换与强制类型转换 三、API文档与import导包1. API文档2. import导包 四、java中的数组1. 创建2. 遍历3. 补充4. Arrays类① 简单介绍② 练习 五、方法的重载六、规范约束七、内容出处 一、一…

Sam Altman:年底将有重磅更新,但不是GPT-5!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

《Python编程实训快速上手》第四天--字符串操作

一、处理字符串 1、单引号和双引号 Python中单双引号均可以表示字符串&#xff0c;区别在于&#xff1a; 1、双引号中可以使用到单引号 2、单引号字符串中如果要使用单引号&#xff0c;要使用到转义字符 \ \ \t \n \\ 原始字符串 在开始的引号前加r&#xf…

原生html+js输入框下拉多选带关闭模块完整案例

<!DOCTYPE html> <html> <head> <title>多选下拉框</title> <style> * { box-sizing: border-box; margin: 0; padding: 0; } .multi-select-container { position: relative; width: 300px; margin: 20px; font-family: Arial, sans-seri…

在 Ubuntu 操作系统上:改变 App 任务栏菜单的背景色

Ubuntu 官方默认的终端&#xff0c;与操作系统的主题 theme 无关。

【优选算法 — 滑动窗口】滑动窗口小专题(一)

长度最小的子数组 长度最小的子数组 题目解析&#xff1a; 对于示例一 对于剩下两种示例&#xff1a; 解法一&#xff1a;暴力枚举 把所有的子数组全部枚举出来&#xff0c;并且枚举出的每一个子数组求和判断&#xff0c;返回长度最小的子数组&#xff1b; 时间复杂度 &…

半波整流器原理

一、二极管不控整流 1.阻性负载 1.1.电路拓扑结构 电路只由交流源、二极管和电阻组成。最基本的带阻性负载的半波整流器如图所示。输入源为交流源&#xff0c;目标是使输出电压含有非零直流分量&#xff0c;负载为R。功率二极管只允许电流往一个方向流动。 1.2.工作模态分析…

yolov8涨点系列之引入CBAM注意力机制

文章目录 YOLOv8 中添加注意力机制 CBAM 具有多方面的好处特征增强与选择通道注意力方面空间注意力方面 提高模型性能计算效率优化&#xff1a; yolov8增加CBAM具体步骤CBAM代码(1)在__init.pyconv.py文件的__all__内添加‘CBAM’(2)conv.py文件复制粘贴CBAM代码(3)修改task.py…

Rust-AOP编程实战

文章本天成&#xff0c;妙手偶得之。粹然无疵瑕&#xff0c;岂复须人为&#xff1f;君看古彝器&#xff0c;巧拙两无施。汉最近先秦&#xff0c;固已殊淳漓。胡部何为者&#xff0c;豪竹杂哀丝。后夔不复作&#xff0c;千载谁与期&#xff1f; ——《文章》宋陆游 【哲理】文章…

基于 SSM(Spring + Spring MVC + MyBatis)框架构建电器网上订购系统

基于 SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架构建电器网上订购系统可以为用户提供一个方便快捷的购物平台。以下将详细介绍该系统的开发流程&#xff0c;包括需求分析、技术选型、数据库设计、项目结构搭建、主要功能实现以及前端页面设计。 需求分析 …

Docker部署Oracle 11g

1&#xff0c;拉取镜像&#xff1a; sudo docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11gsudo docker images 2&#xff0c;启动一个临时容器&#xff0c;用于拷贝数据库文件&#xff0c;挂载到宿主主机&#xff0c;使数据持久化&#xff1a; sudo docke…

Linux操作系统:学习进程_了解并掌握进程的状态

对进程状态之间转换感到头疼&#xff0c;只听书本概念根本无法理解&#xff0c;死记硬背不是什么好的解决方法。只有进行底层操作去了解每一个进程状态&#xff0c;才能彻底弄清楚进程状态是如何转换的。 一、进程的各个状态 我们先从Linux内核数据结构来看&#xff1a; 每一个…

分布式环境下宕机的处理方案有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【分布式环境下宕机的处理方案有哪些&#xff1f;】面试题。希望对大家有帮助&#xff1b; 分布式环境下宕机的处理方案有哪些&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在现代分布式系统中&#xff0c;…

接触角测量(Contact Angle Measurement)

接触角是指液滴在固体表面上的形态&#xff0c;特别是在气、液、固三相交界点处&#xff0c;气-液界面切线与固-液交界线之间的夹角。这个角度是衡量液体对固体表面润湿性的一个重要参数。接触角的大小可以反映液体与固体之间的相互作用强度&#xff0c;从而了解液体在固体表面…

《操作系统 - 清华大学》2 -2:中断、异常和系统调用

文章目录 1. 中断和异常处理机制1.1 中断1.2 异常 2. 系统调用2.1 标志C库的例子2.2 编程接口 3.系统调用的实现4. 程序调用和系统调用的不同处5. 中断、异常和系统调用的开销 1. 中断和异常处理机制 接下来看一看中断和异常的处理过程&#xff0c;看下图就比较清楚&#xff0…

Nginx简易配置将内网网站ssh转发到外网

声明&#xff1a;本内容仅供交流学习使用&#xff0c;部署网站上线还需要根据有关规定申请域名以及备案。 背景 在内网的服务器有一个运行的网页&#xff0c;现使用ssh反向代理&#xff0c;将它转发到外网的服务器。 但是外网的访问ip会被ssh反向代理拦截 所以使用Nginx进行…

Moment.js、Day.js、Miment,日期时间库怎么选?

一直以来&#xff0c;处理时间和日期的JavaScript库&#xff0c;选用的都是Momment.js。它的API清晰简单&#xff0c;使用方便灵巧&#xff0c;功能还特别齐全。 大师兄是Moment.js的重度使用者。凡是遇到时间和日期的操作&#xff0c;就把Moment.js引用上。 直到有天我发现加…

后台管理系统窗体程序:文章管理 > 文章发表

目录 文章列表的的功能介绍&#xff1a; 1、进入页面 2、页面内的各种功能设计 &#xff08;1&#xff09;进入选择 &#xff08;2&#xff09;当获取到唯一标识符时 &#xff08;3&#xff09;当没有标识符时 &#xff08;4&#xff09;发布按钮&#xff0c;存为草稿 一、网…

Linux服务控制及系统基本加固

一. liunx操作系统的开机引导的过程 1. 开机自检 根据bios的设置&#xff0c;对cpu,内存&#xff0c;显卡&#xff0c;键盘等等设备进行初步检测如果以上检测设备工作正常&#xff0c;系统会把控制权移交到硬盘 总结:检测出包含系统启动操作系统的设备&#xff0c;硬盘&#…

通过 SSH 隧道将本地端口转发到远程主机

由于服务器防火墙,只开放了22端口,想要通过5901访问服务器上的远程桌面,可以通过下面的方式进行隧道转发。 一、示例命令 这条代码的作用是通过 SSH 创建一个 本地端口转发,将你本地的端口(5901)通过加密的 SSH 隧道连接到远程服务器上的端口(5901)。这种方式通常用于在…