浅谈棋牌游戏的AI设计
正文之前:
2个多月发过一篇文章《经典老虎机数值模型简单讨论》,收到了很多朋友的回复,首先非常感谢大家的学术探讨,只是因为本人平时工作较忙,就不一一回复了。
在这篇文章开始之前,我想说明一下,我所写的所有文章所涉及的内容都为一些比较基础的内容,目的是想要给那些新入行不久的策划从业者一些个人的经验和总结,希望可以给大家提供到帮助。如果内容有表达不足的地方,还希望大家可以指正,多交流多沟通。
概述:
AI:人工智能(ArtificialIntelligence),在游戏行业中被广泛的运用,俗称“机器人”。我个人的理解是:在游戏中,计算机根据真实玩家的不同行为,做出已经设计好的对应反射逻辑。这个反射逻辑可能涉及到很多方面的体现:界面、行为、音效、数值等。
无论什么类型的游戏,可能多多少少都会和AI扯上关系,因此对于每个游戏设计者来说,在你正在忙于手头的游戏项目时,也必然会做到AI的设计工作,并且设计的目的也都是一致的:要控制程序在设计者的思路下正确反馈玩家的行为。刚好最近手头上面的一个项目正在处理这一块的设计(棋牌游戏),所以今天就简单总结一下我个人对AI的一些基础设计思路,提供给大家希望有所帮助。
AI框架:
在AI开始设计的第一件事,就是要构思好适用于游戏的一个基本机器人框架,因为对于不同的游戏,它们的系统、模块、结构都大相径庭,AI的基本结构也是有很大区别的,所以在设计AI之前最重要也是最基础的一件事,就是要充分了解自己的游戏系统对AI的具体需求,一切根据自己的实际情况来设计。
AI的设计最难的应该是RTS类的游戏,以《魔兽争霸》为例,理想状态下的人机对战AI应当是这样:
对阵种族
暗夜精灵
兽人
人类
不死亡灵
暗夜精灵
基础战术A1/B1
基础战术A2/B2
基础战术A3/B3
基础战术A4/B4
兽人
基础战术A5/B5
基础战术A6/B6
基础战术A7/B7
基础战术A8/B8
人类
基础战术A9/B9
基础战术A10/B10
基础战术A11/B11
基础战术A12/B12
不死亡灵
基础战术A13/B13
基础战术A14/B14
基础战术A15/B15
基础战术A16/B16
对阵战术
战术A
战术B
战术C
战术D
战术A
逻辑网1
逻辑网2
逻辑网3
逻辑网4
战术B
逻辑网5
逻辑网6
逻辑网7
逻辑网8
战术C
逻辑网9
逻辑网10
逻辑网11
逻辑网12
战术D
逻辑网13
逻辑网14
逻辑网15
逻辑网16
逻辑网
行为1
行为2
行为3
行为4
行为1
反射1
反射2
反射3
反射4
行为2
反射5
反射6
反射7
反射8
行为3
反射9
反射10
反射11
反射12
行为4
反射13
反射14
反射15
反射16
以上只是一个梗概式的大体示意,具体的情况比这复杂的多得多。因为每一种对行为的反射还要考虑到种种的其他因素:装备、等级、技能、地形、经济等等因素。暴雪是有能力去完成这样的AI的,但是可能由于开发成本和产品定位的原因,暴雪并没有这样去做,暴雪直接简单粗暴的使用了一套通用所有的AI逻辑(对应每一个种族),并且通过控制生产速度、经济效率来控制AI的不同难度。
上文的例子仅仅为抛砖引玉作用,相对于这些大体量的AI,棋牌类的AI逻辑就容易一些了。对于棋牌游戏而言,主要也可以分为大致的2个AI类型:
1.可以打配合的交集关系
2.不用打配合的平行关系
对于第一种,代表游戏为《斗地主》,需要桌上的几个玩家在处理出牌逻辑的时候,需要判断考虑合作伙伴的出牌思路,共同打败地主。
对于第二种,相对比较多一些,比如《德州扑克》《牛牛》《血战麻将》等,每个玩家在出牌的时候是一个相对独立的个体,只需要计算自己个人的胜负情况。
这两个不同的类型,AI的设计框架也是完全不相同的,在这里我想就第二种棋牌游戏简单介绍一下我个人的设计思路,如果有不足的地方还希望大家可以指正。
大体的框架结构如下图:
AI属性
AI性格
AI输赢
AI投放
AI出牌性格
AI配桌性格
AI互动性格
出入分控制
根据运营数据设计
AI性格
对AI要设计不同的几个性格类型,设计目的很简单:
1.增加AI的丰富程度
2.增加AI的仿真程度
AI的性格设计主要又包括3个方面:
出牌性格:
指的是AI在游戏过程中的打牌性格,这些设计与棋牌的玩法相关,参照的都是真实玩家在游戏过程中的不同出牌习惯。比如:有的玩家喜欢前期低调后期做大牌爆发,有的玩家喜欢快进快出,还有的玩家会出错牌等等。每一种出牌的性格类型,都对应一套程序的处理逻辑:即对应相同的一套手牌,会有多种不同的出牌方法和顺序。每种出牌的逻辑都会有一个对应的行为ID,体现在AI性格的配置表当中,由策划进行设计并配置填写。此部分也是相对而言难度较大的部分,需要程序员对游戏规则非常的了解,并且能够充分理解策划的需求,设计出AI打牌的优质代码逻辑。
配置内容简单格式如下:
AI的ID号
备注
出牌性格类型
aiid
mark
game_character
1
做大牌型
2
快攻型
3
犹豫型
4
新手型
上表只是总配置表的一个部分,单独列出说明。
在我的处理方式中,将具体的细节代码不做控制交给程序员处理,在配置表中仅仅简单通过一个“出牌性格类型”来表示对应的一套代码逻辑。如果想要更详细的配置内容,则可以再增加更多的控制字段,比如“出牌容错率”“出牌时间间隔”等等。
配桌性格:
这里的性格指的是AI模仿真实玩家,在游戏开始之前的配桌过程中,AI的进出房间的一系列行为表现的能够非常自然,这些行为根据游戏设计不同有所区别,大致如下:
lAI加入房间后的准备概率/时间
lAI取消准备的概率/时间
lAI离开房间的概率/时间
lAI上一局的输赢结果对本局准备的影响
可能有的游戏并没有设计“准备”功能,或者有的游戏还设计了其他功能例如“观战”“入座”等等,那么根据具体设计的每一个功能,都需要配置AI对应的行为以及数值。对于这些属性,AI模拟真实玩家的类型,也会有对应的一些类型,比如有的玩家比较急躁,加入房间后如果发现不能马上开始游戏,他会选择马上离开房间;有的玩家比较有耐心,加入房间后会选择慢慢等待,一直到游戏开始。AI类型设计的越多、越真实,则在配桌过程中,陪伴的玩家才会觉得够真实,不至于太假,游戏的体验也是完全不一样的。
对于AI的配桌性格数值,可以简单设计配置表结构如下:(只是简单示意作用,大家能够理解意思就好)
AI的ID号
备注
AI准备概率
AI准备时间
AI离开概率
AI离开时间
上局赢准备概率
上局输准备概率
aiid
mark
ready_pro
ready_time
leave_pro
leave_time
win_readypro
lose_readypro
1
标准型
0.5
2
5
0.3
2
6
0.7
0.5
2
急躁型
0.7
1
3
0.5
1
3
0.8
0.3
3
耐心型
0.8
2
5
0.2
2
6
0.8
0.7
4
犹豫型
0.6
3
8
0.3
3
8
0.7
0.7
如果有新的AI行为/功能设计,可以直接添加新的字段,通过数值量化的方式表现出不同的AI性格,并且通过不同的字段类型进行组合,搭配出无数种AI性格。比如在上表中的“犹豫型”的AI,那么他的特点就是“准备时间较长”,也就是平常我们游戏中经常会遇到的一些玩家,他们进入房间以后,很久才反应过来然后点击“准备”,在这里我们可以通过控制他的几个“时间”相关字段,来调节AI犹豫的程度。
互动性格:
AI的互动性格,主要体现在2个方面:
1.与其他桌内玩家的行为互动:
比如说在麻将游戏中,4人都坐满的情况下,3名玩家已经处于“准备”的状态,但是有一名玩家迟迟不进行“准备”,那么在这种情况下,根据这样的判定,我们让其中一个AI玩家取消准备,并且直接离开房间。那么这个AI执行“取消准备并离开”这个行为2,判定标准就是另一名真实玩家的“迟迟不准备”的行为1。这是一个反射,对于这样的反射逻辑,我们可以设计成简单的唯一映射关系,也可以设计成几率的多条逻辑反射,简单示意图如下:
唯一映射关系:
多条逻辑关系:
这种行为的互动依然可以通过配置表的方式实现功能,配置表的复杂程度、易用程度都取决于数值策划对功能的理解,对表格字段的设计。同样的功能,可能不同的策划设计出来的表格、字段完全不同,实际效果可能差距也会很大,所以在设计表格的时候需要反复推导逻辑,尽可能的用最少的字段实现最多的功能(当然只是最理想的状态了)。
对于单一的映射关系,简单的配置表格式结构可以如下:(表格可能不是最优的设计方案,如有大神好的建议,欢迎多多建议)
玩家行为类型ID
行为类型备注
行为触发时间
行为触发人数
触发AI的行为
AI行为备注
AI被触发的概率
player_behavior
behav_mark
time
num
ai_behavior
ai_behavmark
ai_behavpro
玩家不准备
4
4
1
AI离开
0.7
玩家离开
5
7
2
AI离开
0.7
长时间缺人
5
7
1
AI离开
0.6
玩家长时间不出牌
8
8
1
AI秒速出牌
0.8
上表中的数据仅仅作为示意用,所有具体的“概率”“时间”等参数的数值,一般都是根据个人的游戏体验和经验进行一个初始值的设定,然后在框架结构下进行大量的AI测试,得出一个实际的数据,因为很多AI的体验涉及到人的主观感受,因此这方面数值的得出很大程度上依赖于实际的游戏测试感受,并想办法将它量化。
在这里对上表中的随便一条数据做一些简单的解释:
l第一列字段标注的不同的玩家行为类型,每一个ID代表着一种行为(具体玩家会有什么样的行为,根据具体游戏场景而设计)
l第3、第4列的字段“time”“num”,表示对玩家的对应行为的触发限制字段。例如:对于玩家行为(玩家不准备),则可以设计的实际场景为“玩家在房间内长时间不进入准备状态,则AI不耐烦直接离开”。首先,我们通过“行为触发时间”和“行为触发人数”两个字段来进行触发限制,我们设计“玩家不准备”行为持续4秒,人数为1,也就表示“有1位玩家持续4秒不进行游戏准备”,那么满足这个条件时,触发对应的AI行为“离开”(ID),并且还有另外一个“概率”字段来控制AI的“离开”行为被触发的几率,设定为70%,整个过程可以概括为:
“如果有1位玩家持续4秒时间不进入准备状态,则某个AI会有70%概率触发离开的行为”
l对于表中的“行为触发时间”“行为触发人数”的触发限制条件,根据实际的设计需要还可以进行增减,当然了,越多的限制条件,也就对AI控制的精度越高,同样的带来的AI测试难度和工作量也就越大。这也是一个两难的选择,因此我们需要设计者在最开始设计时就要用最精简的字段来控制最多的功能,也就是尽量做到多用相同的字段来控制不同的玩家行为。
l上表可以被称为“AI单一行为反射逻辑表”,这个表格是可以整合在完整的AI表中的,文章单独将本部分提出来只是为了说明的需要。我们的设计原则是:表越少越好,字段越精简越好。
2.与其他桌内玩家的社交互动:
此部分的AI互动功能,与游戏的设计有关。在我当前的项目中,玩家在游戏桌内会有“快捷短语”“互相使用道具”的社交功能,因此要做到AI的高仿真度,则需要考虑到一些基础的社交功能与真实玩家进行简单互动。
如果只是想做到普通可以陪玩家打打牌的AI,并不想做出有互动功能的AI,那么这个部分完全可以不去设计。这种可以社交的AI在实际游戏场景中也并不多见,应该属于“锦上添花”的类型。
那么,我们想要的理想的懂得基本“社交”的AI是什么样的场景呢?来假设一下:
l游戏过程中,一个玩家长时间不出牌,AI会自动发送短语“快点儿啊,我等的花儿都谢了”
l一个真实玩家打出了一手好牌,AI会自动发送短语“你的牌打的也太好了”
l一个真实玩家发送短语“快点儿啊,我等的花儿都谢了”,AI会自动回复短语“知道了知道了,别催我”
等等等等,作为一个有“完美主义”倾向的游戏设计者,总归想将AI做的尽善尽美,所以需要制作一个基本的配置表来实现这些功能,并且这种社交类的行为反射,也同样有两种设计思路:
1.单一的映射关系:即玩家做出行为1,AI只反馈行为2
2.多条逻辑关系:即玩家做出行为1,AI可能反馈行为2,也可能反馈行为3,甚至还有可能反馈行为4或行为5,具体根据不同的触发限制条件共同作用决定。
具体的配置表设计,可直接参考上文中的表格设计,这里就不再重复叙述了。社交类的行为反射逻辑,基本不太会涉及数值方面的内容,只需要让AI的反应最大程度的配合真实场景的情况就好了,如果这种基本的社交逻辑理解不对,那么就会出现不协调的场景,比如说:玩家出牌的速度非常迅速,AI却发送短语“快点儿啊,我等的花儿都谢了”
AI输赢
其实AI的设计核心虽然是给玩家增加玩伴,提升游戏的驻留性,但是AI的底线还是需要严格进行控制的,那就是AI的输赢。
试想一下,如果设计不当,AI虽然模拟起来非常像真人,并且玩家也非常喜欢,但是AI却大面积的在游戏牌局中输分,玩家轻松地从AI手中赢取了大量的游戏币,这个结果相比是所有的设计者最不愿意看到的吧。因此,控制AI的输赢(或者说难度),也就是作为一条最低的“警戒线”,只有控制好这个基础,才可以保证游戏的基本盈利以及经济系统的基本稳定。
具体的AI输赢控制,要做到2点就好了:
1.玩家的游戏体验
2.游戏的出入分平衡
在处理这个问题上面,最基础也是最核心的就是“出入分公式”,每个游戏的公式设计也大体不同,因为篇幅有限,在本文中就不再次展开讨论了,感兴趣的朋友可以去参考下鄙人的上一篇文章。
AI投放
AI的投放,主要会综合考虑到几个方面的影响:
1.时间段:不同的时间段,玩家的流量不同,AI的投放数量也会对应有波动
2.区域:不同的区、服务器甚至游戏场地,AI投放的数量、质量也会有区别
本文就简单对第一点的一些设计进行个人的一些分享,第二点的设计情况较为复杂,就不展开详述了,如果以后有机会可能会单独写一篇文章进行详细的介绍。
要做到对不同时间段,投放不同数量的AI,核心逻辑很简单:玩家流量大的时间AI对应也要多,玩家流量小的时间AI对应会少。
虽然看似简单,但是这一块的设计会用到一些实际数据的分析,会有一定的工作量。下面简单步骤分享一下。首先,我们截取了一些没有代表性的日期(去除节假日、特殊活动日期)的运营流量数据,取样本30分(30天),对每日的每半个小时流量都做出了平均数值(因为腾讯云后台并没有统计每个小时的功能,因此我们按照最小单位30分钟),结果如下表:(数据量较大,下表只截取部分)
时间统计节点
流量
0:00:00
0:30:00
1:00:00
1:30:00
2:00:00
2:30:00
3:00:00
3:30:00
4:00:00
4:30:00
5:00:00
175
5:30:00
6:00:00
6:30:00
7:00:00
上表只是截取了部分,知己表数据包含了一整天24小时,总共48条数据。每一条数据都是30天的样本取值平均值。(此部分工作较为繁琐,需要大量使用excel复制粘贴功能)
因为我们想要统计的最小时间单位为1小时,因此使用公式将上表每相邻同一个小时的两条数据相加,得出24条数据(对应24小时的玩家流量),如下表:
24小时流量
265959
使用excel公式:例如,我们想让D2单元格显示的为00:30和01:00的两条数据之和,需要将B2\B3两个单元格求和,则公式为=SUM(OFFSET($B$2:$B$3,(ROW(D1)-1)*2,0,))
下面每行数据以此类推,得出24小时流量分布,绘制图标如下图:
大致得出了真实玩家的人数流量分布情况,我们要做的就是要让AI的投放情况与上图的图像趋势保持一致。
接下来要做的就是让AI投放数量(也可以使用其他的指标例如周期等),与每一条玩家流量数据成统一比例,这个比例值为可调,寻找一个合适的映射函数关系,通过一个可调参数的形式,将AI的投放于市场数据关联起来。具体的参数调节部分就不展开叙述了。
总结:
上文所写的全部内容,仅仅是本人的一些个人工作经验分享,希望对一些新入行的朋友们提供帮助,如果有叙述不当的地方还希望大家包涵。
AI的设计是一个庞大的逻辑关系网络,在完成了缜密的设计之后,伴随而来的是更为庞大的测试工作量,因为设计结构中的很多数值参数,需要结合实际的主观玩家体验进行调整,需要一次又一次的测试,保证玩家的用户体验。
AI的设计是一个坑,能不跳进去就尽量不要跳进去。但是一旦开始了AI的设计,那么就一定要有严谨的逻辑,精简的结构,和尽量能够重复利用的功能或者字段。
点击一下立即阅读近期热文冷兵器对抗竞技《刀锋铁骑》战斗模式全分析剧情、场景or元素动作游戏关卡设计关键在哪?超级马里奥run:最革新性的游戏玩法和最糟糕的收费方式......