Seize the Day

游戏AI入门指南(Part 1)


原文: The Total Beginner’s Guide to Game AI 作者: Ben Sizer 译者: Anthony Han

这是一篇非常好的综述类文章,对当今的游戏AI常用技术和实现方法做了简单介绍,参考了近年来的 Game AI Pro 系列。虽然不及论文那样严谨,但全文条理清晰,通俗易懂。确实是一篇入门指南佳作。花了点业余时间翻译出来,为了分享,也希望能温故知新。

引言

本文将介绍游戏人工智能(或简称“游戏AI”)的入门概念,让读者了解使用哪些方法来处理AI问题,它们如何协同工作以及如何使用相应的语言或引擎来实现。

我们假设你具备电子游戏的基本知识,并掌握几何,三角函数等数学概念。大多数代码示例为伪代码,因此不需要特定的编程语言知识。

什么是游戏AI?

游戏AI主要关注实体根据当前条件所采取的行动。这就是传统人工智能文献所指的控制“智能代理”,代理通常是游戏中的角色,但也可以是车辆,机器人。或者更抽象的东西,例如一组实体,甚至一个国家或文明。智能代理需要在各种情况下观察周围环境,依此做出决策,并采取行动。这就是所谓的“感知/思考/行动(Sense/Think/Act)”循环:

  • 感知:代理侦测到或被告知环境中可能影响其行为的事物(例如:附近的威胁,要收集的物品,要调查的兴趣点)。
  • 思考:代理决定采取的应对措施(例如:考虑是否足够安全来收集物品,或者决定应该先集中精力战斗还是躲藏)。
  • 行动:代理将先前的决定付诸行动(例如:沿着通向敌人或物品等的路径移动)。由于代理做出了行动,形势已经改变,因此再次重复循环。

现实世界中的AI,特别是成为新闻热点的那些,通常主要关注循环中的“感知”部分。例如,自动驾驶汽车拍摄道路的图像,结合其他数据(例如雷达和光达),并分析所看到的状况。这个过程一般是通过机器学习来完成,机器学习尤其擅长这方面,获取大量现实世界中有噪声的数据(如汽车前方的道路照片或视频)并加以分析理解,提取诸如“前方20码处有一辆汽车”这类的语义信息。这些被称为“分类问题”。

Read more ⟶

Debian Redmine 备份与恢复


几年前装了 Debian 作为服务器,顺便把以前的 Bitnami Redmine (Windows) 迁移了过来。好多年过去也没再去干预,系统一直稳定运行,每周定时备份。最近因为考虑迁移这些工具到Docker上,重新整理一遍备份和恢复流程,以备不时之需。

系统需求

  1. Redmine 3.3 installed with apt on Debian 9 (stretch).
  2. Database: PostgreSQL

备份

配置文件

配置文件包含路径:/etc/redmine/{instance}

例如,默认实例名称为default,则配置文件路径为/etc/redmine/{default}。包含以下配置文件:

  • configuration.yml
  • database.xml
  • secret_key.txt
Read more ⟶

晶体管:献给赛博朋克的十四行诗


When I first saw you up on that stage back there. It was like… everyone loved you. Everyone except for them.

《晶体管》(Transistor) 是一款由《堡垒》(Bastion)开发商 Supergiant Games 所开发的科幻题材作品。游戏讲述了主角——云堤城 (Cloudbank) 歌星红伶 (Red),躲过卡梅拉塔组织 (The Camerata) 刺杀后,意外获得了一件名叫“晶体管” (Transistor) 的武器,并以此复仇的故事。

虽然《晶体管》被官方定义为 ARPG ,但确切地说,它更应该被称作为一款 TRPG (Tactical RPG)。类似 XCOM 或者 神界:原罪 (Divinity: Original Sin) 的战斗规则 但又有所不同。首先,在行动规划阶段没有移动的次序和限制,玩家可以移动多次,并且在发动技能前后都可以移动,行动规划如同施放“时间暂停”一般。其次,个别技能会影响敌人位置,如拉近/击飞等效果。而在行动规划期间,受到此类效果影响的敌人并不会实时改变其位置,因为是规划嘛,所以需要一定的预判,游戏中会给出相应的提示。

transistor

Read more ⟶

如何选择游戏AI架构


Conference: GDC 2010

Session Name: Deciding on an AI Architecture: Which Tool for the Job?

Speaker(s): Alex Champandard, Michael Dawe, Dave Mark, Steve Rabin, Charles Rich

Track / Format: AI Summit

Video: GDC Vault - Deciding on an AI Architecture: Which Tool for the Job?

“工欲善其事,必先利其器。”

—— 《论语·卫灵公》

AI 架构的选择是 AI 程序员需要解决的最重要问题之一。这个选择将为项目奠定基础,同时也决定了未来的方向。主要的 AI 架构都有自己的优缺点,很难确定哪一个架构最适合一个项目。

本次讨论将从独特的角度探讨这个问题。每一种主流架构都有一位代言人,他们将被提供假想的游戏例子,并被要求解释为什么他们支持的架构是最合适的选择,而其他的则不合适。通过不同架构的代言人就同一问题进行讨论和分析,可以更全面地评估每种架构的优劣,并对具体项目做出更合适的建议。

Read more ⟶

行为树入门工具包


偶然看到一个2012年 Alex Champandard 的演讲1,本想看看有什么可以借鉴,看到一半后,发现就是 Game AI Pro 的文章 《The Behavior Tree Starter Kit2》的演示版。结合代码3,对照着看一遍,有助于理解。

Motivation

行为树广泛应用于各个系统:角色,策略,小队,动画,镜头……

使用案例:

  • Rockstar Games: R.A.G.E.
  • Guerrilla Games:Killzone 2 & 3
  • Uncharted 2
  • Halo 3
  • NBA ‘09
  • Metro 2033
  • Crysis: Warhead
  • League of Legends

The Basics

v1:原型

一个基本的行为树实现:

enum Status
/**
 * Return values of and valid states for behaviors.
 */
{
    BH_INVALID,
    BH_SUCCESS,
    BH_FAILURE,
    BH_RUNNING,
    BH_ABORTED,
};

class Behavior
/**
 * Base class for actions, conditions and composites.
 */
{
public:
    virtual Status update()				= 0;

    virtual void onInitialize()			{}
    virtual void onTerminate(Status)	{}

    Behavior()
    :   m_eStatus(BH_INVALID)
    {
    }

    virtual ~Behavior()
    {
    }

    Status tick()
    {
        if (m_eStatus != BH_RUNNING)
        {
            onInitialize();
        }

        m_eStatus = update();

        if (m_eStatus != BH_RUNNING)
        {
            onTerminate(m_eStatus);
        }
        return m_eStatus;
    }

    void reset()
    {
        m_eStatus = BH_INVALID;
    }

    void abort()
    {
        onTerminate(BH_ABORTED);
        m_eStatus = BH_ABORTED;
    }

    bool isTerminated() const
    {
        return m_eStatus == BH_SUCCESS  ||  m_eStatus == BH_FAILURE;
    }

    bool isRunning() const
    {
        return m_eStatus == BH_RUNNING;
    }

    Status getStatus() const
    {
        return m_eStatus;
    }

private:
    Status m_eStatus;
};
Read more ⟶

基于TypeScript的PixiJS开发环境设置(webpack篇)


前几天写了一篇Browserify打包的 PixiJS 的开发环境配置流程,但是Web技术一日千里,开发工具也日新月异, Webpack 就是其中之一。本文介绍了以 TypeScript 作为开发语言, PixiJS 作为图形渲染引擎, Webpack 作为模块打包工具的开发环境的配置过程,遵循简化易用的原则,省略了一些非必要模块的安装。

安装

项目结构

  1. 创建项目目录
mkdir ts_pixi
cd ts_pixi
mkdir assets src dist
  1. 新建项目文件
touch index.html
touch src/main.ts
  1. 初始化项目
npm init

安装模块

  1. PixiJS
npm install --save-dev pixi.js
  1. TypeScript,如果使用Visual Studio Code作为IDE,可以安装相应@types文件,用于代码提示等功能。
npm install --save-dev typescript @types/pixi.js @types/node
  1. 其它
npm install --save-dev ts-loader webpack webpack-dev-server
Read more ⟶