我开发了《联机桌游合集: UNO+斗地主+五子棋》,让你享受纯粹的游戏

1. 《联机桌游合集: UNO+斗地主+五子棋》是什么?

这是我独立开发的H5小游戏,它是个桌游合集,每一款都可以联机,跟朋友一起玩。

目前包括3款游戏:UNO、斗地主、五子棋,以后会持续开发新游戏。

地址:game.hullqin.cn

特点

支持联机

跟朋友进入同一个房间,即可联机玩游戏。

  • 《UNO》支持2-10人一起玩。
  • 《斗地主》支持2-4人打牌。
  • 《五子棋》支持1-2人下棋。

第一个进入房间的人会成为「房主」,可以修改游戏人数,人齐后房主可「开始游戏」。

游戏中断可随时重连

开始游戏后,如果你掉线,或者关闭了网页。不论过多久,只要房主没结束游戏,你重新回到这个房间,就可以继续对局。

哪怕所有人都关闭网页,只要游戏没结束。大家回来后,仍然可以继续对战!

当然,如果游戏还没开始,或游戏已经结束,那么你关闭网页,就退出房间了。

允许观战

当房间人数满时,之后进入的房间的人可以观战。

等到游戏结束,如果房间有空位了,访客点“刷新”,即可变成玩家,玩家位先到先得(晚了就还是访客噢)。

2. 我为什么要做《联机桌游合集》?

之前跟朋友聚会,但没带牌,很多桌游玩不了。

我去搜公众号、小程序,但大都充斥着广告,或只支持线上匹配,或交互复杂。

我们迫切需要——没广告的、支持朋友联机的、简洁的工具。

因为我自己懂一点点前端和后端,就做了些尝试。

上个月,我开了个公众号“线下聚会游戏”,用来发布这些“工具”,目前做了五子棋、斗地主、UNO。

但因为它是联机游戏,所以线上的朋友也可以玩。

3. 技术选型?为什么?

通信

毫无疑问,这是需要Client和Server频繁交互的场景。用HTTP轮询、长轮询都不合适,会浪费资源。

所以我选择了WebSocket作为通信协议。它跟HTTP一样也是基于TCP的,但差异在于,它Client和Server都可以主动发送数据,也随时可接收数据。

这样节约了带宽资源。
websocket

数据序列化协议

你可能会疑惑,这也需要决策?无脑JSON不就行了吗。

但我还真没用JSON。因为JSON是基于字符串去序列化,它的体积肯定会比基于二进制的序列化协议大一些。

因为涉及到频繁的数据交互,且我服务器网络带宽不高,我不想一个免费的游戏给我带来太多成本。所以最初的技术选型尤其重要(如果以后再改,是很难的)。

我期望有这样的协议:我定义好数据格式,比如五子棋游戏有2个字段,分别是“谁是黑棋”、“棋盘上棋子列表”。而我用第1位,0表示房主是黑,1表示房主是白。接下来8位,表示棋盘上有多少个棋子,假设为K,那么接下来K*8位,每8位就表示这K个棋子每个棋子的坐标。这样的数据序列化协议是最简短的。

但是我为什么要自己创造协议呢?这种东西,一定有现有的协议实现了!肯定不止我一个人想得到。

查了一下,还真有——Protocol Buffer。思路跟我心中的协议差不多,虽然空间比我心中的协议大了几位(可以忽略),但是扩展性比我心中的协议好很多。

所以,数据序列化协议,我选了Protocol Buffer。

这次技术选型,我又节约了带宽资源。
pb

数据更新方案

这种桌游,一定是数据驱动的。服务端存一份游戏数据,前端根据数据得到当前各个数据状态,根据数据状态渲染出游戏界面。

有2种数据更新方案:

优点缺点
方案一:每次游戏数据更新,服务端同步全量数据给前端可以有统一的版本控制若游戏数据大,每次传输成本高
方案二:每次游戏数据更新,服务端增量更新数据给前端每次传输成本低可并发的增量更新,需要保证每个操作是原子操作;不可并发的增量更新,需要做好版本控制

如果是你,你会选方案几?你猜我选了方案几?

你可能以为我会故技重施,为了节约带宽而选择方案二。

但是我选了方案一。为什么?

  1. 我的游戏是小游戏,只要保证总的游戏数据量足够小(甚至能够1个TCP包发完),那么你把100b压缩成20b其实是无意义的,他们可能只是21ms和20ms的差别。用户能感觉到21ms和20ms的差别吗?不能。
  2. 方案二增量更新确实诱人,尤其是针对《王者荣耀》这种实时性强、数据量大的游戏。但我是个小游戏,实时性没那么强。而增量更新带来的前后端开发成本,是更高的,远高于收益。

后台选型

这个其实只要支持websocket都可以。我用了自己擅长的python,用了ASGI协议,用了Daphne实现。

但是,python解析protobuf是有成本的,好在python可以用C++实现。

最好的技术选型,其实是直接用C++改Nginx源码,以Nginx模块的形式实现小游戏后端。

但是开发成本比较高,我为了快速实现、落地、验证想法,就用了自己熟悉的python。后期有时间的话,我会用Nginx模块开发的形式重构后端。

在这里插入图片描述

前端选型

既然已经是数据驱动了,那么React再适合不过。把游戏数据当作State,收到后台更新时,就setState,那么UI就会自动更新。

当然Vue也可以,只是我对React更熟悉。

用户认证方案

用户初次访问,我会在后台Nginx埋下随机数cookie,有效时间很长。之后都通过这个cookie来校验用户。

没cookie的,websocket会拒绝建立连接。

之后用户能断网重连,也是因为他的cookie没变。如果用户删了cookie,服务器就不认识他了。

监控方案

要做一个平台,你至少要知道实时在线人数吧?这样才能知道服务器负载如何,能提前去扩容。

我用了某云平台的日志工具做监控。通过后台写日志,通过统计日志,展示服务监控。看个pv uv还是没问题的。

4. 技术实现亮点

UNO是迄今为止,我做的复杂度最高的桌游,熟悉我的朋友知道,UNO是我花了7天时间做出来的。

为什么这么快?

大一统后端框架

首先,得益于大一统后端框架。所有游戏,他的后端其实是同一套,只是配置文件不同(例如可设置的最大人数、最小人数、游戏名称等等)。

相当于我把游戏开发复杂度全部转移到了前端,后端只负责数据中转。也就是说,其实每个人收到的数据,是同样的(如果你玩斗地主,你能解析数据,你会发现你知道了其他人的牌。只是这个解析成本挺高的,你需要知道二进制协议才行)

我这么做,也是为了提升开发效率。

当然,可能有人会做外挂,但是我不会做在线匹配功能,只希望提供给一群关系好的朋友去玩,朋友之间,你还开挂吗?(分分钟不跟你玩了hhh)

前端脚手架和组件库

你访问一下3款游戏,会发现,他们外表长得很像,只是换了个皮肤(色号)。

因为我做了一套游戏脚手架和组件库,把公共能力全部都抽成了组件,以后开发新游戏时,只需要写那个游戏独特的业务逻辑,其它东西,都被脚手架生成好了,组件库也拿来即用,所以开发效率特别高。这也是我能7天开发出UNO的真正原因。

其它特色

  • 服务端实现简洁,无数据库依赖,数据暂时都存于内存。
  • 服务端如果需要更新重启,游戏数据保留!
  • 有一套简单的DevOps体系,可帮助我快速开发、部署、上线。

5.写在最后

我是HullQin,公众号【线下聚会游戏】作者,除了本文说的《联机桌游合集》,我还开发了《Dice Crush》,参加了国际赛事Game Jam 2022。喜欢可以关注我噢~我会为大家制作更多好玩的小游戏,并分享做游戏的相关技术。

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

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

相关文章

【分享rmzt:三国杀猛将游戏主题】

三国杀猛将游戏主题 系统:Win2003,WinXP 大小:1.27 MB 主题简介: 《三国杀》是由北京一家桌游公司出版发行的一款热门桌上游戏,作为一款原创桌上游戏,与其他的桌面游戏最主要的分别即在于身份系统。该游戏融入里西方游…

颜值当道,画风为王——桌游美术风格漫谈

常言道:佛靠金装,人靠衣装。“外包装”大部分时候决定了给人的第一印象,也会让人产生一定的主观情绪。不仅人与佛如此,万物皆不能免俗。比如一款游戏,吸引人的因素有很多,可能是玩法,可能是故事…

一款难以忘怀的桌游

曾经称霸我们生活的桌游–三国杀 学号 16340047 [本人学院](http://sdcs.sysu.edu.cn/) 数据科学与计算机学院目录 曾经称霸我们生活的桌游三国杀目录 三国杀游戏介绍角色介绍游戏玩法游戏小技巧 1.三国杀游戏介绍 三国杀,五载岁月,精彩继续!游戏中&am…

2021年剧本杀专题研究报告

1. 从传统密室到剧本杀,线下实景娱乐形态持续迭代 1.1. 什么是剧本杀? 伴随着《明星大侦探》等推理综艺走红,近年以密室逃脱、剧本杀为代表的新兴线下娱乐方 式逐渐取代 KTV、传统桌游等成为最热门的线下游戏之一。根据艾瑞咨询&#xff0c…

我最喜欢的一款桌游

我最喜欢的一款桌游 学号:16340064 数据科学与计算机学院 目录 文章目录 [toc] #一名桌游爱好者的心声 我从初中开始接触桌游,玩了六年,算得上老司机了。一开始我只是和朋友打《UNO》1,后来天天去泡桌游吧,见识到各种各…

opencv的haarcascade_frontalface_default.xml等文件

文章目录 GitHub下载在安装好的OpenCV文件夹下寻找opencv-python中获取 GitHub下载 下载地址:https://github.com/opencv/opencv/tree/master/data/haarcascades 在安装好的OpenCV文件夹下寻找 路径如下: 你安装的opencv路径\OpenCV\opencv\build\et…

办公室局域网共享文件

小型公司对于共享文件夹的设置需求通常是要给每个部门创建一个文件夹,同时要有一个所有部门都可以使用的共享文件夹,以及一个管理员账号。下面我们将针对如上需求设置一个简单的共享文件夹。 一、选取一台公司电脑作为服务器 设置共享文件夹的前提是所…

局域网文件共享设置方法

步骤/方法 右击桌面网络----属性----更改高级共享设置 (注释:查看当前网络 比如:家庭网络、公共网络 等!) "我这里为公共网络" 选择 公共网络---选择以下选项:启动网络发现------启动文件和打印机共享-----启用共享以…

局域网,广域网,多文件上传下载工具

基于我们通信框架的一个demo。程序虽不完整,但已经具备了一些功能。 我们的通信框架采用c#开发,效果可能不是最高。采用TCP协议可能文件传输速度也不是最快。 udp还是很可靠的。就是自己要做很多东西。在局域网udp的特性体现不出来。但是在广域网内&a…

《计算机网络》虚拟局域网和高速以太网

局域网知识点笔记 一、虚拟局域网1、虚拟局域网的实现2、虚拟局域网使用的以太网帧格式 二、高速以太网1、100BASE-T 以太网2、吉比特以太网 一、虚拟局域网 利用以太网交换机可以很方便地实现虚拟局域网 VLAN (Virtual LAN)。虚拟局域网 VLAN 是由一些局域网网段构成的与物理位…

含泪整理最优质草坪灯光域网素材,你想要的这里都有

草坪灯光域网素材,我常用的爱给网这个网站就挺好的,免费下载,资源多,品质优,而且资源类型都很齐全,要是大家需要可以看一下,真的不骗人!一键打包下载,快捷方便! 在找寻资…

设置同时上内外网+文件共享

最近做了这样一个小项目,逻辑是这样的。 需要在某个办公人员的电脑上装个软件,从局域网中的另一台电脑中读取access数据库,然后用apn接入某个系统的内网传输数据。 同时还要保证这个工作人员能够正常的浏览因特网。 这就涉及到了两个内容。…

丢贴图!丢材质!永远无法预测出来的渲染剩余时间!如何告别这些悲催的经历?...

很多的CG制作人员并不太在意场景的规范,只是一味追求做出好的效果。常常出现工程文件用到的贴图、代理、材质、光域网等等素材未放到固定的位置,当效果调整好后,需要进行多机渲染时各种问题就频繁的暴露出来了,最常见的就是丢贴图…

区域网计算机高级共享文件

计算机共享文件的方法 1、 找到将要共享的文件夹,右击->属性,切换到共享面板 2、 在共享面板中,将共享按钮打开,选择everyone用户,点击添加,然后选择共享->确定 3、 在共享面板,选择…

为什么计算机玩不了三d游戏,3d打不开一直正在加载 游戏电脑问题解决分享!...

3d打不开一直正在加载是怎么回事?d打不开一直正在加载要怎么办?一起来看看下文。 其实这个问题是因为你在场景中打了光域网,这时会在max安装目录 解决这问题很简单,首先你先复制下DlComponentList这个文件名,然后删除这个文件,再…

良心安利吸顶灯ies光域网素材网站

想必大家都在为找吸顶灯ies光域网而头疼吧,今天小编都为大家整理好咯,上资源的吸顶灯ies光域网,大家喜欢的可以先行收藏哈,之后会持续更新哒~ 接下来就给大家介绍一下我珍藏已久的网站:爱给网,我的工作灵感…

按头安利 好看又实用的组合灯ies光域网素材看这里

前方干货满满,建议先收藏再看哦!为大家整理组合灯ies光域网素材,总有满足你需求的一款,除此之外,免费,资源质量好,一键打包下载,你还不心动吗? 在找寻资源的时候&#x…

UE4光源、体积雾、IES

光源 IES光域网文件 Lightmass 静态光照:等级范围数值越小,效果越好(锦上添花)00.3,,0.30.6,0.6~1 间接光照:反射数≤20 天空光照反射数:一般不用,越大越好 间接光…

最齐全的射灯ies光域网素材,速来收藏

前方干货满满,建议先收藏再看哦!为大家整理射灯ies光域网素材,总有满足你需求的一款,除此之外,免费,资源质量好,一键打包下载,你还不心动吗? 接下来就给大家介绍一下我珍…

html5输入框点击后消除高光,请问(VR渲染)光域网的灯光怎么把“高光”去掉?...

回答: 光域网是灯光的一种物理性质,确定光在空气中发散的方式,不同的灯,在在空气中的发散方式是不一样的,比如手电筒,它会发一个光束,还有一些壁灯,台灯,它们发出的光&am…