了解游戏编程与 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
嗯。。随便写写。。
参考
了解游戏编程与 AI的更多相关文章
- C++游戏编程(一开篇)
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云 邮箱: h ...
- c++游戏编程书籍
如果要自学游戏程序开发的话,可以看看下面的,呵呵. 游戏开发资料(PDF书都是中文版的,非英文,很多是本人自己扫描制作,从未网上发布过,所以独家啦): 1.Gamebryo 2.2游戏引擎(盛大.腾 ...
- PC游戏编程(入门篇)(前言写的很不错)
PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...
- 【Visual C++】游戏编程学习笔记之九:回合制游戏demo(剑侠客VS巡游天神)
本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder 微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...
- Python菜鸟快乐游戏编程_pygame(6)
Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...
- Python菜鸟快乐游戏编程_pygame(1)
Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...
- 游戏编程模式 Game Programming Patterns (Robert Nystrom 著)
第1篇 概述 第1章 架构,性能和游戏 (已看) 第2篇 再探设计模式 第2章 命令模式 (已看) 第3章 享元模式 (已看) 第4章 观察者模式 (已看) 第5章 原型模式 (已看) 第6章 单例模 ...
- 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...
- AI:从游戏引擎--到AI
原文链接:http://blog.csdn.net/left_la/article/details/6358911#t9 这是我在Gameres上看到的一篇文章,文章很长,全文分为11个部分,看后感觉 ...
随机推荐
- sudo cd的错误
问题说明 今天用MySQL建了库,想看看. 当到了这步,心里的第一个感觉就是电脑坏了.后来查了查才知道了原因. 原因 cd不是一个应用程序而是Linux内建的命令,而sudo仅仅只对应用程序起作用. ...
- 8.Element-ui日期组件上传到后台日期少一天解决办法
<el-date-picker type="date" value-format="yyyy-MM-dd" placeholder="转出日期& ...
- Java入门(一)
一.语言分类 机器语言 汇编语言 高级语言 二.Java分类 JavaSE 标准版,主要针对桌面应用 JavaEE 企业版,主要针对服务器端的应用 JavaME 微型版,主要针对消费性电子产品的应用 ...
- C++指针数组,二级指针和函数指针的练习
1.编一程序,将字符串“Hello,C++!”赋给一个字符数组, 然后从第一个字母开始间隔地输出该串(请用指针完成). 代码如下 #include<iostream> #include&l ...
- 全局变量重复定义,fatal error LNK1169: 找到一个或多个多重定义的符号
1.在GlobeValue.h中定义了一个变量: char gl_UID[256]; 2.在b.cpp和e.cpp中分别引用GlobeValue.h,并且使用gl_UID的全局变量, 结果出现:fat ...
- springboot properties文件中的数据通过@Value()形式注入
首先在resources目录下新建一个properties文件,如下图 在photoPath.properties中写入内容,key=value的形式,如下图 在你需要引用properties的类头部 ...
- CentOS7 minimal 没有netstat命令
在CentOS 7 minimal中使用netstat 时,发现显示如下,明显没有了netstat 命令 [root@localhost ~]# netstat -a -bash: netstat: ...
- JS如何给ul下的所有li绑定点击事件,点击使其弹出下标和内容
这是一个非常常见的面试题,出题方式多样,但考察点相同,下面我们来看看这几种方法:方法一: var itemli = document.getElementsByTagName("li&quo ...
- 吐血分享:QQ群霸屏技术教程2017(问题篇)
霸屏技术,问题篇后,暂时搁置,尔望后续. 这里针对操作中,经常遇到的问题,做个简单整理. 回忆下,排名流程. 1.建群,品牌产品群,做任何关键词都是品牌产品群,皆因其有独特的优势. 2.拉人,填充群人 ...
- (数据科学学习手札06)Python在数据框操作上的总结(初级篇)
数据框(Dataframe)作为一种十分标准的数据结构,是数据分析中最常用的数据结构,在Python和R中各有对数据框的不同定义和操作. Python 本文涉及Python数据框,为了更好的视觉效果, ...