卡牌游戏的后端代码是如何设计的?

2023-05-26 08:59:21 +08:00
 franklinre
像炉石传说这种游戏,各种战哄类,光环类卡牌,种类很多,组合很多,感觉有无限种组合。
例如:打出一张卡牌可以给全员+2 攻击力。
有些卡牌可以让这个效果触发两次,有些卡牌可以让这个效果*2 ,有些卡牌攻击力增长时会加血。。等等。随着游戏更新,还可以出现其他更多效果。
应该不是用 if else 写出来的吧。是怎么实现的呢?
4752 次点击
所在节点    问与答
34 条回复
franklinre
2023-05-26 10:17:51 +08:00
@sunny352787
感觉这个靠谱。就是想了解程序设计方面。
是一种效果就是 Excel 的一个字段,一张卡牌就是 Excel 的一条记录吧?
如果我有一个标签系统,其中某个标签的作用是给被这个标签标记的字段在某个时间发送短信。(相当于卡牌)
还有一个问卷系统,用户可以在某个字段标记标签,以实现标签内的功能。(相当于触发卡牌效果)
这种该怎么用 Excel+有限状态机实现呢?
pkoukk
2023-05-26 10:19:35 +08:00
对炉石的多年( BUG )观察
首先,有一个场地的概念,场地相当于一个 channel ,它会向所有上场的卡牌广播场地事件,卡牌根据自己的 event handler 做出处理。
事件类型有优先概念,例如大家都知道的亡语大于复生,同类型事件根据登场顺序触发。
每个版本都添加的新”特效“,应该就是一个新的事件类型,根据程序或者策划安排触发的顺序。
那么对应的,卡牌在登场的时候,会根据设定触发 channel 事件。
理论上,是不需要什么 if else 或者状态机的,就是一个事件流系统。
但是实际上,为了实现某些描述特别长的特效,或者连锁效果,肯定还是存在特殊处理的情况的
这种情况,往往在以后的版本更新某些新机制的时候,组合起来产生意外的效果( BUG )
但你要是硬去分析事件链,是讲得通的
所以炉石流行一句话,炉石传说没有 BUG ,这都是机制
AkashicRecords
2023-05-26 10:20:57 +08:00
可以看看这个: [教程资源] ygocore 卡片添加教程完整版 https://tieba.baidu.com/p/3184047731
ygocore 是开源的游戏王线上对战平台,可以自己编写卡牌并添加
sunny352787
2023-05-26 10:21:23 +08:00
@franklinre 不是靠谱,是我这十几年做的好多游戏都是这么做的...游戏的代码设计是比 CRUD 复杂点但也有限,状态机用的确实多一点,但大部分逻辑也都是各种继承查询啥的
SxqSachin
2023-05-26 10:22:19 +08:00
我目前的实践是:每个操作分为多个阶段,比方对于发起攻击这件事情,可以分为发起攻击->自身造成伤害前->对方受到伤害前->对方受到伤害后->自身造成伤害后->攻击结束等环节;打出卡牌也可以分为某张卡牌打出前(奥秘、陷阱类)->某张卡牌打出后(战吼)。游戏中的任意实体,都可以单独向每个环节中注册事件,注册的事件允许参与并调整每个阶段的数值或走向,每个环节中事件根据注册顺序来依次执行。
sunny352787
2023-05-26 10:23:24 +08:00
@franklinre 游戏的逻辑大部分都是在内存里处理,如果是传统的 Java 各种框架的话其实不太好写状态机,不过可以做一些变化比方说把状态信息存在 Redis 然后统一处理之类的
sunny352787
2023-05-26 10:26:10 +08:00
@franklinre 就你说的这个标签系统和问卷系统吧,我觉得你还是别在游戏这边找灵感,有现成的解决方案就不要把事情搞复杂了
Rexxar
2023-05-26 10:35:04 +08:00
这也不是卡牌类独有的吧,光环,buff ,战吼在各种游戏里都有叠加的
wyhooo
2023-05-26 10:39:13 +08:00
触发器+配置+状态机
fanxasy
2023-05-26 11:13:11 +08:00
THESDZ
2023-05-26 11:39:23 +08:00
1.生命周期
2.基于生命周期注册钩子函数,钩子运行使用命令模式(也可以是代理模式+适配器模式)
zhouyg
2023-05-26 15:54:04 +08:00
不知道 lz 有没有玩过游戏王,这个应该够复杂了,对应上面发的 ygopro
elonlo
2023-05-26 18:37:26 +08:00
这让我想起当年做 3D 卡牌游戏战斗的时光。。。各种 buff 叠加,shader 满天飞哈哈
dayeye2006199
2023-05-27 03:56:10 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/943060

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX