MMORPG大型游戏设计与开发(服务器 AI 控制器)

上一篇我们说了基础接口的组成,想必大家对AI中的基础方法有了一定的了解,而基础接口只能一个通用的,要实现不同的类别还需子类中实现,这就形成了玩家、主动、被动、木桩这些类型。不同类型的AI需要有一个统一的接口来调用与控制,这就是我们今天要进一步了解的AI控制器,试想一下一部机器如果没有控制器会怎样,一个人如果没有大脑又该怎样?这就能充分的体验控制器的重要性了。

游戏截图

控制器

1、初始化(init)

初始化控制器数据,主要是设置AI对象的类型。

2、释放(release)

卸载控制器,清理所有垃圾。

3、循环逻辑处理(activate)

一些需要循环处理的逻辑放到该方法内处理。

4、停止(stop)

停止控制器,即将控制器运行标识设置为false。

5、重新开始(restart)

重新开始控制器,会将一切动作重设。

6、控制器是否在运行(is running)

获取控制器是否在运行的标记。

7、设置AI类型(set ai type)

方法并没有名字上看的那么简单,不仅设置内部AI对象的类型,而且根据制定的AI类型来初始化AI对象指针。

8、获得AI类型(get ai type)

获得当前控制器的AI类型。

9、设置AI主状态(set main state)

根据状态类型来设置AI的主状态,并且做一些逻辑操作。

10、获得AI主状态(get main state)

获得当前AI的主状态。

11、设置原点(set origin point)

设置AI的原点,作为返回用。

12、获得原点(get origin point)

获得AI触发的原点。

13、设置AI参数(set ai param)

不同的AI配置基本上已经放在了模板列表中,只要传入需要设置的模板ID即可设置AI的参数。

14、获得AI事件下一帧(get ai event next frame)

获得AI事件下一帧,即下一个定时器。

15、获得AI对象指针(get ai)

获得内部的AI对象指针。

16、获得AI的状态(get ai state)

获得AI的当前状态。

17、获得AI参数指针(get ai template param)

获得AI参数对象指针。

18、其他(other)

状态切换、事件、属性、命令等与基础接口一致,其他需要的函数可以看情况增加。

算法(递归)

递归是一种分而治之、将复杂问题转换为简单问题的求解方法。

递归算法有以下优缺点:

优点:使用递归编写的程序简洁、结构清晰,程序的正确性很容易证明,不需要了解其具体的细节。

缺点:递归函数在调用过程中,每一层调用都需要保存临时变量和返回地址、传递参数,因此递归数的执行效率低。

1、求阶乘

code.

#include <stdio.h>
#include <inttypes.h>

/**
 * 递归是一种分而治之、将复杂问题转换为简单问题的求解方法。递归算法有以下优缺点:
 * 优点:使用递归编写的程序简洁、结构清晰,程序的正确性很容易证明,不需要了解其具体的细节。
 * 缺点:递归函数在调用过程中,每一层调用都需要保存临时变量和返回地址、传递参数,因此递归
 *       函数的执行效率低。
 */ 

/**
 * 求阶乘
 */ 

int64_t fact(int32_t n);

int32_t main(int32_t argc, char *argv[]) {
  int32_t n;
  printf("please input a int number: ");
  scanf("%d", &n);
  printf("%d!=%d\n", n ,fact(n));
}

int64_t fact(int32_t n) {
  int32_t x;
  int64_t y;
  if (n < 0) { //小于0阶乘无意义
    printf("param error!\n");
    return -1;
  }
  if (0 == n) { //最后一次返回1
    return 1;
  } else {
    return n * fact(n - 1); //递归求n的阶乘
  }
}

result.

2、斐波那契数列的第N项

code.

#include <stdio.h>
#include <inttypes.h>

/**
 * 递归求斐波那契数列的n项
 */ 

int32_t fib(int32_t n);

int32_t main(int32_t argc, char *argv[]) {
  int32_t n;
  printf("please input the number: ");
  scanf("%d", &n);
  printf("the %d option value is: %d\n", n, fib(n));
  return 0;
}

int32_t fib(int32_t n) {
  if (0 == n) return 0;
  if (1 == n) return 1;
  if (n > 1) return fib(n - 1) + fib(n - 2);
}

result.

3、十进制转二进制

code.

#include <stdio.h>
#include <inttypes.h>

/**
 * 十进制转二进制
 */ 

void dect_tobin(int32_t number);

int32_t main(int32_t argc, char *argv[]) {
  int32_t n;
  printf("please input a int number: ");
  scanf("%d", &n);
  printf("the binary is: ");
  dect_tobin(n);
  printf("\n");
  return 0;
}

void dect_tobin(int32_t number) {
  if (0 == number) return;
  dect_tobin(number / 2);
  printf("%d", number % 2);
}

result.

4、最数组中的最大值

code.

#include <stdio.h>
#include <inttypes.h>

/**
 * 递归求数组中的最大值
 */ 

int32_t findmax(int32_t array[], int32_t n);
void displayarray(int32_t array[], int32_t length);

int32_t main(int32_t argc, char *argv[]) {
  int32_t array[] = {23, 56, 35, 67, 86, 28, 1, 27, 11};
  int32_t length, i;
  length = sizeof(array) / sizeof(array[0]);
  displayarray(array, length);
  printf("the max value in array is: %d\n", findmax(array, length));
  return 0;
}

int32_t findmax(int32_t array[], int32_t n) {
  int32_t m;
  if (n <= 1) return array[0];
  m = findmax(array, n - 1);
  return array[n - 1] >= m ? array[n - 1] : m;
}

void displayarray(int32_t array[], int32_t length) {
  int32_t i;
  for (i = 0; i < length; ++i)
    printf("%3d", array[i]);
  printf("\n");
}

result.

5、求两个数的最大公约数

code.

#include <stdio.h>
#include <inttypes.h>

/**
 * 求最大公约数
 */ 

int32_t gcd(int32_t m, int32_t n);

int32_t main(int32_t argc, char *argv[]) {
  int32_t m, n;
  printf("please input two int number: ");
  scanf("%d,%d", &m, &n);
  printf("the max common divisor is: %d\n", gcd(m, n));
  return 0;
}

int32_t gcd(int32_t m, int32_t n) {
  if (m > n) {
    return gcd(m - n, n);
  } else if (m < n) {
    return gcd(m, n - m);
  } else {
    return m;
  }
}

result.

时间: 2024-11-29 02:30:31

MMORPG大型游戏设计与开发(服务器 AI 控制器)的相关文章

MMORPG大型游戏设计与开发(UI SYSTEM SHOW)

接下来一段时间,这些文件可能不再更新,期间我会学习和掌握一些前端知识.虽然我非常欣赏剑侠网络版叁和九阴真经的画面,但是那是一个庞大的游戏引擎,一般人是无法窥伺的,除非你是天才而且要拥有机器毫无中断的毅力.我也很羡慕国外诸如刺客信条系列.古墓丽影系列,因为在画面和操作方面都做到了世界级水平,这也正是我想研究其实现原理的原因之一.况且那些大型游戏,在中端机器上运行的都比较流畅,也是我很想弄明白的.至于虚幻引擎,这是给那些大型公司,诸如腾讯拿去折腾的,个人根本用不起,那么只能选择开源了.UI我选择了C

MMORPG大型游戏设计与开发(服务器 AI 概述)

游戏世界中我们拥有许多对象,常见的就是角色自身以及怪物和NPC,我们可以见到怪物和NPC拥有许多的行为,比如说怪物常常见到敌对的玩家就会攻击一样,又如一些NPC来游戏世界中走来走去,又有些怪物和NPC有的时候还会发出一些奇怪的谈论.我们都知道物体是死的,没有生命的,程序其实就是一种物体,它本身是不会进行任何的操作的,比如场景中的角色我们不操作则傻站着一样.但是NPC和怪物似乎有自己的判断力,谁该打谁不该打,还会排队行走,这些不是有生命的才能实现的吗?这就是AI,全称为Actificial Int

MMORPG大型游戏设计与开发(服务器 AI 基础接口)

一个模块都往往需要统一的接口支持,特别是对于非常大型的模块,基础结构的统一性非常重要,它往往决定了其扩展对象的通用性.昨天说了AI的基本概述以及组成,作为与场景模块中核心一样重要的地位,基础部分的设计尽量的统一.详细.通用.精简. 游戏截图 基础接口(base) 1.管理方法 初始化(init).释放(release).获得NPC队伍指针(get npc team).内部逻辑循环函数(activate). 2.状态方法(ing) 休闲(idle).闲逛(wander).巡逻(partol).警戒

MMORPG大型游戏设计与开发(服务器 AI 事件)

AI中的事件与场景中的事件大致相同,都是由特定的条件触发的.只不过AI的事件与其他事件不同的是,对于AI的事件往往是根据不同的AI类型,和动态的触发条件下才产生的.其实不管AI多么智能,它对应的触发条件在游戏中其实并不是很多,不过触发的条件按照各种组合就形成表现类型不同的AI而已. 游戏截图 事件 1.条件(condition) 1 设置触发事件的条件(set condition) 设置可以触发该事件的条件,一般只是一个枚举标记. 2 检查触发事件的条件(check condition) 根据当

MMORPG大型游戏设计与开发(服务器 AI 逻辑设定和状态结点)

人工智能(AI)中往往都会有这么一个问题,那就是我要做什么?我该怎么做?我需要什么?所以这里所谓的智能就是赋予AI对象的判断力,以及它根据判断得到的相应反应.就好比,你去商店买东西,钱够别人才卖给你,不够不可能卖你,这里就会触发了两种结果,如果你要强买的话,那么店员就可能产生相应的措施了.其实这里的店员,就相当于我们所谓的人工智能,不过店员的反应和动作是根据他自身思考产生的,人工智能也有这个思考的过程,只不过比店员想的少很多.这个思考的过程,也就是逻辑设定与处理的过程,那么什么又是状态结点呢?

MMORPG大型游戏设计与开发(服务器 游戏场景 地图和区域)

地图的数据以及区域的信息是场景的重要组成部分,这些数据同时存在客户端和服务器,而且都是由编辑器生成的.那么保存的文件数据结构是怎样的?一张3D的场景地图又是怎样处理这些数据的?同时告诉大家这里同样只是讲的理论与设计,理论和设计往往都很空洞,但是却很灵活,需要靠每个人怎么运用. 一些图片 区域和格子 从上面的截图可以看出游戏场景其实是由格子来区分的,不管是矩形的格子还是其他形状的格子也好,一张地图不可能只有一个点(即多点组成一张地图).在3D场景中似乎格子的位置总伴随着高度信息,所以让人感觉有些迷

MMORPG大型游戏设计与开发(服务器 游戏场景 聊天管道和寻路器)

又快到双十一,又是不少同仁们出血的日子,首先希望大家玩的开心.我曾经想要仔细的剖析场景的的每个组件,就像这里的聊天管道与寻路器,但是仔细阅读别人代码的时候才发现元件虽小但是实现并不简单,因为有些东西还没有完全想明白我就暂时不说其具体的实现过程,但是我会保证这些文章在后面会不断更新,同时也希望对这方面有兴趣和经验的朋友们能够指正.聊天这个我们都知道,因为它几乎成了游戏或是生活中不可或缺的一部分,那么什么是寻路器?我想未必大家都知道什么是寻路器,不过我可以告诉大家的是你在游戏中自动寻路这个功能就是由

MMORPG大型游戏设计与开发(服务器 游戏场景 掉落与网络连接)

时间一点点的消逝,伴着自己空闲日子将要结束的时候我尽量的学习和分享场景和AI的知识给朋友们,不过很遗憾的是这些文章还有不足的地方,就是有的难点没有完全的分析到.掉落在游戏中必不可少的,同时网络连接也是网络游戏中的核心部分,那么这两个东西又怎么和场景关联起来的? 一张截图 掉落(管理器) 1.初始化(init) 根据地图的长宽初始化掉落点数据. 2.是否可掉落(is can drop) 传入坐标返回该点是否可以掉落. 3.设置掉落点(set drop position) 传入一个坐标,并将该点设置

MMORPG大型游戏设计与开发(服务器 游戏场景 多线程)

多线程在随着cpu发展应用的是越来越多,游戏场景因为其在服务器所占的数据量与逻辑复杂度的原因必须依赖于它.为什么场景要采用多线程?场景的线程是怎样的?场景的线程又是如何创建的?场景的线程又是怎样管理的?在这里同时对可以指正错误的朋友们说声谢谢,虽然是小错误,也希望大家能够勇于纠正这些错误. 游戏截图 采用理由 上面的两张截图分别在不同的场景,试想一下如果一个线程只能先处理其中一张图的数据,后果会怎么样? 单线程往往需要等待,就好像我们到银行窗口办理业务的时候,以前的时候很多网点只有一个窗口,所以