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

web斗地主游戏实现指北

前后端通信

作为一个即时多人游戏,不论是即时聊天还是更新玩家状态,都需要服务端有主动推送功能,或者客户端轮询。轮询的时间间隔可能导致游玩体验差,因为不即时更新,而且请求数量太多可能会打崩服务器。

建议在cs间建立websocket连接,其实就是建立一个更占资源的连接,但是可以长期维持这个连接通道,两端都可以收发消息。

对于服务端需要额外的配置,如spring这种已成体系的大框架就不原生支持ws,需要额外的依赖。

ws不支持SSL,有个wss就是ws+SSL

通信模型就是一个server作为ws服务器,可以与不同client建立连接并相互发送信息。注意在开发中,是服务端这边会对每一个client新建一个连接对象并保存在内存中(HashSet<Connect>)。往往服务端推送是广播,遍历这个HashSet,对所有客户端发同一个消息。

房间隔离

作为游戏有房间的需求,某些更新只需广播给某个房间里的玩家,而不是全体玩家。而最基本的ws不支持房间号这些,倒是socketio这种有专门支持,但是socketio需要专门的服务端依赖和客户端依赖。如果需要自己基于ws实现的话,可以在上面那个HashSet的基础上再套一层,即HashMap<RoomID,Connect>。由于clien请求中会提及是哪个房间发来的请求,我们找到对应房间的几个连接,只对这几个玩家发送消息。

匹配机制

这个更像是产品方案设计而不是技术设计,可以参考LOL等游戏的排名分机制。

我的一个思路是,假设我的当前rank分是k,从现在开始经过的时间为t,我会搜索rank分在[ k-t, k+t ]区间的、也正在匹配队列中的其他玩家,即这个区间随时间不断扩大。这个方案较为简单,适用于课设、毕设这种玩家数量过少、需要一定算法辅助匹配的情况。

考虑到斗地主在等待环节退出游戏的功能,匹配不止是几个人匹配上就马上开一局这种类似LOL的情况。对于已经进入房间、还在准备阶段、但某人又退出的情况,我们需要重新设计:

  • 如果在几秒内没有找到房间,则自己开一个房间。否则进入一个匹配上的房间。
  • 匹配算法是,玩家去匹配房间,房间的rank分为当前房间内玩家的平均rank分,在之前提到的区间范围内即被匹配上,玩家进入该房间。
  • 还未满人的房间存在匹配队列中,供玩家定时轮询匹配。
  • 记得在最后一个玩家退出房间后,从匹配队列中移除该房间。

建立房间

除了自由匹配,我们还要实现几个熟人组一局的需求。我们除了"自由匹配"按钮外,还要提供一个额外的"建立房间"按钮,这种房间不能被加入匹配队列中。除此之外要提供一个房间号,可以用uuid或者雪花算法等生成,并提供复制房间号和根据房间号查询的功能。

游戏

游戏状态

由于状态改变频繁,我是用redis做分布式缓存,保证一个后端节点宕机后,另一个节点也能继续使用redis中的状态。
但其实这种还是慢了,而且开发起来很麻烦,读写要反复做序列化反序列化,深层状态也不能直接hset和hget。建议还是用本地HashMap保存游戏状态。通过多节点、负载均衡,每个节点管理部分牌局。
对于游戏里的对象,构建Card、Room、Player等对象,将这些对象保存在内存中,即保存游戏状态。
Room需要记录当前出牌玩家、上一次的出牌、倍率、倒计时、地主牌等信息。
牌要记录花色、大小。

准备

开始前,各自都有个准备按钮,点击后进入准备中。如果房间满人且全部准备,则生成随机牌,除了3张地主牌,其他的直接发给各个玩家,房间进入叫分阶段。

倒计时

考虑到玩家会刷新界面,倒计时沙漏不能放在前端,由后端统一管理,每秒减一并发送给各个玩家以更新。倒计时为0时触发对应事件。

叫分

按照某种顺序,开始逐个叫分,超时的则不叫。具体规则自行设计。选上地主的玩家获得地主牌,并从他开始出牌。房间进入正式开始阶段。

提示出牌

如果上家出了牌,则查询我的手牌中是否有比他大的。我这里只是简单写下,这里的牌型判断和大小比较最好封装为函数,因为除了提示除外,直接出牌时也要比较,如果不行要给用户对应显示。

permutation:List<List<Card>> = 全排列枚举手牌中所有可能,2^n,最大不超过2^20,只在客户端计算
hint = None
for cards in permutation:if cards 不合法:continueif cards 是炸弹:...if cards 是王炸:...if 相同牌型且大于:...
if hint == None:...
else:...

托管

自动根据提示的第一个方案出牌。

出牌校验

考虑到客户端可能会乱搞,所以在服务端也要对出牌再做一次校验,是否真的大于上家的牌。

出牌超时

如果出牌时超时,如果上家没出,则出最小的一张,否则直接打不起。

打不起

清空"上一次出牌"。

退出重连

退出行为能通过用户点击按钮退出的行为、或网络错误断开websocket连接触发hook,这两个捕获到。

如果退出,在服务端更新该用户为托管,并更新客户端。如果重新连接,则将他的状态改为正常,并将当前游戏状态推送给该用户。

对于逃跑需要在结算时给予惩罚。

结算

某玩家的牌出完后,先让前端放一个出牌动画,然后再让各用户展示手牌,然后再显示结算框。

自行设计规则,主要是根据叫分、炸弹飞机等数量,做加法、乘法等,对输赢玩家做金币和rank分的增减。

注意结算框是另一个推送请求,在这个请求推送后直接在服务端修改该房间状态为准备中。

点击结算框的确认的玩家,在前端还是留在房间内,显示准备中。即后端其实已经改了,但是页面转换逻辑留给前端。这样效果比较好。

人机

  • 使用 RL 模型:github.com/kwai/Douzero
  • 我做了一些调整,方便使用它:github.com/urlyy/DouZero_I_have_trimmed

放个图做封面图
在这里插入图片描述

相关文章:

web斗地主游戏实现指北

前后端通信 作为一个即时多人游戏&#xff0c;不论是即时聊天还是更新玩家状态&#xff0c;都需要服务端有主动推送功能&#xff0c;或者客户端轮询。轮询的时间间隔可能导致游玩体验差&#xff0c;因为不即时更新&#xff0c;而且请求数量太多可能会打崩服务器。 建议在cs间…...

SpringMVC其他扩展

一、全局异常处理机制: 1.异常处理两种方式: 开发过程中是不可避免地会出现各种异常情况的&#xff0c;例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题&#xff0c;甚至直接导致程序崩溃。因此&#xff0c;在开发过程中&#xff0c;…...

【Linux】网络服务

声明&#xff0c;以下内容均学习自《Linux就该这么学》一书 1、创建网络会话 Linux系统使用NetworkManager提供网络服务&#xff0c;它是一种动态管理网络配置的守护进程&#xff0c;能够让网络设备保持连接状态。 nmcli nmcli是一款基于命令行的网络配置工具&#xff0c;它…...

工作:SolidWorks从3D文件导出2D的DWG或DXF类型文件方法

工作&#xff1a;SolidWorks从3D文件导出2D的DWG或DXF类型文件方法 SolidWorks从3D文件导出2D的DWG或2D DXF类型文件方法&#xff08;一&#xff09;打开3D文件&#xff08;二&#xff09;从装配体到工程图&#xff08;三&#xff09;拖出想要的角度的图型&#xff08;四&#…...

IDL学习笔记(五)MODIS数据(Grid)

IDL学习笔记&#xff08;四&#xff09; MODIS Grid数据的重投影 正弦投影 是以 米 为单位的 经纬度网格 是以 度 为单位的 但是转换之后&#xff0c;不会一一对应&#xff0c;所以需要对中间空缺位置需要进行一个填补。 核心问题: 把一个点从一个空间参考系放到另一个空间参…...

JavaScript语言介绍

JavaScrip是一门编程语言 浏览器的工作原理 所以得域名都会被解析成ip地址&#xff0c;ip地址就是服务器地址&#xff0c;服务器地址会返回一个html文件&#xff0c;解析html遇到css文件和JavaScript标签就会把相应内容下载下来进行解析。 认识浏览器的内核 浏览器的渲染过程 …...

Lua使用点号和冒号的区别

首先建立一个table&#xff0c;再分别定义两个方法&#xff0c;如下&#xff1a; local meta {}function meta:test1(...)print(self)print("")for k,v in pairs({...}) doprint(v)end endfunction meta.test2(...)print(self)print("")for k,v in pairs…...

LLM - 开源视觉多模态 LLaVA-CoT(o1) 深度推理模型 测试与源码 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144304351 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 LLaVA-…...

Ansible的yum和saltstack的哪个功能相似

Ansible的yum和saltstack的哪个功能相似 在 Ansible 和 SaltStack 中&#xff0c;Ansible 的 yum 模块 和 SaltStack 的 pkg 模块 功能相似。它们都用于管理软件包&#xff0c;支持安装、升级、删除和查询等操作。 Ansible 的 yum 模块 用途&#xff1a; 专门用于基于 Red Hat …...

paimon0.9记录

启动paimon -- 本地模式演示 bin/start-cluster.sh-- 启动sqlclient bin/sql-client.sh示例 -- 创建catalog&#xff0c;每次都要创建&#xff0c;创建一个已经存在的catalog相当于使用 CREATE CATALOG fs_catalog WITH (typepaimon,warehousefile:/data/soft/paimon/catalog…...

Java 中 List 接口的学习笔记

1. 什么是 List&#xff1f; 在 Java 中&#xff0c;List 是一个接口&#xff0c;属于 Java Collections Framework。它表示一个有序的集合&#xff0c;可以包含重复元素。List 接口允许通过索引访问元素&#xff0c;提供了多种实现方式&#xff0c;如 ArrayList 和 LinkedLis…...

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画

图片相册这种动画效果也很常见&#xff0c;在我们的网站上。鼠标滑入放大图片&#xff0c;滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】&#xff0c;里面有大量的css3动画效果制作原生知识分析&…...

LVGL9 定时器模块

文章目录 前言定时器系统概述特点 定时器的创建函数&#xff1a;lv_timer_create函数&#xff1a;lv_timer_create_basic 定时器的控制函数&#xff1a;lv_timer_ready函数&#xff1a;lv_timer_reset 定时器的参数设置函数&#xff1a;lv_timer_set_cb函数&#xff1a;lv_time…...

Qt学习笔记第51到60讲

第51讲 记事本实现打开功能 回到第24个功能文件Notepad&#xff0c;给UI中的各个控件添加槽函数。 ①开始按钮 void Widget::on_btnOpen_clicked() {QString fileNameQFileDialog::getOpenFileName(this,tr("Open File"),"E:\\6_Qt Projects\\24_Notepad\\fi…...

网页设计--axios作业

根据以下mock地址中的json数据&#xff0c;使用axios异步方式获取并显示在页面中。 https://apifoxmock.com/m1/3761592-3393136-default/peotfindAll?apifoxApiId171582689 {"code": 1,"msg": "success","data": [{"id": …...

SpringBoot 整合 Avro 与 Kafka 详解

SpringBoot 整合 Avro 与 Kafka 详解 在大数据处理和实时数据流场景中&#xff0c;Apache Kafka 和 Apache Avro 是两个非常重要的工具。Kafka 作为一个分布式流处理平台&#xff0c;能够高效地处理大量数据&#xff0c;而 Avro 则是一个用于序列化数据的紧凑、快速的二进制数…...

若依 ruoyi VUE el-select 直接获取 选择option 的 label和value

1、最新在研究若依这个项目&#xff0c;我使用的是前后端分离的方案&#xff0c;RuoYi-Vue-fast(后端) RuoYi-Vue-->ruoyi-ui(前端)。RuoYi-Vue-fast是单应用版本没有区分那么多的modules 自己开发起来很方便&#xff0c;这个项目运行起来很方便&#xff0c;但是需要自定义的…...

大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

修改MySQL存储路径

1.查看原路径 show variables like ‘%datadir%’; 2.停止MYSQL 以管理员身份运行命令提示符 net stop MySQL84 在服务中直接停止MySQL 3.编辑配置文件 可能会遇到无权限修改&#xff0c;可以先修改my.ini的权限。可以通过&#xff1a;右键my.ini → 属性 → 安全→ 编辑 …...

Git常用的命令【提交与回退】

git分布式版本控制系统 &#xff08;SVN集中式版本控制系统&#xff09;之间的对比 git有本地仓库和远程仓库&#xff0c;不同的开发人员可以分别提交自己的本地仓库并维护代码的版本控制。 然后多个人员在本地仓库协作的代码&#xff0c;可以提交到远程仓库中做整合。 git本…...

别再硬编码IP了!深入Nacos 2.x源码,看它如何‘智能’又‘犯错’地选择服务端地址

Nacos 2.x服务端IP地址选择机制深度解析与实战调优 在分布式系统架构中&#xff0c;服务注册与发现是微服务架构的核心基础设施。作为阿里巴巴开源的服务发现和配置管理平台&#xff0c;Nacos凭借其简单易用、功能强大等特点&#xff0c;已成为众多企业微服务架构的首选组件。…...

LM567锁相环芯片实测:手把手教你搭建10kHz音频信号检测电路(附面包板接线图)

LM567锁相环芯片实战&#xff1a;从零构建10kHz音频检测电路全流程解析 在电子设计领域&#xff0c;频率检测一直是个既基础又关键的课题。无论是红外遥控信号解码、超声波测距&#xff0c;还是电磁导航系统&#xff0c;精准的频率识别都是实现功能的前提。而LM567这款经典的锁…...

这3个降AI提示词千万别用!让你的知网AI率反涨10个点过不了AIGC检测

这3个降AI提示词千万别用&#xff01;让你的知网AI率反涨10个点过不了AIGC检测 室友的真实事故——降 AI 提示词用错知网 AI 率反涨 3 月 19 号晚上室友哭着发消息&#xff1a;「我上网搜了一个降 AI 万能提示词改完段落送知网测——AI 率从 67% 涨到 77% 了&#xff01;这怎…...

小学生如何高效通过GESP七八级

‌GESP 7-8级是通往信息学竞赛复赛的关键跳板‌&#xff0c;对小学生而言&#xff0c;需结合科学规划、系统学习与真题实战。以下是高效通关路径&#xff1a; 一、明确目标&#xff1a;GESP 7-8级的核心价值 1、‌GESP C 7级 ≥80分‌ 或 ‌8级 ≥60分‌ → 可免CSP-J初赛&…...

AI Agent Harness Engineering 的安全攻防:你的智能体如何被欺骗、劫持与利用

AI Agent Harness Engineering 安全攻防深度解析:你的智能体如何被欺骗、劫持与利用 关键词 AI Agent安全、Harness工程、Prompt注入、工具劫持、智能体攻防、LLM安全、权限逃逸 摘要 随着AI Agent从概念验证走向大规模产业落地,作为智能体控制平面的Harness层已成为攻防…...

EFM8 I2C Slave外设深度解析:从SMBus思维转换到实战应用

1. 项目概述&#xff1a;从SMBus到I2C Slave的思维转换如果你之前主要接触的是SMBus&#xff08;系统管理总线&#xff09;设备&#xff0c;现在要上手Silicon Labs的EFM8LB1或EFM8BB3这类8位MCU的I2C Slave&#xff08;从机&#xff09;功能&#xff0c;可能会觉得有点“水土不…...

77种商品-图像分类数据集

77种商品图像分类数据集 数据集(文章最后关注公众号获取数据集): 链接: https://pan.baidu.com/s/1Xcj5Z-RSUjGH47OIbH5wjQ?pwd=fq2p 提取码: fq2p 数据集信息介绍: 以下是整理后的清晰呈现,按照商品名称首字母顺序进行排列: 东方树叶红茶:文件夹中的图片数量为 150 …...

AI技能实战:本地部署大模型构建智能摘要工具

1. 项目概述&#xff1a;一个面向AI技能实践的开发者工具箱最近在GitHub上看到一个挺有意思的项目&#xff0c;叫inblog-inc/inblog-ai-skills。光看这个名字&#xff0c;你可能会觉得它又是一个关于“AI技能”的教程合集或者理论文档。但点进去之后&#xff0c;我发现它的定位…...

FPGA串行FIR滤波器设计:Verilog实现与资源优化实战

1. 项目概述在数字信号处理&#xff08;DSP&#xff09;的硬件实现领域&#xff0c;FIR&#xff08;有限脉冲响应&#xff09;滤波器因其绝对稳定性和线性相位特性&#xff0c;成为工程师们手中的一把利器。无论是通信系统的信道均衡&#xff0c;还是音频处理中的噪声抑制&…...

从枚举到成像:VisionMaster连接海康工业相机的实战避坑指南

1. 工业相机连接前的硬件准备 第一次用VisionMaster连接海康工业相机时&#xff0c;硬件连接是最容易出问题的环节。我遇到过不少新手工程师因为电源接反或者网线没插好&#xff0c;折腾半天找不到设备的情况。这里分享几个关键细节&#xff1a; 首先是供电问题。海康工业相机通…...