时间一点点的消逝,伴着自己空闲日子将要结束的时候我尽量的学习和分享场景和AI的知识给朋友们,不过很遗憾的是这些文章还有不足的地方,就是有的难点没有完全的分析到。掉落在游戏中必不可少的,同时网络连接也是网络游戏中的核心部分,那么这两个东西又怎么和场景关联起来的?
根据地图的长宽初始化掉落点数据。
传入坐标返回该点是否可以掉落。
传入一个坐标,并将该点设置为掉落点。
根据掉落点清除数据。
同一般的网络连接管理器一样,该管理器主要负责网络连接的管理,以及网络连接数据的处理。
每个场景对应一个场景网络连接管理器。
套接字状态更新处理。
数据的接收处理函数,与普通管理器不同的是这里不处理连接接受的情况,由场景管理器统一处理。
处理输出(发送)的数据。
处理网络异常情况。
接收到的消息将在这里进行处理。
循环处理网络连接的逻辑。
传入场景ID,并将此ID和该对象关联。
获得当前管理器对应的场景ID。
传入网络连接对象指针并将该网络连接加入到管理器中。
将套接字的信息加入管理器中。
在管理器中去除网络连接,但是不断开网络连接,可能是切换到别的场景。
删除套接字的信息。
移除玩家的网络连接并清理数据,通知场景对象被移除。
将所有网络连接从管理器中移除,一般是用于异常和停机时候调用。
递推算法分为顺推法和逆推法,所谓顺推法就是从开始的数据开始向后根据数据的规则推算出公式,而逆推法恰恰相反从后面的数据开始按照规律找出数据组成的公式。
递推算法虽然原理比较简单,但是却可以考验一个人的归纳总结的能力。
斐波那契数列定义:
从数列的第三项开始,每一项正好等于前两者之和。
F(0) = 0, F(1) = 1, F(n) = F(n - 1) + F(n - 2) (n表示数列的n项,且n >= 2)。
#include <stdio.h> #include <inttypes.h> /** * 斐波那契数列定义: * 从数列的第三项开始,每一项正好等于前两者之和。 * F(0) = 0, F(1) = 1, F(n) = F(n - 1) + F(n - 2) (n表示数列的n项,且n >= 2) */ /** * 问题: * 如果1对兔子每月能生一对小兔子,而每对兔子在它出生的第3个月又能开始生1对兔子, * 假定在不发生死亡的情况下,由一对兔子开始,1年后能繁殖成多少对兔子。 * * 针对问题,我们可以将这些数据依次类推,可以发现它们刚好组成斐波那契数列。 */ #define N 12 int32_t main(int32_t argc, char *argv[]) { int32_t array[N + 1], i; array[0] = 1; array[1] = 1; for (i = 2; i <= N; ++i) array[i] = array[i - 1] + array[i - 2]; for (i = 1; i <= N; ++i) printf("the %d month total rabbit: %d\n", i, array[i]); return 0; }
进制数可分为整数部分以及小数部分,将十进制数转换为二进制数可以分别将整数和小数部分进行转换。其中,将十进制整数转换为二进制整数采用的方法是"除二取余",十进制小数转换为二进制小数的主要方法是"乘二取余"。
#include <stdio.h> #include <inttypes.h> #include <math.h> /** * 十进制数转换二进制 * 十进制数可分为整数部分以及小数部分,将十进制数转换为二进制数可以分别将整数 * 和小数部分进行转换。其中,将十进制整数转换为二进制整数采用的方法是"除二取余", * 将十进制小数转换为二进制小数的主要方法是"乘二取余"。 */ #define N 8 void trans(float value, int32_t a[], //保存整数部分 int32_t &alength, int32_t b[], //保存小数部分 int32_t blength); int32_t main(int32_t argc, char *argv[]) { int32_t a[N + 1], b[N + 1]; float x = .0f; int32_t i; printf("please input a float number: "); scanf("%f", &x); int32_t alength = N; trans(x, a, alength, b, N); printf("the binary numbers: "); for (i = alength; i > 0; --i) printf("%d", a[i]); printf("."); for (i = 1; i <= N; ++i) { if (0 == b[i]) { printf("0"); } else { printf("1"); } } printf("\n"); return 0; } void trans(float value, int32_t a[], int32_t &alength, int32_t b[], int32_t blength) { double ipart; int32_t _ipart; value = modf(value, &ipart); _ipart = static_cast<int32_t>(ipart); int32_t i; for (i = 0; i <= alength; ++i) a[i] = 0; //初始化 for (i = 0; i <= blength; ++i) b[i] = 0; //初始化 int32_t k = 0; while (_ipart) { a[k++] = _ipart % 2; _ipart /= 2; } alength = k; for (i = 1; i <= blength; ++i) { value *= 2; if (value > 1.0f) { value -= 1; b[i] = 1; } else { b[i] = 0; } } }
有一头母牛,每年年初生一头小母牛,每头小母牛从第3个年头起,每年年初也生头小母牛。求在第20年时共有多少头牛。
#include <stdio.h> #include <inttypes.h> /** * 问题: * 有一头母牛,每年年初生一头小母牛,每头小母牛从第3个年头起,每年年初也生 * 一头小母牛。求在第20年时共有多少头牛。 */ #define N 20 int32_t main(int32_t argc, char *argv[]) { int32_t x0[N + 1], x1[N + 1], x2[N + 1], x3[N + 1], i, s; x0[0] = 1; //初始时,只有一头刚出生的母牛 x1[0] = x2[0] = x3[0] = 0; for (i = 1; i <= N; ++i) { x0[i] = x3[i] = x2[i - 1] + x3[i - 1]; //满2岁和满3岁的母牛成为育龄牛,并且都生了小母牛 x1[i] = x0[i - 1]; //刚生下的小母牛成为下一年的满1岁的母牛 x2[i] = x1[i - 1]; //满1岁的小母牛成为下一年的满2岁的母牛 s = x0[i] + x1[i] + x2[i] + x3[i]; //第i年的母牛总数 printf("the %d year ox nubers: %4d\n", i, s); } return 0; }
杨辉三角,具有二项展开式的二项式系数即组合数的性质,这是研究杨辉三角其他规律的基础。
#include <stdio.h> #include <inttypes.h> /** * 杨辉三角,具有二项展开式的二项式系数即组合数的性质,这是研究杨辉三角其他规律的基础。 * 1 每行数字左右对称,由1开始逐渐增大,然后变小,回到1。 * 2 第n行的数字个数为n个。 * 3 第n行的数字和为2的n次方减1。 * 4 每个数字等于上一行的左右两个数字之和。 * 5 第n行的第1个数为1,第二个数为1 x (n - 1),第3个数为1 x (n - 1) x (n - 2) / 2, * 依次类推。 */ #define N 8 int32_t main(int32_t argc, char *argv[]) { int32_t array[N + 1][N + 1]; int32_t i, j; for (i = 0; i <= N; ++i) array[i][i] = array[i][0] = 1; for (i = 2; i <= N; ++i) { for (j = 1; j < i; ++j) array[i][j] = array[i - 1][j] + array[i - 1][j - 1]; } printf("%d yang hui angle is: \n", N + 1); for (i = 0; i <= N; ++i) { for (j = 0; j <= i; ++j) printf("%3d", array[i][j]); printf("\n"); } return 0; }
子第一天摘了若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃前一天的一半零一个。第十天的早上想再多吃时,只见剩下一个桃子了。求第一天共摘了多少桃子。
#include <stdio.h> #include <inttypes.h> /** * 问题: * 猴子第一天摘了若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上 * 又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃前一天的一半零一个。 * 到第十天的早上想再多吃时,只见剩下一个桃子了。求第一天共摘了多少桃子。 */ int32_t main(int32_t argc, char *argv[]) { //x为桃子的总数, y为当天猴子吃完剩下的桃子数量,x - (x / 2 + 1) = y; 可以反推出x = 2 * (y + 1) int32_t day, x, y; day = 10; //共10天 y = 1; //最后一天剩下的桃子数量 while (day > 1) { x = (y + 1) * 2; y = x; --day; } printf("the first total peachs: %d\n", x); return 0; }
小明为自己的学生生活准备了一笔学费,一次性存入银行,保证在每年年底取出1000元,到第3学习结束时刚好取完。假设银行一年整存零取的月息为0.31%,请计算需要存多少钱?
/** * 小明为自己的学生生活准备了一笔学费,一次性存入银行,保证在每年年底取出1000元, * 到第3学习结束时刚好取完。假设银行一年整存零取的月息为0.31%,请计算需要存多少钱 */ //首先第三年年初的存款为x那么有公式:x + x * 12 * 0.0031 = 1000 //则x = 1000 / (1 + 12 * 0.0031) //同理可得第二年初的存款为(第三年初的银行存款 + 1000)/ (1 + 12 * 0.0031) //第一年年初的存款为(第二年年初的银行存款 + 1000)/ (1 + 12 * 0.0031) int32_t main(int32_t argc, char *argv[]) { int32_t i; float total = .0f; for (i = 0; i < 3; ++i) total = (total + 1000) / ( 1 + 12 * 0.0031); printf("the first year need save money: %.2f\n", total); return 0; }