MMORPG大型游戏设计与开发(服务器 AI 基础接口)
一个模块都往往需要统一的接口支持,特别是对于非常大型的模块,基础结构的统一性非常重要,它往往决定了其扩展对象的通用性。昨天说了AI的基本概述以及组成,作为与场景模块中核心一样重要的地位,基础部分的设计尽量的统一、详细、通用、精简。
游戏截图
基础接口(base)
1、管理方法
初始化(init)、释放(release)、获得NPC队伍指针(get npc team)、内部逻辑循环函数(activate)。
2、状态方法(ing)
休闲(idle)、闲逛(wander)、巡逻(patrol)、警戒(alert)、跟随(follow)、追击(pursuit)、保持距离(keep away)、逃跑(escape)、返回(return)、等待(wait)。
3、状态切换(do)
休闲(idle)、闲逛(wander)、巡逻(patrol)、警戒(alert)、跟随(follow)、追击(pursuit)、保持距离(keep away)、逃跑(escape)、返回(return)、等待(wait)。
4、事件
尝试移动(try move)、攻击(attacked)、威胁清除(clear threat)、寻路结果(path result)。
5、技能选择评估
初始化技能CD(init skill cd)、检查攻击目标(check attack target)、期望的目标(period target)、期望的自身(period self)、期望的友人(period firend)、被动响应(passive respond)、中途中断(channeling break)、目标数量(target count)、自身血量(self hp)。
6、工具函数
获得点的极坐标偏移点(get adjust point)、跟随(follow)、清除目标(clear target)、保存返回点(save return point)、闲逛(wander)、逃跑(escape)、寻路(patrol)、警戒(alert)、请求帮助(call help)、请求治疗(call heal)、转到战斗(turn to fight)、转到休闲(turn to idle)、检查事件(check event)、执行事件(fire event)、返回检查(check return)、请求治疗检查(check call heal)、闲逛范围检查(check wander range)、攻击检查(check attacked)、检查目标是否进入警戒范围(check is in alert range)、检查目标是否进入攻击范围(check is in attck range)、保持攻击范围(keep attck range)、保持闲逛范围(keep wander range)。
算法(近似迭代法)
1、牛顿迭代法
code.
#include <stdio.h>
#include <inttypes.h>
#include <math.h> /**
* 牛顿迭代法
* 该方法是用于求方程或方程组近似根的一种常用算法。
*/ #define EPS 1e-6 double f(double x);
double f1(double x);
int32_t newton(double *x, int32_t iteration); int32_t main(int32_t argc, char *argv[]) {
double x;
int32_t _x, iteration;
printf("please input init iteration value x0: ");
scanf("%d", &_x);
x = static_cast<double>(_x);
printf("please input max iteration count: ");
scanf("%d", &iteration);
if ( == newton(&x, iteration)) {
printf("the value nearby root is: %f\n", x);
} else {
printf("iteration failed!\n");
}
return ;
} double f(double x) {
return x * x * x * x - * x * x * x + 1.5 * x * x - 4.0;
} double f1(double x) {
return * x * x * x - * x * x + * x;
} int32_t newton(double *x, int32_t iteration) {
double x0, x1;
int32_t i;
x0 = *x; //初始方程的近似根
for (i = ; i < iteration; ++i) { //iteration 是迭代次数
if (0.0 == f1(x0)) { //如果倒数为0,则返回0(该方法失效)
printf("the process derivative is 0!\n");
return ;
}
x1 = x0 - f(x0) / f1(x0); //开始牛顿迭代计算
if (fabs(x1 - x0) < EPS || fabs(f(x1)) < EPS) { //达到结束条件
*x = x1; //返回结果
return ;
} else { //没有达到结束条件,准备下一次迭代
x0 = x1;
}
}
printf("more than iteration count\n");
return ;
}
result.
2、求定积分
code.
#include <stdio.h>
#include <inttypes.h>
#include <math.h> /**
* 求定积分
* 利用梯田法求定积分,需注意以下3个方面的工作:
* 1 确定迭代变量。
* 2 建立迭代关系。
* 3 对迭代过程进行控制。
*/ #define N 100 double f(double x);
double integral(double a, double b, int32_t n); int32_t main(int32_t argc, char *argv[]) {
double a, b, value;
int32_t _a, _b;
printf("please input definite integral max and min value: ");
scanf("%d,%d", &_a, &_b);
a = static_cast<double>(_a);
b = static_cast<double>(_b);
value = integral(a, b, N);
printf("sin(x) in range[%d,%d] definite integral is: %f\n", _a, _b, value);
return ;
} double f(double x) {
return sin(x);
} double integral(double a, double b, int32_t n) {
double s, h;
int32_t i;
h = (b - a) / n;
s = 0.5 * h * (f(a) + f(b));
for (i = ; i < n; ++i)
s = s + f(a + i * h) * h;
return s;
}
result.
MMORPG大型游戏设计与开发(服务器 AI 基础接口)的更多相关文章
- MMORPG大型游戏设计与开发(服务器 AI 概述)
游戏世界中我们拥有许多对象,常见的就是角色自身以及怪物和NPC,我们可以见到怪物和NPC拥有许多的行为,比如说怪物常常见到敌对的玩家就会攻击一样,又如一些NPC来游戏世界中走来走去,又有些怪物和NPC ...
- MMORPG大型游戏设计与开发(服务器 AI 控制器)
上一篇我们说了基础接口的组成,想必大家对AI中的基础方法有了一定的了解,而基础接口只能一个通用的,要实现不同的类别还需子类中实现,这就形成了玩家.主动.被动.木桩这些类型.不同类型的AI需要有一个统一 ...
- MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)
核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识.之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进 ...
- MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)
我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...
- MMORPG大型游戏设计与开发(概述)updated
1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...
- MMORPG大型游戏设计与开发(UI SYSTEM SHOW)
接下来一段时间,这些文件可能不再更新,期间我会学习和掌握一些前端知识.虽然我非常欣赏剑侠网络版叁和九阴真经的画面,但是那是一个庞大的游戏引擎,一般人是无法窥伺的,除非你是天才而且要拥有机器毫无中断的毅 ...
- MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)
脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...
- MMORPG大型游戏设计与开发(客户端架构 part15 of vegine)
一个接口需要统一的派生接口,这样做的好处在于能够统一的进行管理.我所知的脚本语言中,接口有多重接口,也还有所谓的虚基类,这些都是方便类的管理.在vengine(微引擎)中,统一的的接口管理为kerne ...
- MMORPG大型游戏设计与开发(服务器 AI 事件)
AI中的事件与场景中的事件大致相同,都是由特定的条件触发的.只不过AI的事件与其他事件不同的是,对于AI的事件往往是根据不同的AI类型,和动态的触发条件下才产生的.其实不管AI多么智能,它对应的触发条 ...
随机推荐
- C#基础-文件夹复制与删除
代码来源:http://blog.163.com/u_tommy_520/blog/static/20406104420147493933662/ 最近做MVC网站时刚好用到,用以提供一个完整的文件夹 ...
- Xml的简单介绍和Xml格式
XML 被设计用来结构化.存储以及传输信息.HTML 被设计用来显示数据. 1.XML是什么? 1)XML 指可扩展标记语言(EXtensible Markup Language) 2)XML 是一种 ...
- jsp页面显示问题
一.在jsp页面的表格中,如果有表格中的某一个元素 内容太长,需要截取显示,方法如下: <%@ taglib prefix="fn" uri="http://jav ...
- 2016 ICPC大连站---F题 Detachment
题意:输入一个x,将x拆分成一些小的数(这些数不能相同,即x=a1+a2+...... ai!=aj when i!=j),然后这些数相乘得到一个成积(s=a1*a2*......),求最大的乘积 ...
- MySQL中优化sql语句查询常用的30种方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使 ...
- Verilog HDL模型的不同抽象级别
所谓不同的抽象类别,实际上是指同一个物理电路,可以在不同层次上用Verilog语言来描述.如果只从行为功能的角度来描述某一电路模块,就称作行为模块.如果从电路结构的角度来描述该电路模块,就称作结构模块 ...
- 对于SSH框架的选择
选择框架:SSH 对于Web开发来说,SSH框架可以提高开发效率,还可以方便需求的变更以及对后期维护方面更容易操作.SSH也是目前稍微流行的Web开发框架. 选择框架描述: 首先说明一下SSH并不是一 ...
- jQuery带tab切换搜索框样式代码
效果体验:http://hovertree.com/texiao/jquery/23/ 代码如下,保存到HTML文件也可以查看效果: <!DOCTYPE html> <html la ...
- 【requireJS源码学习03】细究requireJS的加载流程
前言 这个星期折腾了一周,中间没有什么时间学习,周末又干了些其它事情,这个时候正好有时间,我们一起来继续学习requireJS吧 还是那句话,小钗觉得requireJS本身还是有点难度的,估计完全吸收 ...
- placeholder不兼容 IE10 以下版本的解决方法
对于密码输入框placeholder的兼容问题:HTML代码:<input type="password" id="loginPassword" plac ...