zoukankan      html  css  js  c++  java
  • 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("
    ");
      }
    };
    
    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: 
    ");
      display_array(array, n);
      return 0;
    }

        result.

     成员招募(长期有效)

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

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

    plain framework 商业版核心成员招募

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

  • 相关阅读:
    Linux下semaphore的使用 进程间互斥的一个好方法
    CURL编程:什么是NonASCII平台,如何取得页面的charset
    C++中的重载(Overload), 覆盖(Override)和隐藏(Hide)
    system调用虽然用了exec,但是fd, signal这些还是会保留父进程的,be careful
    addr2line,可以根据一个地址打印出对应的代码行
    POSIX Threads Programming 阅读笔记(来自劳伦斯利物浦实验室的文章)
    [Gammu]setlocale和bindtextdomain函数的用法
    常用编码
    用PL/SQL画直方图
    窗体的关闭
  • 原文地址:https://www.cnblogs.com/lianyue/p/4168379.html
Copyright © 2011-2022 走看看