当前位置: 首页 > article >正文

[网页五子棋][匹配模式]创建房间类、房间管理器、验证匹配功能,匹配模式小结

文章目录

  • 创建房间类
    • 创建房间类
    • 实现房间管理器
  • 实现匹配器(3)
  • 验证匹配功能
    • 问题:匹配按钮不改变
    • 验证多开
  • 小结

创建房间类

LOL,通过匹配的方式,自动给你加入到一个房间,也可手动创建游戏房间

  • 这一局游戏,进行的“场所”就可以称为是一个“游戏房间”,游戏房间中最关键的信息,就是玩家信息
  • 一个游戏服务器,有同时存在了多个游戏房间

我们就需要一个“游戏房间管理器”来管理多个游戏房间image.png|429

  • 键值对的方式,给每个 room 生成一个唯一的 roomId,以键值对 (哈希表) 在 room manager 中来进行管理

创建房间类

匹配成功之后,需要把对战的两个玩家放到同一个房间对象中

创建 game.Room

  • 一个房间要包含一个房间 ID,使用 UUID 做为房间的唯一身份标识
  • 房间内要记录对弈的玩家双方信息

UUID 表示“世界上唯一的身份标识”

  • 通过一系列的算法,能够生成一串字符串(一组十六进制表示的数字)
  • 两次/任意次调用这个算法,生产的这个字符串都是不同的
package org.example.java_gobang.game;  import org.example.java_gobang.model.User;  import java.util.UUID;  // 表示一个游戏房间  
public class Room {  // 此处我们使用字符串的类型来表示,方便生成唯一值  private String roomId;  private User user1;  private User user2;  public String getRoomId() {  return roomId;  }  public void setRoomId(String roomId) {  this.roomId = roomId;  }  public User getUser1() {  return user1;  }  public void setUser1(User user1) {  this.user1 = user1;  }  public User getUser2() {  return user2;  }  public void setUser2(User user2) {  this.user2 = user2;  }  public Room() {  // 构造 Room 的时候,生成一个唯一的字符串来表示房间 id        roomId = UUID.randomUUID().toString();  }  
}

实现房间管理器

Room 对象会存在很多,每两个对弈的玩家,都对应一个 Room 对象,需要创建一个管理器对象来管理所有的 Room

创建 game.RoomManager

  • 使用一个 Hash 表,保存所有房间对象
    • key:roomId
    • value:Room对象
  • 再使用一个 Hash 表,保存 userId -> RoomId 的映射,方便根据玩家来查找所在的房间
  • 提供增、删、查的 API
    • 查询包含基于房间 ID 的查询和基于用户 ID 的查询
package org.example.java_gobang.game;  import org.springframework.stereotype.Component;  import java.util.concurrent.ConcurrentHashMap;  // 房间管理器,这个类也希望有唯一实例  
@Component  
public class RoomManager {  private ConcurrentHashMap<String, Room> rooms = new ConcurrentHashMap<>();  // 通过这个哈希表,把玩家和房间之间的关系维护起来  private ConcurrentHashMap<Integer, String> userIdToRoomId = new ConcurrentHashMap<>();  public void add(Room room, int userId1, int userId2) {  rooms.put(room.getRoomId(), room);  userIdToRoomId.put(userId1, room.getRoomId());  userIdToRoomId.put(userId2, room.getRoomId());  }  public void remove(String roomId, int userId1, int userId2) {  rooms.remove(roomId);  userIdToRoomId.remove(userId1);  userIdToRoomId.remove(userId2);  }  public Room getRoomByRoomId(String roomId) {  return rooms.get(roomId);  }  // 根据用户id 定位房间  public Room getRoomByUserId(int userId) {  String roomId = userIdToRoomId.get(userId);  if(roomId == null) {  // userId -> roomId 映射关系不存在,直接返回 null            return null;  }  return rooms.get(roomId);  }  
}

实现匹配器(3)

完善刚才匹配逻辑中的 TODO,并把玩家放到一个房间中 image.png|353

  • 先给 Matcher 注入 RoomManager 对象
@Component
public class Matcher {//......// 房间管理器@Autowiredprivate RoomManager roomManager;// ......
}然后修改 Matcher.handlerMatch,补完之前 TODO 的内容
private void handlerMatch(Queue<User> matchQueue) {// 4. 把这两个玩家放到一个游戏房间中  Room room = new Room();  roomManager.add(room, player1.getUserId(), player2.getUserId());// ......
}

验证匹配功能

问题:匹配按钮不改变

当前发现,玩家点击匹配之后,匹配按钮的文本不发生改变

  • 分析之前写的代码,点击按钮的时候,仅仅是给服务器发送了一个 websocket 请求,告诉服务器我要开始匹配了
  • 服务器会立即返回一个响应,“进入匹配队列成功”,然后页面再修改按钮的文本image.png|372

出现问题的原因:

  • 服务器在处理匹配请求的时候,按理说是要立即就返回一个 websocket 响应的
  • 实际上在服务器代码这里构造了响应对象,但是忘记 sendMessage,给发回去了image.png|338
    在红框中加入如下逻辑代码
// 将 response 先转换成 JSON 字符串,然后将其通过 sendMessage 发回客户端  
String jsonString = objectMapper.writeValueAsString(response);  
session.sendMessage(new TextMessage(jsonString));

就类似于:你网购买了个东西,商家都已经打包好了,但是最后忘记发货了

image.png

验证匹配功能的时候,模拟多个用户登录的情况,最好使用多个浏览器,避免同一个浏览器中的 cookie/session 信息互相干扰

  • 如果只有一个浏览器,并且是 chrome 的话,chrome 有个无痕模式(不会记录历史记录,也不会记录 cookie,页面关闭的时候会自动清空)

验证多开

当我们打开两个页面,登录同一个账号的时候,后登录的页面的检查页面会出现提示,但是正常用户多开了在页面中却没有显示 image.png

  • 当用户多开之后,连接就会直接关闭,不能再进行匹配了image.png
    image.png|449

当前情况下,防多开机制起到了作用,但是又感觉差了点意思

  • 要是在第二个账号登录的时候,在页面中直接有提示就更好了

此时我们就可以调整前端代码,当检测到多开的时候,就给用户一个更加明确的提示 image.png|422

这样,在我们登录的时候,要是出现了多开的情况,就直接报错了,返回重新登录页面image.png|492

  • 当我们修改了 css 样式/ JS 文件之后,往往要在浏览器中使用 cmd+shift+R(Windows:ctrl+f5)强制刷新,才能生效
  • 否则浏览器可能仍然在执行旧版本的代码(浏览器自带缓存)

小结

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

相关文章:

[网页五子棋][匹配模式]创建房间类、房间管理器、验证匹配功能,匹配模式小结

文章目录 创建房间类创建房间类实现房间管理器 实现匹配器(3)验证匹配功能问题&#xff1a;匹配按钮不改变验证多开 小结 创建房间类 LOL&#xff0c;通过匹配的方式&#xff0c;自动给你加入到一个房间&#xff0c;也可手动创建游戏房间 这一局游戏&#xff0c;进行的“场所…...

实验设计与分析(第6版,Montgomery)第3章单因子实验:方差分析3.11思考题3.7 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第3章单因子实验&#xff1a;方差分析3.11思考题3.7 R语言解题。主要涉及单因子方差分析&#xff0c;正态性假设检验&#xff0c;残差与拟合值的关系图&#xff0c;平方根变换。 X<-c(…...

【知识点】第2章:Python程序实例解析

文章目录 知识点整理Python程序语法元素分析 练习题判断题填空题选择题 知识点整理 Python程序语法元素分析 Python程序包括格式框架、注释、变量、表达式、分支语句、循环语句、函数等语法元素。 程序的格式框架 Python语言采用严格的 “缩进” 来表明程序的格式框架。缩进…...

从解决一个分享图片生成的历史bug出发,详解LayoutInflater和View.post的工作原理

问题背景 最近在项目中遇到一个问题&#xff1a;在档口分享功能中&#xff0c;需要动态生成一个分享图片。代码是这样写的&#xff1a; // 项目中的代码 val shareView LayoutInflater.from(thisStallMainActivityV1).inflate(R.layout.share_header_stall_main_layout, nul…...

Ubuntu 22.04 上使用 Docker 安装 RagFlow

GitHub地址:添加链接描述 RAGFlow 是一款开源的检索增强生成(Retrieval-Augmented Generation,简称 RAG)引擎,旨在通过深度文档理解技术,结合大语言模型(LLM),为用户提供高质量、可溯源的问答服务。 🚀 快速入门 RAGFlow 提供了便捷的部署方式,支持 Docker 环境。…...

每日Prompt:指尖做画

提示词 微缩景观&#xff0c;微距摄影&#xff0c;俯瞰角度&#xff0c;特写&#xff0c;硕大食指手指甲&#xff0c;一个小小的人正在做画&#xff0c;小人右手拿画笔&#xff0c;小人左手拿调色盘&#xff0c;在指甲上作画&#xff0c;画的是中国古代山水画&#xff0c;背景…...

Python打卡训练营day40——2025.05.30

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中 展平操作&#xff1a;除第一个维度batchsize外全部展平 dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练…...

Java八股-数据类型转换有哪些?类型互转会有什么问题?为什么用bigDecimal 不用double ?自动装箱和拆箱?包装类?

Java中有哪些数据类型转换&#xff1f; 显示类型转换&#xff1a;在前面一个括号&#xff0c;里面写上要转换的类型 隐式类型转换&#xff1a;小范围的数据类型转大范围的&#xff0c;int到long&#xff0c;float到double 字符串转整形或浮点&#xff1a;整形&#xff1a;In…...

redis未授权(CVE-2022-0543)

概述 Redis 默认绑定在 0.0.0.0:6379&#xff0c;在未配置防火墙或访问控制的情况下会将服务暴露在公网上。若未设置访问密码&#xff08;默认通常为空&#xff09;&#xff0c;攻击者可直接未授权访问 Redis。利用 Redis 提供的 CONFIG 命令&#xff0c;攻击者可修改配置并将…...

【运维实战】Linux 中su和sudo之间的区别以及如何配置sudo!

Linux 系统相比其他操作系统具有更高的安全性&#xff0c;其安全机制的核心之一在于用户管理策略和权限控制--普通用户默认无权执行任何系统级操作。 若普通用户需要进行系统级变更&#xff0c;必须通过su或sudo命令提权。 1.su与sudo的本质区别 su 要求直接共享 root 密码&…...

LevelDB、BoltDB 和 RocksDB区块链应用比较

LevelDB、BoltDB 和 RocksDB 是三种常用的键值存储数据库&#xff0c;它们在区块链领域&#xff08;如以太坊、比特币等&#xff09;或其他高性能应用中有广泛应用。虽然它们都是嵌入式键值存储&#xff0c;但设计目标、性能特性、功能支持和适用场景有显著差异。以下是它们的详…...

c/c++的opencv图像金字塔缩放

图像金字塔缩放&#xff1a;OpenCV C/C 实践 &#x1f4d0; 图像金字塔是计算机视觉中一种重要且基础的多尺度表示方法。它通过对原始图像进行连续的下采样&#xff08;缩小&#xff09;或上采样&#xff08;放大&#xff09;操作&#xff0c;生成一系列不同分辨率的图像。这些…...

PDF文件转换之输出指定页到新的 PDF 文件

背景 一份 PDF 学习资料需要打印其中某几页&#xff0c;文件有几百兆&#xff0c;看到 WPS 有PDF拆分功能&#xff0c;但是需要会员&#xff0c;开了一个月会员后完成了转换。突然想到&#xff0c;会员到期后如果还要拆解的话&#xff0c;怎么办呢&#xff1f;PDF 文件拆解功能…...

浏览器之禁止打开控制台【F12】

前言 在有时我们的日常开发工作中&#xff0c;有些项目要求我们增加禁用控制台的要求&#xff0c;这种虽然很鸡肋&#xff0c;但是它确实存在&#xff0c;并且会让哈哈心里觉得很有成就感。 所以今天他来了。 文章目录 前言无限debugger实现思路&#xff1a;效果如下&#xff1…...

进阶智能体实战九、图文需求分析助手(ChatGpt多模态版)(帮你生成 模块划分+页面+表设计、状态机、工作流、ER模型)

🧠 基于 ChatGPT 多模态大模型的需求文档分析助手 本文将介绍如何利用 OpenAI 的 GPT-4o 多模态能力,构建一个智能的需求文档分析助手,自动提取功能模块、菜单设计、字段设计、状态机、流程图和 ER 模型等关键内容。 一、🔧 环境准备 在开始之前,请确保您已经完成了基础…...

GEARS以及与基础模型结合

理解基因扰动的反应是众多生物医学应用的核心。然而&#xff0c;可能的多基因扰动组合数量呈指数级增长&#xff0c;严重限制了实验探究的范围。在此&#xff0c;图增强基因激活与抑制模拟器&#xff08;GEARS&#xff09;&#xff0c;将深度学习与基因-基因关系知识图谱相结合…...

SFINAE(替换并不是错误)机制详解详解

C—SFINAE机制详解 1. 核心概念 SFINAE&#xff08;替换失败并非错误&#xff09;是C模板元编程的核心机制&#xff0c;它规定了&#xff1a; 在模板参数推导/替换过程中如果某个替换导致无效代码不会引发编译错误而是从候选函数集中静默移除该模板特化 关键特性 template …...

怎么用外网打开内网的网址?如在异地在家连接访问公司局域网办公网站

什么是内网&#xff1a;即本地网络&#xff0c;私有网&#xff0c;内网IP&#xff0c;如学校局域网&#xff0c;家庭内网&#xff0c;公司内部网络等。可以简单理解为同一个路由下的几个电脑网络。 外网概念&#xff1a;即公网&#xff0c;互联网&#xff0c;是相对于内网而言…...

计算机网络 | 1.1 计算机网络概述思维导图

附大纲&#xff1a; 计算机网络的概念 一个通过通信设备与线路把不同计算机系统连接起来&#xff0c;实现资源共享和信息传递的系统 计算机网络的组成 从组成成分上 硬件&#xff1a;主机、通信链路、交换设备、通信处理机软件&#xff1a;网络操作系统、聊天软件等协议&…...

AI对软件工程的影响及未来发展路径分析报告

目录 第一部分&#xff1a;引言 研究背景与意义 报告框架与方法论 第二部分&#xff1a;AI对不同行业软件工程的影响分析 数字化行业 制造业 零售业 工业领域 第三部分&#xff1a;大厂AI软件工程实践案例分析 微软 谷歌 阿里巴巴 华为 第四部分&#xff1a;未来…...

redis缓存与数据库协调读写机制设计

1.读机制&#xff1a; 读机制没有太大的争议点&#xff0c;因为缓存机制的设计&#xff0c;就是为了更快的命中目标数据&#xff0c;所以读机制先天固定好了&#xff1a;先去读取缓存&#xff0c;缓存未命中再去读取数据库。 2.写机制&#xff1a; 写机制其实也没什么争议点…...

最悉心的指导教程——阿里云创建ECS实例教程+Vue+Django前后端的服务器部署(通过宝塔面板)

各位看官老爷们&#xff0c;点击关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 阿里云创建ECS实例教程 注意&#xff1a; 阿里云有300元额度的免费适用期哟 白嫖~~~~ 注册了阿里云账户后&#x…...

【Python】os模块

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心架构图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…...

Syslog 全面介绍及在 C 语言中的应用

Syslog 概述 Syslog 是一种工业标准的日志记录协议&#xff0c;用于在网络设备之间传递日志消息。它最早由 Eric Allman 在 1980 年代为 BSD Unix 开发&#xff0c;现在已成为系统和网络管理的重要组成部分。Syslog 协议允许设备将事件消息发送到中央服务器&#xff08;称为 sy…...

windows中Redis、MySQL 和 Elasticsearch启动并正确监听指定端口

Redis&#xff1a;在 localhost 上启动&#xff0c;并监听端口 6379 MySQL&#xff1a;在 localhost 上启动&#xff0c;并监听端口 3306 Elasticsearch&#xff1a;在 127.0.0.1 上启动&#xff0c;并监听端口 9300 1. Redis 确保 Redis 在 localhost 上启动并监听端口 6379…...

Paimon远程文件系统连接机制解析

Paimon 在处理与远程文件系统的连接和使用方面&#xff0c;设计了一套灵活的抽象机制。下面将结合源代码分析 Paimon 是如何实现这一点的。 核心思想是定义一个通用的 FileIO 接口&#xff0c;然后为不同的文件系统提供具体的实现。对于常见的 HDFS、S3、OSS 等&#xff0c;Pa…...

学者观察 | Web3.0的技术革新与挑战——北京理工大学教授沈蒙

导语 沈蒙老师认为Web3.0正推动形成新型数据基础设施架构和数据要素流通机制&#xff0c;有望在数字经济时代发挥重要作用&#xff0c;对我国经济发展和社会进步将产生深远影响。AI在推动Web3.0发展方面具有巨大的潜力&#xff0c;但在隐私保护、公平性与安全性等方面也存在“…...

pycharm终端遇不显示虚拟环境的问题

大部分我们用pycharm会配合我们的anaconda来使用&#xff0c;但是配置好后&#xff0c;可能会出现pycharm终端不显示虚拟环境的问题。 首先是确定不显示环境&#xff0c;下图中如果没有这个方框&#xff0c;就是不显示虚拟环境。此时用pip或者conda的命令是会提示不是 “不是内…...

聊聊网络变压器的浪涌等级标准是怎样划分的呢?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;聊聊网络变压器的浪涌等级标准是怎样划分的呢&#xff1f; 在和做防雷产品的客户的深度沟通网络变压器产品选型中发现&#xff1a;客户对网络变压器的浪涌等级划分也很希望有更深的了解&#xff0c;今天就这个问题和…...

2025年Google I/O大会上,谷歌展示了一系列旨在提升开发效率与Web体验的全新功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...