开放大世界

· · 科技·工程

众所周知,在学专业级的c++之前,oiers自制的游戏一般都是用一个char类型的数组实现地图的存放、修改、展示。这可以说是最简单直接的方式了

.

但是,这种方式有一个缺点:大小不够大(至少算不上开放大世界),例如我们开一个1w × 1w的数组,DEV C++ BOMB 了,所以我就一直在想如何突破这个限制,制作真正的开放大世界。

.

-----------------------不怎么华丽的分界线----------------------

.

"实现"

某一次我打开MC开始玩,在开启刷沙机后顺手(其实不做就无法运行)做了个区块强制加载器。然后突发奇想!

我们的游戏地图可不可以分区块?

.

.

.

具体实现是这样的,定义两个二维数组,为了方便称呼,一下一个数组叫A,一个数组叫B。A数组存的每一个格子表示一个区块,数组A可以存放区块的状态。B数组用来显示,也就是玩家看到的。这样子就可以大大节省内存空间。我们来简单计 亿 一下:

.

若A、B数组均为5000×5000int类型的数组,那么它们所占空间为:
5000×5000×4×2= 200000000 B≈195313 KB≈191 MB

.

(为什么要乘4? 因为int类型站4个字节)

.

.

我们再来算一下传统算法(应该也不算是算法)的空间需求:
与上述方法等同大小的传统地图应该是 (5000×5000) ×(5000×5000) 的大小

.

也就是25000000×25000000的大小,

.

所占空间为:25000000 × 25000000 × 4 = 2.5e14 B ≈ 2.44140625e12 KB ≈ 2384185791 MB ≈ 2328306 GB ≈ 2274 TB

.

也就是说,这个算法(可能也不算算法)用191MB的空间干了本来应该要2k+ TB 干的事

-----------------------不怎么华丽的分界线---------------------------------

缺点

知周所众众所周知,凡事没有完美。该算法(可能也不算算法)也如此。

.

.

它的缺点是什么呢?

.

首先,它比传统的方式更加复杂。程序变得复杂,增加oiers找bug的难度,
其次,对于地图的修改极其麻烦,目前我使用的方法时用结构体(struct)&队列(queue) 存储方式为:({区块中的x坐标,区块中的y坐标,区块自身的x坐标,区块自身的y坐标,建筑类型...})
具体实现方式:先获取队列长度size,再循环size次,每次把队首元素取出,如果该元素是该区块的,就更新上述B数组,再把元素重新塞回去;如果不是,就同上,但是不更新B数组。

.

但是,这又有问题。随着游戏的进行,队列里的元素数量暴增,会降低运行速度,影响游戏体验(谁会愿意玩游戏还像在看PPT呢?),而且,极端情况下,就是塞了超级多元素,队列也会爆掉。

.

上述问题也是可以解决的。如:开多几个队列。然后各个队列分别存几个几个区块。

.

什么!你问我为什么不用动态数组!?

.

总之,存储方式还需要改进,不过这种比传统算法(可能也不算算法)大几十甚至几百几千倍的东西,谁看了不心动?这种算法(可能也不算算法)只能作为对于传统算法(可能也不算算法)的补充。不知这个算法(可能也不算算法)经过dalao们的创作会出现什么有意思的游戏呢?

----------------------------------不怎么华丽的分界线---------------------------------

应用

对于这个算法(可能也不算算法),我暂时只运用于那种模拟治理国家的游戏,详见这里

还希望本篇对于各位 喜欢摸鱼的 oier们有帮助