噫语系列。。。

闲话

最近在重写我的一个 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. c语言描述的二分插入排序法

    #include<stdio.h> #include<stdlib.h> //二分插入排序法 void BinsertSort(int a[],int n){ int low, ...

  2. Redis集群整合到springboot框架

    整合步骤 1 配置application.properties spring.redis.cluster.nodes=192.168.60.131:8000,192.168.60.131:8001,1 ...

  3. ios断点续传:NSURLSession和NSURLSessionDataTask实现

    苹果提供的NSURLSessionDownloadTask虽然能实现断点续传,但是有些情况是无法处理的,比如程序强制退出或没有调用 cancelByProducingResumeData取消方法,这时 ...

  4. Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现.

    Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现. 1.Block语法总结及示例如下:         //1.普通代码块方式bloc ...

  5. 浅谈箭头函数和setTimeout中的this

    箭头函数会改变this的指向,这个大家看文档都看到过,可是有没有具体理解呢?我发现自己应该可能大概是......emmmm,然后我整理了一遍,加强一下概念吧顺带再讲一下setTimeout这个函数改写 ...

  6. js关于if(''==0)

    在js当中,如下注意 if(''==0){ alert("空字符代表false"); } 空字符串代表false 0代表false false==false 结果就为true了

  7. web 打印功能

    在项目开发中有时候会碰到要求打印页面中的数据的功能需求.需求原因主要有两点吧,一是需要打印的数据只是页面的一部分即页面的区域打印,比如只需要打印页面中表格里面选中的数据等,二是需要打印出来的样式和页面 ...

  8. php第一节(入门语法、数据类型)

    <?php /** * 变量命名用 $ 符 * 变量名称的命名规范 * 1.变量名称以$标示 * 2.变量名称只能以字母和下划线开头 * 3.变量的名称只能包含字母.下划线.数字 * 4.变量名 ...

  9. 使用Python操作Office——EXCEL

    首先介绍下office win32 com接口,这个是MS为自动化提供的操作接口,比如我们打开一个EXCEL文档,就可以在里面编辑VB脚本,实现我们自己的效果.对于这种一本万利的买卖,Python怎么 ...

  10. cent os 上安装 matlab

    下载和安装可以参考,这个链接: https://lanseyujie.com/post/matlab-download-and-activate.html 上面这链接,在创建桌面快捷键时,未能创建,c ...