首页 > 代码库 > 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 逻辑设定和状态结点)