噫语系列。。。

闲话

最近在重写我的一个 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

嗯。。随便写写。。

参考

了解游戏编程与 AI的更多相关文章

  1. C++游戏编程(一开篇)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云    邮箱: h ...

  2. c++游戏编程书籍

    如果要自学游戏程序开发的话,可以看看下面的,呵呵. 游戏开发资料(PDF书都是中文版的,非英文,很多是本人自己扫描制作,从未网上发布过,所以独家啦):  1.Gamebryo 2.2游戏引擎(盛大.腾 ...

  3. PC游戏编程(入门篇)(前言写的很不错)

    PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...

  4. 【Visual C++】游戏编程学习笔记之九:回合制游戏demo(剑侠客VS巡游天神)

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...

  5. Python菜鸟快乐游戏编程_pygame(6)

    Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...

  6. Python菜鸟快乐游戏编程_pygame(1)

    Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...

  7. 游戏编程模式 Game Programming Patterns (Robert Nystrom 著)

    第1篇 概述 第1章 架构,性能和游戏 (已看) 第2篇 再探设计模式 第2章 命令模式 (已看) 第3章 享元模式 (已看) 第4章 观察者模式 (已看) 第5章 原型模式 (已看) 第6章 单例模 ...

  8. 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)

    http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...

  9. AI:从游戏引擎--到AI

    原文链接:http://blog.csdn.net/left_la/article/details/6358911#t9 这是我在Gameres上看到的一篇文章,文章很长,全文分为11个部分,看后感觉 ...

随机推荐

  1. Introduction to CQRS

    原文链接:  http://www.codeproject.com/Articles/555855/Introduction-to-CQRS What is CQRS CQRS means Comma ...

  2. Linux学习——目录结构

    在Linux当中,一切皆为文件,包括目录也属于文件.FHS(Filesystem Hierarchy Standard)的出现对文件目录系统做出了统一规范. Linux的目录结构: / - 根 /bi ...

  3. Ajax全接触(1)

    Ajax全称:Asynchronous JavaScript and XML(异步的JavaScript和XML) .Ajax不是某种编程语言 是一种在无需重新加载整个网页的情况之下能够更新部分网页的 ...

  4. 关于Echarts的原生js获取DOM元素与动态加载DOM元素的冲突问题

    1.前言: 最近在做的看板项目,因为需要循环加载后台数据,并且用Echarts做数据呈现,所以jQuery和angular等库统统靠边站,Echarts用的是原生js获取DOM元素,至于诸多不兼容等深 ...

  5. 7.Vue-Quill-Editor图片插入自定义

    Vue-Quill-Editor图片插入自定义 前言: 因为在项目中前端采用了Vue来实现,正好用到了富文本编辑器这一块,于是,经过技术上的选择,决定使用Vue-Quill-Editor. 使用的过程 ...

  6. Windows环境下的RTKPlot_Qt版本编译时遇到的问题和解决方法

    在使用了 RTKLIB开源包自带的 rtkplot.exe后,知道了它所具有的功能,就想着如何模仿它做出一个 demo.一开始看的是之前下载的 2.4.2版本的 RTKLIB,里面是使用 Delphi ...

  7. python核心编程2 第十二章 练习

    12–5. 使用 __import__().(a) 使用 __import__ 把一个模块导入到你的名称空间. 你最后使用了什么样的语法? (b) 和上边相同, 使用 __import__() 从指定 ...

  8. vue项目中缓存问题

    单页面应用总是存在缓存问题,特别是在微信端,更新页面之后访问的还是老页面,缓存的问题是因为用户访问的脚本地址并没有改变,浏览器就会读取原来的脚本 网上有几种解决办法,首先列举一下 1.加meta,禁止 ...

  9. Document .load与Document .ready的区别

    页面加载完成有两种事件 1.load是当页面所有资源全部加载完成后(包括DOM文档树,css文件,js文件,图片资源等),执行一个函数 问题:如果图片资源较多,加载时间较长,onload后等待执行的函 ...

  10. Java写Excel(不生成实体文件,写为流的形式)

    java 写 Excel(不生成实体文件,写为流的形式) public String exportReportExcel(String mediaCode, List<SimpleMediaRe ...