地图随机算法
⑴ 开放世界游戏中的大地图背后有哪些实现技术
你好,一、程序技术篇:算法和架构(Programming Algorithms & Architecture)
1. 无限循环的平铺地图(Infinite Tiling)
2. 可预测随机数和无限宇宙(Predictable Random)
3. 精度问题解决方案
4. 超大地形的处理 (Terrain Visualization)
4.1 古典算法(从 GeoMipMapping,Progressive Mesh 到 ROAM)
4.2 层次的艺术(Quadtree 和 Chunked LOD)
4.3 以GPU为主的技术(从 Paging,Clipmap 到 GPU Terrain)
5. id tech 5 的 megatexture (超大地表上的非重复性海量贴图)
6. 过程式的内容 (Proceral Content Generation)
6.1 过程式纹理(Proceral Texturing)
6.2 过程式建模(Proceral Modeling)
二、内容制作篇:设计和创造(Content Design & Creation)
1. 随机地图类游戏 (Diablo II) 中地图的拼接
2. 无缝大世界 (World of Warcraft) 中区域地图的拼接
3. 卫星地质数据的导入,规整化和再加工(一些飞行模拟类游戏)
4. 超大地图的协同编辑:并行操作,数据同步,手动和自动锁的运用
三、异次元篇:我们的征途是星辰大海
1. 终极沙盒(EVE):当规模大到一定程度——宇宙级别的混沌理论与蝴蝶效应
2. 打通两个宇宙(EVE & Dust):发现更广阔的世界——宇宙沙盒游戏和行星射击游戏联动
⑵ 推箱子游戏怎么随机生成地图
推箱子可以随机生成地图
因为从推箱子的解答步骤可以还原关卡地图,所以可以随机生成过关步骤从而生成关卡地图
⑶ 在我的世界里的随机地图是无限大的,为什么不需要无限大的存储空间
这里说的无限大是说“地图的生成”是没有限制的。地图是实时,随机生成的。换句话说你在游戏里跑的地方越远越多,地图也会慢慢越来越大,不是说一进去就是无限大了。
为了避免内存不足造成游戏崩溃的情况,现在很多启动器都内置了地图生成的最高限制。但从理论上讲,的确是无限大的,存储空间也是一样。
⑷ 怎么制作迷宫图
方案一:主路扭曲型
1、首先,按照下图的间隔规则来生成基础的大地图,1为陆地,0为水域。
2、然后,选择一个靠近边缘的1作为起点,在它的周围随机找另一个黄色的1(这里的“周围”指的是上下左右4个方向,斜边不算)。找到就把他们联通,即把两个1之间的0变成陆地,这里用红色来表示。
3、把上一步“终”的格子作为新的一个“起”格子,不停循环第二步的过程,直到找不到周围有黄色的1。
4、这时候,原路往回走(即不停去找前一个格子),直到找到一个格子,这个格子周围有黄色的1,那么从这个格子开始重复前两个步骤。
5、接下来就是不停重复上面的步骤,找到就联通,找不到就往回走。
6、填充完整个地图之后,迷宫就算是制作完成了,根据需求加上终点即可。
总结一下,这种方案生成的迷宫会有一条明显的主路,即一条特别长、贯穿大部分区域的路线,同时,迷宫的路线一般比较扭曲。
方案二:自然分岔型
这个方案的雏形来自于随机prim算法,具体步骤如下:
1、跟方案一一样,生成一个基础地图。格子先用黄色1和灰色0来表示,暂时不区分水陆。
2、随机取一个地图边缘的黄色1,把它标记为红色1,即变成陆地。然后把它旁边的灰色0标记成蓝色0,表示“待定”。(注意的是,大地图四周的灰色0固定不变,作为地图边缘而存在)
3、敲黑板了!!这里是重点!!!
随机选一个蓝色的0(这一步很重要,会使这个方案明显区别于上一个方案),然后看红色1隔着这个蓝色0对面的格子,是否是黄色的1:
如果是,则把对面的黄色1标记成红色1,即变成陆地,然后把蓝色0变成红色的0,即也变成陆地;
如果不是,就把这个蓝色的0变成灰色的0。
最后,把新创建的红色1周围的灰色0,标记成蓝色0。
4、继续重复上面的步骤
5、对比上图和下图,这里取一个蓝色0生成一个红色1之后,新生成的红色1旁边,有两个蓝色0的两边都是红色1了,那么就根据第三步的规则,在稍后取到这些蓝色0时,就会把他们变成灰色0。
6、继续重复上述步骤,直到整个地图没有蓝色0了,地图就生成完毕。
总结一下,对比方案一,这套方案不会出现明显的主路,迷宫相对比较自然,但迷宫的分岔路会比较多,所以迷宫可能会更复杂,即玩家需要做选择的次数可能比较多。
方案三:块状分割型
上述两个方案有个共同的特点,就是道路永远都是1个格子宽,如果游戏需要给地图创造一些小型地块或者更宽的道路,需要在迷宫生成之后再用各种分布的规则来丰富迷宫。
而第三个方案则以小型地块作为出发点来设计迷宫,这套方案的雏形来自于国外大神Bob Nystrom,有兴趣的可以去查看他个人主页。
1、首先,在大地图(还是之前那个大地图)上生成若干小型地形,保证边长是奇数且不重合就好(示意图全部使用了正方形,实际上可以做成长方形让地图更加自然)。注意顶点要在黄色1格子上即可,这里我用橙色1来表示这些小型地块。
2、然后,根据之前方案一的迷宫生成方案,在非小型地块的区域里,用迷宫来填充。这一步完成之后,迷宫和小型地形是分隔开来的。
3、在橙色1的小型地形周围,随机取点以连接黄色1,连接点的数量可以根据需要来确定,建议是不要吝啬连接点的个数,因为这种地图之下,分岔路远比前两种方案要少。
4、接下来是简化地图,目的是去掉一些死胡同,因为这种方案的核心在于小型地块,没有必要让玩家在迷宫的路上绕。方法是把一些3边都是灰色0的黄色1去掉即可,具体数量也根据游戏需求来制定,我这里只去掉了一部分。
5、最后,给地图加上出口和入口,地图就做完啦!
总结一下,这种方案比前两种多了小型地块,这一点比较适合设计玩家的阶段性反馈。同时地图的分岔路明显减少,玩家在这种方案下的选择次数会明显降低。另外,由于这个方案的步骤相对多且独立,所以对于设计者来讲会比较容易控制地图的结构。
⑸ minecraft中的地图是怎样生成的
地图生成器根据种子码生成的
具体过程:
——根据种子与生成器参数(伪)随机生成等高线
——根据种子与地图参数(伪)随机生成生物群系
——根据种子生成的地形与生物群系,生成树木矿物等
——根据种子与地图参数(伪)随机生成洞穴,湖泊等景观
——根据种子与地形生物群系、生成器参数、地图参数,结合建筑物生成算法,生成建筑物
值得注意的是:
——伪随机数生成算法决定了:只要种子、生成器参数、地图参数一致,就能生成确定的地形
——伪随机数生成算法决定了:你的地图可以实时加载(跑到新的区块时可以快速生成)
——同样的,伪随机数散发决定了,你的已经修改的地图是不可能还原成一个种子码的
⑹ 求随机地图的算法
问题的关键是你要用这地图来作什么,以及需要用什么数据结构表示地图
如果说你需要上面的“图片”本身,那拿来好像没什么用处
如果说需要作为游戏的地图,那数据结构是真正重要的东西,地图的形式只是一堆坐标即可,没必要渲染成图片(或者说渲染是游戏主体的任务,不在地图生成器范围)
⑺ 鬼谷八荒炙炎之域具体位置在哪
随着社会经济的不断发展,在我们的现实生活中,我们对于游戏的玩法也是在不断的增加,也正是因为我们每个人对游戏都有一种吸引力,所以我们每个人都会在现实生活之中选择去玩游戏来让自己的生活得到一定的改变,让自己的心情能够得到一定的放松,也正是在这样的背景之下,所以我们会选择玩鬼谷八荒这款游戏,因为这款游戏现在的火热程度是非常高的,而且也吸引了很多的玩家,相信很多人在玩游戏的过程中,应该遇到这样的问题,那就是找不到的炙炎之域位置在哪里,下面我们就来看一下。
综上所述,我们能够明白,在这款游戏中,这个位置是没有具体位置的,主要是因为这个地图所采用的是随机生成的算法,而采用这种算法,地图本身就不是确定的,所以我们必须要去根据这个特征来去进行相关的寻找。
⑻ 魔兽地图编辑器的几个问题:(请给出详细解答)
第一个不太清楚......很少有人这样做的,如果我猜得没错的话,楼主是做一个把特定物品给NPC然后触发剧情是吧?放到指定区域貌似更方便呢。如果说硬要做的话,给你个信息,smart命令为右键点击。
第二个问题,所有伪随机都是一个意思,设置个随机种子,比如说RND = 0 到 100 的随机实数,然后条件句判断此实数是大于70还是小于等于70,之后再替换不同的单位给触发玩家。不过话说回来,变身技能最好是原版的,自己替换单位难免在动画衔接或数值上有出入。同时,这个随机算法有明显周期性,并不是很散乱,所以说不建议用到频繁发生的事件(如攻击)上,不过变身还是没问题的。
⑼ MC世界种子的原理是什么不都是随机的吗一串数字怎么能描述那么大的数据量
地图种子的原理是:地图生产是实时,随机,可重现的
在相同版本的minecraft里,相同的种子生成的地图是一样的
地图生产的细节:
种子:intseed = hashcode(xxxx);(这也是为什么中文也可以生产地图的原因)
动态生产地图的公式是。
map = fun_map(intseed) = fun_天空(intseed)+fun_地形(intseed) + fun_方块(intseed) + fun_建筑(intseed) +fun_生物(intseed) + fun_矿物(intseed)
举个栗子:
生成地图函数:f(c)
如果f是一个确定的函数,那么对于同样的c值,f(c)的值一定是确定的。
c就是那个种子,f(c)就是生成的地图。
地图生成使用的随机函数,当然是“伪随机函数”
什么是“伪随机函数”?计算机进行的是确定性运算,不存在真正的随机性,这意味着想要求计算机“独立”(依靠外部输入“例如磁盘存取、键盘鼠标操作等”来获得熵源的随机数发生器不在讨论范围之内。)生成真正的随机数,在理论上不可能。许多编程应用中想要随机效果,使用的都是“伪随机函数”,就是用某种非常复杂的算法,来生成一系列看似毫无关联却又均匀分布的数字(例如 0.9024310185642406, 0.6399798616249142, 0.8728940712975358, ...),称为“伪随机数列”,以此来模拟随机的效果。每次程序调用这个伪随机函数的时候,就从这个数列中取出下一个数字返回给程序。这样做在孤立来看是没问题的,但是问题是如果你把程序关闭,重新启动运行,你得到的还是原来那个数列,每次取随机数取出来的还是跟上次一样的那些数字,例如仍然是“0.9024310185642406, 0.6399798616249142, 0.8728940712975358, ...”。如果你依赖这个数列来生成游戏内容,那么每次游戏所得到的的结果都会一样,这就失去了随机的意义。
为了解决这个问题,我们只能从“伪随机函数”外面给它加入某种“扰动”,让它在每次运行的时候结果不一样,产生不同的“伪随机数列”。“种子”就是最常见的一种扰动方式。相同的“种子”产生相同的数列,不同的种子产生不同的数列。如何保证每次运行的“种子”不相同呢?最简单的办法就是采用“系统时间”作为种子。相同的程序,上次运行和这次运行的时间肯定不一样,这就确保了每次的种子不同。当然,如果你人为去修改系统时间,并且让两次运行时的系统时间严格一致,那么还是会得到相同的运算结果。但是作为游戏来说,一般没必要考虑这些。
Minecraft 里面的地图种子就是这样的原理。地图本质上是“伪随机函数”生成的,跟别的游戏没什么区别,但是我们知道 Minecraft 是个比较 geeky 的游戏,它把种子的控制权交给你,允许你指定种子,那么当你使用相同的种子的时候,游戏中所有本该“随机”的元素都会变成“命中注定”。不仅生成的地形完全相同,连什么地方会刷出什么花草牛羊都一样。如果玩家的玩法操作也完全严格相同的话(这个不太可能),那么整个游戏完全就等于是在放电影,一切都是预定好的。
另外,在minecraft里,地形生成、建筑生成、矿物生成是分开的,如果安装了生成建筑或者矿物mod,并不会干扰特定种子的形成特定的地形。