了解游戏编程与 AI

噫语系列。。。html

闲话

最近在重写个人一个 QQ 群机器人项目,并尝试将它改为更通用的结构,以方便在将来加入对 Wechat 和 Telegram 的支持。数据库

在查资料的过程当中,发现不少人认为一个群内多人游戏,很差写。
仔细想一想,这个东西难不难写,不在群 robot 自己,而在多人游戏这个词上。编程

而后就专门了解了一下这个。游戏编程,和一般的 Web 后端差异很大。
Web 后端不少操做都是无状态的,操做基本都直接和数据库关联。
而通用的 session、验证码等东西,基本都有现成的库可用,并且这些东西只有两个状态,根本不须要去作复杂的设计。后端

可是对于游戏,就不同了。就算只是一个简单的多人文字游戏,也须要维持多个状态:网络

  1. 须要先收到 /start,才能开始游戏。状态是游戏中。
  2. 参与游戏的用户,每一个人都须要一个状态。游戏进行时,每一个人的状态都会不断发生迁移。
  3. 须要一个全局的状态:谁是胜利者,或者别的什么。
  4. 群聊机器人通常都会服务多个群,每一个群的全局状态须要分开。
  5. 何时游戏结束?

显然游戏编程,须要维护各类状态。状态和行为是核心。根据用户发出的命令,程序须要按状况更改整个游戏中的各类状态。session

按个人想法的话,我须要一个游戏池来存放正在进行的游戏,用群id 来区分各群的游戏。而后每一个游戏就会有一个对象来存放各类状态,全局的和各用户的都放在里边。
一个游戏,就是一个群会话(GameSession),也应该有过时时间。学习

总之,我发现游戏编程,和 Web 后端编程,须要的思想很不同。人工智能

游戏 AI

就想到之前的街机游戏,AI 是不可缺乏的一部分:魂斗罗、拳皇、坦克大战、超级马里奥、忍者神龟……这些游戏的 AI 都算是游戏的核心了。设计

对的,我又了解了一下游戏 AI:htm

  1. 经典的实现方式是有限状态机(Finite State Machine),适用于简单的 AI。其实就是定义一些状态,而后用 switch 在状态间切换。。
    • 状态机是一种“事件触发型”AI,就是只有事件的触发才会发生引发状态的变化。
    • 过年在家下了个游戏:《异常》,那个差很少就是 FSM.
  2. 对状态比较多的状况,FSM 代码可能会变得很复杂,难以维护。解决方法有分层有限状态机(Heirarchical Finite State Machine)
    • 也就是将状态分类,抽离出来,将同类型的状态作为一个状态机,而后再作一个大的状态机,来维护这些子状态机。
    • 这样在外部咱们只须要关心大状态的切换,在内部咱们只须要关注小状态之间的切换。(而对 FSM,咱们须要考虑全部状态机之间的切换。。)
  3. 状态机代码难以复用,并且逻辑的更改可能须要修改大量代码。为了复用,能够改用行为树(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

嗯。。随便写写。。

参考

相关文章
相关标签/搜索