zoukankan      html  css  js  c++  java
  • 了解游戏编程与 AI

    噫语系列。。。

    闲话

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

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

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

    但是对于游戏,就不一样了。就算只是一个简单的多人文字游戏,也需要维持多个状态:

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

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

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

    总之,我发现游戏编程,和 Web 后端编程,需要的思想很不一样。

    游戏 AI

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

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

    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

    嗯。。随便写写。。

    参考

  • 相关阅读:
    解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xyfer.dao.UserDao.findById
    Oracle使用MyBatis中RowBounds实现分页查询
    普元EOS开发经验总结——不定期持续更新中
    Vue数据列表倒计时展示
    Java后端学习路线
    Linux下命令行安装WebLogic 10.3.6
    Oracle快速运行一指禅
    maven学习知识点汇总
    EOS下控制台以及图形界面打印sql语句
    Myeclipse使用过程配置汇总
  • 原文地址:https://www.cnblogs.com/kirito-c/p/10464868.html
Copyright © 2011-2022 走看看