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 = ;
- int32_t &n = length;
- circle_count = (n + ) / ;
- for (k = ; k < circle_count; ++k) {
- for (i = k; i < n - k; ++i) array[i][k] = value++; //left
- for (j = k + ; j < n - k; ++j) array[n - k - ][j] = value++; //bottom
- for (i = n - k - ; i >= k; --i) array[i][n - k - ] = value++; //right
- for (j = n - k - ; 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 = ; i < length; ++i) {
- for (j = ; j < length; ++j) printf("%4d", array[i][j]);
- printf("\n");
- }
- };
- int32_t main(int32_t argc, char *argv[]) {
- int32_t n = ;
- int32_t array[ARRAY_MAX][ARRAY_MAX];
- while (n <= || 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 ;
- }
result.
成员招募(长期有效)
如果你也对开源知识比较感兴趣,如果也对网络应用或者网络游戏感兴趣,如果你也对该框架感兴趣,你可以加入我们的QQ群(348477824)。
欢迎大家进群相互交流学习,同时也欢迎各位朋友对该框架供出自己的一份心力。
plain framework 商业版核心成员招募
请加入上面的框架QQ群,商业版核心成员的招募资格和形式将以博客或者文档等的形式公布(14年内确认人选)。
MMORPG大型游戏设计与开发(服务器 AI 逻辑设定和状态结点)的更多相关文章
- MMORPG大型游戏设计与开发(服务器 AI 概述)
游戏世界中我们拥有许多对象,常见的就是角色自身以及怪物和NPC,我们可以见到怪物和NPC拥有许多的行为,比如说怪物常常见到敌对的玩家就会攻击一样,又如一些NPC来游戏世界中走来走去,又有些怪物和NPC ...
- MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)
核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识.之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进 ...
- MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)
我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...
- MMORPG大型游戏设计与开发(概述)updated
1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...
- MMORPG大型游戏设计与开发(UI SYSTEM SHOW)
接下来一段时间,这些文件可能不再更新,期间我会学习和掌握一些前端知识.虽然我非常欣赏剑侠网络版叁和九阴真经的画面,但是那是一个庞大的游戏引擎,一般人是无法窥伺的,除非你是天才而且要拥有机器毫无中断的毅 ...
- MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)
脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...
- MMORPG大型游戏设计与开发(服务器 AI 基础接口)
一个模块都往往需要统一的接口支持,特别是对于非常大型的模块,基础结构的统一性非常重要,它往往决定了其扩展对象的通用性.昨天说了AI的基本概述以及组成,作为与场景模块中核心一样重要的地位,基础部分的设计 ...
- MMORPG大型游戏设计与开发(服务器 AI 事件)
AI中的事件与场景中的事件大致相同,都是由特定的条件触发的.只不过AI的事件与其他事件不同的是,对于AI的事件往往是根据不同的AI类型,和动态的触发条件下才产生的.其实不管AI多么智能,它对应的触发条 ...
- MMORPG大型游戏设计与开发(服务器 AI 控制器)
上一篇我们说了基础接口的组成,想必大家对AI中的基础方法有了一定的了解,而基础接口只能一个通用的,要实现不同的类别还需子类中实现,这就形成了玩家.主动.被动.木桩这些类型.不同类型的AI需要有一个统一 ...
随机推荐
- Python:认识模块
一.了解 Python 模块: -- 什么是函数: 函数是实现一项或多项功能的一段程序 模块是实现一类功能的程序块,是包含函数和其他语句的脚本文件,以".py"为后缀名 默认,C: ...
- [摘录]第三部分 IBM文化(1)
第二十章 论公司文化如果是在20世纪90年代初期,当一个人看见或者听到“IBM”时,他会联想到什么呢?或许是“大计算机”.“个人电脑”或者“ThinkPads”.但是,他们同时也必然会想到“大公司”. ...
- FFmpeg学习4:音频格式转换
前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...
- scikit-learn一般实例之八:多标签分类
本例模拟一个多标签文档分类问题.数据集基于下面的处理随机生成: 选取标签的数目:泊松(n~Poisson,n_labels) n次,选取类别C:多项式(c~Multinomial,theta) 选取文 ...
- C# WinForm使用乐器数字接口
继续,前面已经实现了C#调用Windows API实现了弹出对话框功能.使用了User32.dll文件,主要代码如下: [DllImport("User32.dll")]publi ...
- tee(打印并保存文件)
tee从标准设备读取数据,输出到标准输出设备,同时保存成文件-a 附加到既有文件后面,而非覆盖他.例如: pwd | tee who.out
- HTML5 数据集属性dataset
有时候在HTML元素上绑定一些额外信息,特别是JS选取操作这些元素时特别有帮助.通常我们会使用getAttribute()和setAttribute()来读和写非标题属性的值.但为此付出的代价是文档将 ...
- axis2+struts拦截地址冲突问题
axis2和struts在整合过程中,struts会把axis的地址也拦截了,默认当成一个action处理, 会因为找不到action而报错: <!-- struts配置 --> < ...
- gitignore 规范
gitignore 应该包含 5 块内容: 当前项目需要忽略的文件 项目性质需要忽略的文件(比如是 nodejs 项目,有些文件就需要忽略) 所有项目都需要忽略的文件(比如日志.临时文件) 操作系统需 ...
- SQLServer2005+获取表结构信息
SELECT d.name TableName, a.colorder FieldNo,a.name FieldName, (case when COLUMNPROPERTY( a.id,a.name ...