时间一点点的消逝,伴着自己空闲日子将要结束的时候我尽量的学习和分享场景和AI的知识给朋友们,不过很遗憾的是这些文章还有不足的地方,就是有的难点没有完全的分析到。掉落在游戏中必不可少的,同时网络连接也是网络游戏中的核心部分,那么这两个东西又怎么和场景关联起来的?

一张截图

掉落(管理器)

1、初始化(init)

根据地图的长宽初始化掉落点数据。

2、是否可掉落(is can drop)

传入坐标返回该点是否可以掉落。

3、设置掉落点(set drop position)

传入一个坐标,并将该点设置为掉落点。

4、清除掉落点(clear drop position)

根据掉落点清除数据。

网络连接(管理器)

同一般的网络连接管理器一样,该管理器主要负责网络连接的管理,以及网络连接数据的处理。

每个场景对应一个场景网络连接管理器。

1、网络侦测(select)

套接字状态更新处理。

2、处理输入(process input)

数据的接收处理函数,与普通管理器不同的是这里不处理连接接受的情况,由场景管理器统一处理。

3、处理输出(process output)

处理输出(发送)的数据。

4、处理异常(process exception)

处理网络异常情况。

5、消息处理(process command)

接收到的消息将在这里进行处理。

6、循环逻辑处理(heart beat)

循环处理网络连接的逻辑。

7、设置场景ID(set scene id)

传入场景ID,并将此ID和该对象关联。

8、获得场景ID(get scene id)

获得当前管理器对应的场景ID。

9、增加网络连接(add connection)

传入网络连接对象指针并将该网络连接加入到管理器中。

10、增加套接字信息(add socket)

将套接字的信息加入管理器中。

11、删除网络连接(delete connection)

在管理器中去除网络连接,但是不断开网络连接,可能是切换到别的场景。

12、删除套接字信息(delete socket)

删除套接字的信息。

13、移除网络连接(remove connection)

移除玩家的网络连接并清理数据,通知场景对象被移除。

14、移除所有网络连接(remonve all)

将所有网络连接从管理器中移除,一般是用于异常和停机时候调用。

算法(递推算法)

递推算法分为顺推法和逆推法,所谓顺推法就是从开始的数据开始向后根据数据的规则推算出公式,而逆推法恰恰相反从后面的数据开始按照规律找出数据组成的公式。

递推算法虽然原理比较简单,但是却可以考验一个人的归纳总结的能力。

1、斐波那契数列

斐波那契数列定义:

从数列的第三项开始,每一项正好等于前两者之和。

F(0) = 0, F(1) = 1, F(n) = F(n - 1) + F(n - 2) (n表示数列的n项,且n >= 2)。

code.

#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 + ], i;
array[] = ;
array[] = ;
for (i = ; i <= N; ++i)
array[i] = array[i - ] + array[i - ];
for (i = ; i <= N; ++i)
printf("the %d month total rabbit: %d\n", i, array[i]);
return ;
}

result.

2、进制数转换二进制

进制数可分为整数部分以及小数部分,将十进制数转换为二进制数可以分别将整数和小数部分进行转换。其中,将十进制整数转换为二进制整数采用的方法是"除二取余",十进制小数转换为二进制小数的主要方法是"乘二取余"。

code.

#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 + ], b[N + ];
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 > ; --i)
printf("%d", a[i]);
printf(".");
for (i = ; i <= N; ++i) {
if ( == b[i]) {
printf("");
} else {
printf("");
}
}
printf("\n");
return ;
} 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 = ; i <= alength; ++i)
a[i] = ; //初始化
for (i = ; i <= blength; ++i)
b[i] = ; //初始化
int32_t k = ;
while (_ipart) {
a[k++] = _ipart % ;
_ipart /= ;
}
alength = k;
for (i = ; i <= blength; ++i) {
value *= ;
if (value > 1.0f) {
value -= ;
b[i] = ;
} else {
b[i] = ;
}
}
}

result.

3、母牛生小牛

有一头母牛,每年年初生一头小母牛,每头小母牛从第3个年头起,每年年初也生头小母牛。求在第20年时共有多少头牛。

code.

#include <stdio.h>
#include <inttypes.h> /**
* 问题:
* 有一头母牛,每年年初生一头小母牛,每头小母牛从第3个年头起,每年年初也生
* 一头小母牛。求在第20年时共有多少头牛。
*/ #define N 20 int32_t main(int32_t argc, char *argv[]) {
int32_t x0[N + ], x1[N + ], x2[N + ], x3[N + ], i, s;
x0[] = ; //初始时,只有一头刚出生的母牛
x1[] = x2[] = x3[] = ;
for (i = ; i <= N; ++i) {
x0[i] = x3[i] = x2[i - ] + x3[i - ]; //满2岁和满3岁的母牛成为育龄牛,并且都生了小母牛
x1[i] = x0[i - ]; //刚生下的小母牛成为下一年的满1岁的母牛
x2[i] = x1[i - ]; //满1岁的小母牛成为下一年的满2岁的母牛
s = x0[i] + x1[i] + x2[i] + x3[i]; //第i年的母牛总数
printf("the %d year ox nubers: %4d\n", i, s);
}
return ;
}

result.

4、杨辉三角

杨辉三角,具有二项展开式的二项式系数即组合数的性质,这是研究杨辉三角其他规律的基础。

code.

#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 + ][N + ];
int32_t i, j;
for (i = ; i <= N; ++i)
array[i][i] = array[i][] = ;
for (i = ; i <= N; ++i) {
for (j = ; j < i; ++j)
array[i][j] = array[i - ][j] + array[i - ][j - ];
}
printf("%d yang hui angle is: \n", N + );
for (i = ; i <= N; ++i) {
for (j = ; j <= i; ++j)
printf("%3d", array[i][j]);
printf("\n");
}
return ;
}

result.

5、猴子吃桃

子第一天摘了若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃前一天的一半零一个。第十天的早上想再多吃时,只见剩下一个桃子了。求第一天共摘了多少桃子。

code.

#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天
y = ; //最后一天剩下的桃子数量
while (day > ) {
x = (y + ) * ;
y = x;
--day;
}
printf("the first total peachs: %d\n", x);
return ;
}

result.

6、存钱问题

小明为自己的学生生活准备了一笔学费,一次性存入银行,保证在每年年底取出1000元,到第3学习结束时刚好取完。假设银行一年整存零取的月息为0.31%,请计算需要存多少钱?

code.

/**
* 小明为自己的学生生活准备了一笔学费,一次性存入银行,保证在每年年底取出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 = ; i < ; ++i)
total = (total + ) / ( + * 0.0031);
printf("the first year need save money: %.2f\n", total);
return ;
}

result.

MMORPG大型游戏设计与开发(服务器 游戏场景 掉落与网络连接)的更多相关文章

  1. MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)

    我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...

  2. MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)

    核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识.之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进 ...

  3. MMORPG大型游戏设计与开发(服务器 AI 概述)

    游戏世界中我们拥有许多对象,常见的就是角色自身以及怪物和NPC,我们可以见到怪物和NPC拥有许多的行为,比如说怪物常常见到敌对的玩家就会攻击一样,又如一些NPC来游戏世界中走来走去,又有些怪物和NPC ...

  4. MMORPG大型游戏设计与开发(服务器 游戏场景 动态场景与副本)

    场景的内容讲解到今天算是暂时划上一个句号了,接下来为大家讲解的是AI部分(大型AI),如果有兴趣的朋友不妨持续关注这些文章,大家一起学习和进步.动态场景和副本是场景中特殊的类型,副本在这里想必已经是无 ...

  5. MMORPG大型游戏设计与开发(概述)updated

    1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...

  6. MMORPG大型游戏设计与开发(part6 of net)

    上一部分,讲述了一个服务器与服务器之间的通信实例,客户端其实原理大同小异.网络部分准备就暂时讲到这里,不过我们不妨再回头过来想想在这过程中有没有优化和改进的地方.这部分讲解的是以网络包代码作分析,实现 ...

  7. MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)

    脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...

  8. MMORPG大型游戏设计与开发(服务器 游戏场景 地图和区域)

    地图的数据以及区域的信息是场景的重要组成部分,这些数据同时存在客户端和服务器,而且都是由编辑器生成的.那么保存的文件数据结构是怎样的?一张3D的场景地图又是怎样处理这些数据的?同时告诉大家这里同样只是 ...

  9. MMORPG大型游戏设计与开发(服务器 游戏场景 多线程)

    多线程在随着cpu发展应用的是越来越多,游戏场景因为其在服务器所占的数据量与逻辑复杂度的原因必须依赖于它.为什么场景要采用多线程?场景的线程是怎样的?场景的线程又是如何创建的?场景的线程又是怎样管理的 ...

随机推荐

  1. Java实现时间动态显示方法汇总

    这篇文章主要介绍了Java实现时间动态显示方法汇总,很实用的功能,需要的朋友可以参考下 本文所述实例可以实现Java在界面上动态的显示时间.具体实现方法汇总如下: 1.方法一 用TimerTask: ...

  2. Z.ExtensionMethods 一个强大的开源扩展库

    今天有意的在博客园里面搜索了一下 Z.ExtensionMethods 这个扩展类库,确发现只搜到跟这个真正相关的才两篇博文而已,我都点进去看了一下,也都只是提到而已,没有专门介绍,才引起我写这篇文档 ...

  3. FASTSOCKET

    FASTSOCKET It looks like there are like 3 separate optimizations, but I think the most important one ...

  4. Oracle学习总结_day05_集合_连接查询

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! day05_集合_连接查询 集合操作符 UNION ( ...

  5. c#中奖算法的实现

    算法名称 Alias Method public class AliasMethod { /* The probability and alias tables. */ private int[] _ ...

  6. 在多行列表中id同名的<a>标签点击事件处理方法

    Struts2标签 问题描述:最近项目中在使用struts迭代标签动态生成列表的过程中,由于每一行li元素中包含<a>超链接,如下图 一开始超链接是这样的<a href=“#” id ...

  7. JMeter专题系列(六)集合点

    JMeter也有像LR中的集合点: JMeter里面的集合点是通过添加定时器来完成. 注意:集合点的位置一定要在Sample之前. 集合点:虽然我们的“性能测试”理解为“多用户并发测试”,但客观上来说 ...

  8. 亿级规模的Elasticsearch优化实战

    Elasticsearch 的基本信息大致如图所示,这里就不具体介绍了. 本次分享主要包含两个方面的实战经验:索引性能和查询性能. 一. 索引性能(Index Performance) 首先要考虑的是 ...

  9. [转载]C#中as和is关键字的用法

    这篇文章主要介绍了C#中as和is关键字的用法的相关资料,需要的朋友可以参考下. 原文链接:http://www.jb51.net/article/80944.htm#comments  在程序中,进 ...

  10. 【单页应用巨坑之History】细数History带给单页应用的噩梦

    前言 在我们日常的网页浏览中,我们非常喜欢做一个操作:点击浏览器的前进后退在Ajax技术出现后,有些时候前进后退就会给开发者带来困扰,甚至一些开发者试图去干掉History随着Html5的发展,移动端 ...