MMORPG大型游戏设计与开发(服务器 AI 控制器)
上一篇我们说了基础接口的组成,想必大家对AI中的基础方法有了一定的了解,而基础接口只能一个通用的,要实现不同的类别还需子类中实现,这就形成了玩家、主动、被动、木桩这些类型。不同类型的AI需要有一个统一的接口来调用与控制,这就是我们今天要进一步了解的AI控制器,试想一下一部机器如果没有控制器会怎样,一个人如果没有大脑又该怎样?这就能充分的体验控制器的重要性了。
游戏截图
控制器
1、初始化(init)
初始化控制器数据,主要是设置AI对象的类型。
2、释放(release)
卸载控制器,清理所有垃圾。
3、循环逻辑处理(activate)
一些需要循环处理的逻辑放到该方法内处理。
4、停止(stop)
停止控制器,即将控制器运行标识设置为false。
5、重新开始(restart)
重新开始控制器,会将一切动作重设。
6、控制器是否在运行(is running)
获取控制器是否在运行的标记。
7、设置AI类型(set ai type)
方法并没有名字上看的那么简单,不仅设置内部AI对象的类型,而且根据制定的AI类型来初始化AI对象指针。
8、获得AI类型(get ai type)
获得当前控制器的AI类型。
9、设置AI主状态(set main state)
根据状态类型来设置AI的主状态,并且做一些逻辑操作。
10、获得AI主状态(get main state)
获得当前AI的主状态。
11、设置原点(set origin point)
设置AI的原点,作为返回用。
12、获得原点(get origin point)
获得AI触发的原点。
13、设置AI参数(set ai param)
不同的AI配置基本上已经放在了模板列表中,只要传入需要设置的模板ID即可设置AI的参数。
14、获得AI事件下一帧(get ai event next frame)
获得AI事件下一帧,即下一个定时器。
15、获得AI对象指针(get ai)
获得内部的AI对象指针。
16、获得AI的状态(get ai state)
获得AI的当前状态。
17、获得AI参数指针(get ai template param)
获得AI参数对象指针。
18、其他(other)
状态切换、事件、属性、命令等与基础接口一致,其他需要的函数可以看情况增加。
算法(递归)
递归是一种分而治之、将复杂问题转换为简单问题的求解方法。
递归算法有以下优缺点:
优点:使用递归编写的程序简洁、结构清晰,程序的正确性很容易证明,不需要了解其具体的细节。
缺点:递归函数在调用过程中,每一层调用都需要保存临时变量和返回地址、传递参数,因此递归数的执行效率低。
1、求阶乘
code.
#include <stdio.h> #include <inttypes.h> /** * 递归是一种分而治之、将复杂问题转换为简单问题的求解方法。递归算法有以下优缺点: * 优点:使用递归编写的程序简洁、结构清晰,程序的正确性很容易证明,不需要了解其具体的细节。 * 缺点:递归函数在调用过程中,每一层调用都需要保存临时变量和返回地址、传递参数,因此递归 * 函数的执行效率低。 */ /** * 求阶乘 */ int64_t fact(int32_t n); int32_t main(int32_t argc, char *argv[]) { int32_t n; printf("please input a int number: "); scanf("%d", &n); printf("%d!=%d\n", n ,fact(n)); } int64_t fact(int32_t n) { int32_t x; int64_t y; if (n < 0) { //小于0阶乘无意义 printf("param error!\n"); return -1; } if (0 == n) { //最后一次返回1 return 1; } else { return n * fact(n - 1); //递归求n的阶乘 } }
result.
2、斐波那契数列的第N项
code.
#include <stdio.h> #include <inttypes.h> /** * 递归求斐波那契数列的n项 */ int32_t fib(int32_t n); int32_t main(int32_t argc, char *argv[]) { int32_t n; printf("please input the number: "); scanf("%d", &n); printf("the %d option value is: %d\n", n, fib(n)); return 0; } int32_t fib(int32_t n) { if (0 == n) return 0; if (1 == n) return 1; if (n > 1) return fib(n - 1) + fib(n - 2); }
result.
3、十进制转二进制
code.
#include <stdio.h> #include <inttypes.h> /** * 十进制转二进制 */ void dect_tobin(int32_t number); int32_t main(int32_t argc, char *argv[]) { int32_t n; printf("please input a int number: "); scanf("%d", &n); printf("the binary is: "); dect_tobin(n); printf("\n"); return 0; } void dect_tobin(int32_t number) { if (0 == number) return; dect_tobin(number / 2); printf("%d", number % 2); }
result.
4、最数组中的最大值
code.
#include <stdio.h> #include <inttypes.h> /** * 递归求数组中的最大值 */ int32_t findmax(int32_t array[], int32_t n); void displayarray(int32_t array[], int32_t length); int32_t main(int32_t argc, char *argv[]) { int32_t array[] = {23, 56, 35, 67, 86, 28, 1, 27, 11}; int32_t length, i; length = sizeof(array) / sizeof(array[0]); displayarray(array, length); printf("the max value in array is: %d\n", findmax(array, length)); return 0; } int32_t findmax(int32_t array[], int32_t n) { int32_t m; if (n <= 1) return array[0]; m = findmax(array, n - 1); return array[n - 1] >= m ? array[n - 1] : m; } void displayarray(int32_t array[], int32_t length) { int32_t i; for (i = 0; i < length; ++i) printf("%3d", array[i]); printf("\n"); }
result.
5、求两个数的最大公约数
code.
#include <stdio.h> #include <inttypes.h> /** * 求最大公约数 */ int32_t gcd(int32_t m, int32_t n); int32_t main(int32_t argc, char *argv[]) { int32_t m, n; printf("please input two int number: "); scanf("%d,%d", &m, &n); printf("the max common divisor is: %d\n", gcd(m, n)); return 0; } int32_t gcd(int32_t m, int32_t n) { if (m > n) { return gcd(m - n, n); } else if (m < n) { return gcd(m, n - m); } else { return m; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现