项目介绍
当前互联网应用很重要的一点就是内容建设,通过内容吸引用户。对我们来说就是成为吸引用户每天点开淘宝的动力。期望用户能够每天点开淘宝看看——我现在没事,那打开淘宝领取一下淘金币,去淘宝人生看看,打个斗地主,玩个麻将,看看淘宝乐园的小游戏等等。
笔者本次拿斗地主举例,其作为棋牌游戏面向人群广泛,即时满足性强,两分钟一局,通勤、食堂、洗手间等碎片时间来一局,此类互动类内容建设为淘宝在用户增长和用户使用时长方面带来了一定的收益。
相信每个人都知道斗地主的玩法和规则,这里就不花笔墨叙述了,淘宝斗地主目前有经典玩法、炸弹房、实物大奖赛、好友对战等游戏模式,也形成了任务中心、钻石一分兑、道具商城的运营体系。但是游戏要想持续吸引住玩家,必须要不断推陈出新。
因此在经典玩法基础上我们需要探索出的新的玩法,就像9月份爆火的《羊了个羊》游戏一样,诸如此类的解密闯关类,我们做了斗地主的残局玩法,你可以想象和象棋的残局一样,双方能够看到对方的手牌,并且其中玩家方的胜利路线是唯一的。玩家从复杂的敌我手牌中,面对永不出错的AI,在重重险阻中找到获胜的途径,获得战胜AI的成就感。残局作为承接斗地主部分玩家的双十一活动,为玩家尤其是高玩提供了新颖的游戏体验,后期作为外投的“钩子”,期望吸引到更多感兴趣的玩家,拉新并转化。
经典模式的斗地主分了以下几个阶段:
匹配->发牌->叫抢地主->加倍阶段->打牌阶段->结算
功能上分为几大模块:实时在线匹配,牌局推进与更新、托管与守护、消息的推拉结合。由于本文主要讲述的是残局,对于经典玩法是如何实现的就不展开了,主要想对比一下残局玩法和经典玩法的区别:
- 触发活动,获得当日牌局
根据运营策略,AB、人群、来源等判断是否触发活动,再请求当日牌局信息。牌局要求:玩家必有获胜机会,但是仅有一种出牌方式能获胜;要求生产的牌局一定要保证某一步是唯一解,既不能出现用户随便出都能赢AI,也不能出现无论怎么出都无法赢AI的牌局。
- 进入对局
进入对局后,只有玩家与AI对手两个角色,并且双方手牌都直接展示。 - 用户出牌
开局后直接进入出牌环节,玩家为先出的一方,对局过程中,玩家侧不设定倒计时,每一步没有超时时间,可无限等待下去。 - AI和用户轮流出牌
每当玩家出牌,AI方将有5S的倒计时出牌时间,AI的每次出牌会随机在1~5S间隔 - AI出牌策略
当玩家出牌并在“获胜”的路径上时,AI需要尽量确保后续的出牌也只有1种策略【AI不能认为要输了就摆烂】当玩家出牌并非“获胜”路径时,AI需要使用合理的牌序策略将玩家击败【只要玩家出错就必败】 - 有一方出完则进入结算
直到双方有一方将手牌打光,即为牌局结束,AI出完用户失败,反之则胜利。
当用户击败AI后,可以获得相应关卡的奖励(一般是斗地主的道具或豆子钻石),吸引用户在其他对局中使用,进而拉长用户的游戏时长
- 牌局保留逻辑
玩家的牌局缓存会保存一定时长,中途退出后,牌局不会被自动托管,现场被保存下来,用户当天再次挑战会从上次结束地方继续,除非用户手动点击重开或本局进入到结算。
- 牌局选取与更新原则
要求用户短时间(30天)内不能遇到重复的牌局;半夜十二点玩游戏用户很多,因此将每日关卡改到凌晨5点刷新
▐ 功能上的挑战
- 牌局自动生成:这种大量残局不可能由人工生产,需要训练生成,并且残局要求牌面实力相当,用户存在少量必赢路径(1~2条),尤其是大规模高质量残局生成难度大
- 用户请求当日关卡如何做到不重复,并且有一定容错能力
- 牌局信息存储的选型和可扩展设计,并尽量减少缓存占用
高度依赖稳定的AI出牌,尤其是较高的调用量要保证高可用高性能:a
.高准确率:准确率100%;当用户走必赢路径时能合理出牌;当用户走错时AI能100%反杀;b
.高性能:AI出牌低延迟;c.兜底能力:当AI不可用时,服务端要有兜底的能力,不能阻塞用户- 设计时考虑投放和AB测试能力,以及加入多种降级和紧急下线的开关与兜底工作
- 数据表的设计,数据分析能力,监控报警,数据看板以及可灰度、可观测、可回滚的能力等等
技术方案及思考
▐ 技术模块拆解
1、用户触发活动 2、获得今日关卡 3、用户和AI对局 4、结算和发奖
▐ 系统链路图
▐ 技术模块拆解
- 牌局数据存储
一般的存储方式:
-
单机内存、
分
布式数据库、
分布式缓存
由于牌局更新频繁,而且在线玩家越多,并发越大,对RT和性能就越敏感,而牌局的具体过程系统不需要详细记录下来,也不需要使用永久性的存储方式。综合考虑之后基于Redis的缓存是当前比较合适的方式。
残局场景涉及到两个缓存信息:一、十局牌局信息同时也作为触发标志存储包括挑战进度,十局残局对应的信息(gameId;用户手牌;AI手牌)二、用户当日正在挑战局的牌局信息
- 用户触发活动逻辑
用户在进入斗地主主页的时候,会去校验该用户是否能够触发活动,如果在触发活动范围内,会判断疲劳度决定是否出现活动弹窗,引导用户进入残局玩法。下面展示的是当用户进入首页时,校验触发逻辑: