了解游戏编程与 AI
噫语系列。。。
闲话
最近在重写我的一个 QQ 群机器人项目,并尝试将它改成更通用的结构,以方便在未来加入对 Wechat 和 Telegram 的支持。
在查资料的过程中,发现很多人认为一个群内多人游戏,不好写。
仔细想想,这个东西难不难写,不在群 robot 本身,而在多人游戏这个词上。
然后就专门了解了一下这个。游戏编程,和通常的 Web 后端差别很大。
Web 后端很多操作都是无状态的,操作基本都直接和数据库关联。
而通用的 session、验证码等东西,基本都有现成的库可用,而且这些东西只有两个状态,根本不需要去做复杂的设计。
但是对于游戏,就不一样了。就算只是一个简单的多人文字游戏,也需要维持多个状态:
- 需要先收到 /start,才能开始游戏。状态是游戏中。
- 参与游戏的用户,每个人都需要一个状态。游戏进行时,每个人的状态都会不断发生迁移。
- 需要一个全局的状态:谁是胜利者,或者别的什么。
- 群聊机器人一般都会服务多个群,每个群的全局状态需要分开。
- 什么时候游戏结束?
显然游戏编程,需要维护各种状态。状态和行为是核心。根据用户发出的命令,程序需要按情况更改整个游戏中的各种状态。
按我的想法的话,我需要一个游戏池来存放正在进行的游戏,用群id 来区分各群的游戏。然后每个游戏就会有一个对象来存放各种状态,全局的和各用户的都放在里边。
一个游戏,就是一个群会话(GameSession),也应该有过期时间。
总之,我发现游戏编程,和 Web 后端编程,需要的思想很不一样。
游戏 AI
就想到以前的街机游戏,AI 是不可缺少的一部分:魂斗罗、拳皇、坦克大战、超级马里奥、忍者神龟……这些游戏的 AI 都算是游戏的核心了。
对的,我又了解了一下游戏 AI:
- 经典的实现方式是有限状态机(Finite State Machine),适用于简单的 AI。其实就是定义一些状态,然后用 switch 在状态间切换。。
- 状态机是一种“事件触发型”AI,就是只有事件的触发才会发生引起状态的变化。
- 过年在家下了个游戏:《异常》,那个差不多就是 FSM.
- 对状态比较多的情况,FSM 代码可能会变得很复杂,难以维护。解决方法有分层有限状态机(Heirarchical Finite State Machine)
- 也就是将状态分类,抽离出来,将同类型的状态做为一个状态机,然后再做一个大的状态机,来维护这些子状态机。
- 这样在外部我们只需要关心大状态的切换,在内部我们只需要关注小状态之间的切换。(而对 FSM,我们需要考虑所有状态机之间的切换。。)
- 状态机代码难以复用,而且逻辑的更改可能需要修改大量代码。为了复用,可以改用行为树(Behavior Tree)
- 它是一种“轮询式机制”。每次更新都会遍历树,判定逻辑是否成立,是否该继续往下执行。
真正的 AI
以上方法都是基于人工编写规则的 AI,并不是真正的智能。
要说到真正的 AI,之前最火的莫过于 DeepMind 的 AlphaGo 了。它使用 AI 技术,在围棋领域超越了人类的极限。
因为围棋的复杂度太高,AlphaGo 无法采用与当初征服国际象棋领域的【深蓝】一样的方法:生成所有可能的走法,然后执行尽可能深的搜索,并不断对局面进行评估,尝试找出最佳走法。
AlphaGo 使用蒙特卡洛树搜索(Monte Carlo tree search),借助估值网络(value network)与走棋网络(policy network)这两种深度神经网络,通过估值网络来评估大量选点,并通过走棋网络选择落点。AlphaGo 最初通过模仿人类玩家,尝试匹配职业棋手的过往棋局,其数据库中约含3000万步棋着。後來它达到了一定的熟练程度,它开始和自己对弈大量棋局,使用强化学习进一步改善它。
围棋无法仅通过寻找最佳棋步来解决:游戏一盘平均约有150步,每一步平均约有200种可选的下法,[66]这意味着有太多需要解决的可能性。
继 AlphaGo 之后,DeepMind 又进一步打算攻克另一道难关:星际争霸。这里的最大的难点是不完全信息, 其次是需要远期计划,另外就是实时性与多主体博弈。
不完全信息,就是说你无法看到视野之外的情况,那里可能有对方的军队在采矿, 或者大批小兵集结, 这可能与我此刻的决策关系很大, 但是却不为我所知。
这与围棋这样的游戏有着本质的区别, 因为围棋这样的游戏, 即使策略在复杂, 你方和我方的情况都是一目了然的。围棋游戏的复杂体现在策略空间的巨大导致的维度灾难, 然而始终都是你知我知的。
可以说 AI 正在通过游戏领域,一步步走向最终目标:通用的 AI.
1997 年深蓝战胜国际象棋冠军卡斯帕罗夫时,就曾引起 AI 恐慌。可是现在 20 多年过去了,我们发现 AI 的路还很长。
目前已有的所有 AI 系统,都是“专家系统”,只擅长某一个特定的领域,而且它学习到的东西也无法应用到别的地方。
The End
嗯。。随便写写。。