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

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

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

游戏截图

逻辑设定(logic)

  1、内部接口

    创建(setup)

      逻辑设定初始化,初始化对应的类型,根据传入的脚本ID中的创建方法。

    获得动作(get action)

      根据动作的ID查找对应的动作指针,注意这里的动作列表是逻辑设定对象中的数据。

    获得状态(get state)

      根据状态查找对象状态表中对应的状态数据指针。

    获得初始化状态(get init state)

      获得初始化设置的状态。

    获得脚本ID(get script id)

      获得当前的脚本ID。

    调用动作(call action)

      根据角色的对象指针,以及动作处理,调用脚本相应的方法,并返回下一个动作。

  2、lua接口

    创建动作(new action)

      在lua中传入两个参数:动作ID和动作的键(回调),根据这两个参数将动作加入到管理器中。

    增加状态(new state)

      从lua中传入一个状态,并加入到状态表中。

    设置初始化状态(set init state)

      脚本中传入一个状态,并将该状态设置为初始状态。

    注册用户动作(register user action)

      两个参数:动作回调的key,动作回调的方法字符串,并将这两个数据加入到用户动作表中。

状态结点(state)

  1、内部接口

    获得事件回调(get event handler)

    输出状态信息(print state info)

  2、lua接口

    处理事件(handle event)

算法(矩阵算法)

  反螺旋矩阵

    code.

#include <stdio.h>#include <stdint.h>/** * 反螺旋矩阵 * 例如:5x5的反螺旋矩阵 * * -   0   1   2   3   4  ---- 作为列序号 *   ———————————————————— * 0 | 1   16  15  14  13 * 1 | 2   17  24  23  12 * 2 | 3   18  25  22  11 * 3 | 4   19  20  21  10 * 4 | 5   6   7   8   9 * | * | * 作为行序号 * * 根据行与列,可以将这样的矩阵视作array[5][5]的数组 * 首先我们要知道反螺旋的规则,就是从某一点开始以1开始逆时针方向依次增加1 * 其次我们都知道螺旋,分为一圈圈的,那么一个螺旋就有其圈数,与圆形不同的是矩阵 * 分为4个方向,分别为上、左、下、右(组成一圈的数据) * 再来从数据递增的方向分析序号的规则 * 左边:行号依次递增为1,列号不变 * 下边:列号依次递增为1,行号不变 * 右边:行号依次递减为1,列号不变 * 上边:列号依次递减为1,行号不变 * 如果定义行号为i,列号为j,圈数为k的话,那么这三个数据在每圈是不是都有相似的规则呢? * 首先我们需要确定圈数,其与矩阵的大小有关,即如果是NxN的矩阵的话,圈数m=(N + 1) / 2 * 有了圈数,我们才好确定我们需要几次循环来组成每圈的数据 * 我们将最外层的一圈的圈数设置为0,让其循环到最后一圈即k - 1为止 * 假设数据的变量为value,从1开始 * 数据从1开始从最外层一次加1,并依次从左、下、右、上形成圈的数据,到最后一层为止 * 左边的数据规律:行的序号从圈数k开始,依次累加1,列号等于圈数k  *                 for (i = k; i < n - k; ++i) array[i][k] = value++; * 下边的数据规律:列号从圈数k+1开始,循环到小于数据n - k为止,其行数为n - k - 1 *                 for (j = k + 1; j < n - k; ++j) array[n - k - 1][j] = value++; * 左边的数据规律:行号从n - k - 2开始,依次循环到不小于k为止,其列数为n - k - 1 *                 for (i = n - k - 2; i <= k; --i) array[i][n - k - 1] = value++; * 上边的数据规律:列号从n - k - 2开始,依次循环到k,其行数为k *                 for (j = n - k - 2; j > k; --j) array[k][j] = value++; */ #define ARRAY_MAX 100 //最大支持的矩阵数//生成矩阵void generate_array(int32_t array[ARRAY_MAX][ARRAY_MAX], int32_t length);//打印矩阵void display_array(int32_t array[ARRAY_MAX][ARRAY_MAX], int32_t length);void generate_array(int32_t array[ARRAY_MAX][ARRAY_MAX], int32_t length) {  int32_t i, j, k;  int32_t value, circle_count;  value = 1;  int32_t &n = length;  circle_count = (n + 1) / 2;  for (k = 0; k < circle_count; ++k) {    for (i = k; i < n - k; ++i) array[i][k] = value++; //left    for (j = k + 1; j < n - k; ++j) array[n - k - 1][j] = value++; //bottom    for (i = n - k - 2; i >= k; --i) array[i][n - k - 1] = value++; //right    for (j = n - k - 2; j > k; --j) array[k][j] = value++; //top  }}void display_array(int32_t array[ARRAY_MAX][ARRAY_MAX], int32_t length) {  int32_t i, j;  for (i = 0; i < length; ++i) {    for (j = 0; j < length; ++j) printf("%4d", array[i][j]);    printf("\n");  }};int32_t main(int32_t argc, char *argv[]) {  int32_t n = 0;  int32_t array[ARRAY_MAX][ARRAY_MAX];  while (n <= 0 || n > ARRAY_MAX) {    printf("please input a unsigned int number(less than 0 and not above %d): ",            ARRAY_MAX);    scanf("%d", &n);  }  generate_array(array, n);  printf("the anti spiral array is: \n");  display_array(array, n);  return 0;}

    result.

 成员招募(长期有效)

  如果你也对开源知识比较感兴趣,如果也对网络应用或者网络游戏感兴趣,如果你也对该框架感兴趣,你可以加入我们的QQ群(348477824)。

  欢迎大家进群相互交流学习,同时也欢迎各位朋友对该框架供出自己的一份心力。

plain framework 商业版核心成员招募

  请加入上面的框架QQ群,商业版核心成员的招募资格和形式将以博客或者文档等的形式公布(14年内确认人选)。

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