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年内确认人选)。

posted @ 2014-12-16 23:29  恋月  阅读(1933)  评论(2编辑  收藏  举报