作者:兔四
链接:https://zhuanlan.zhihu.com/p/26965602
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这套方案的雏形来自于Eed Blob Games(Red Blob Games),基础的完成图大概是这样子:

然后,本文介绍的这套方案将会在它的基础上做一些拓展,目的是生成一块块带有不同地形的地图,而且每一次生成地图是有足够的随机,同时还会加上一些半岛等丰富的变数。

一、方块生成

首先我们创建一个矩形,这是最基础的地图。

然后随机在矩形内布下若干个点。

从这些点的坐标出发,每个点生成一个多边形,边数在3~6之间。

这三步之后,地图大概是这个样子:

这一步实际上是随机把一个大的矩形切割成若干个方块,接下来的操作则把这些方块当做是最基础的元素来进行地图生成。

二、方块编号

依照下面的规则来给方块编号:

最靠近大矩形边缘的方块命名为1;

剩下的方块里,与1相邻的方块命名为2;

剩下的方块里,与2相邻的方块命名为3;

……

渐渐把矩形内所有方块都命名了一个数字,这个数字可以简单地代表一个方块距离矩形边沿有多远。接下来,会以数字较大的一些方块作为中心,进行地图下一步的生成。

三、水域切割

找到数字较大的方块,假设在第二步里生成了若干个5和6的方块,那就把所有这些方块命名为中心方块。

选择1个中心方块,以它作为起点,依次随机找与它相邻的、数字编号减一的方块,如下图:

如上图,灰色的就是中心方块,蓝色的就是执行上述步骤后选择的方块。

然后随机取中心方块作为起点,继续执行若干次上述的操作:

接着,把所有编号为1的方块全部命名为水域方块:

至此,我们就把整个地图从中心出发,切割出大小不一、方向随机的水域,同时整个地图也会被水域包围,充当地图边缘的作用。

四、随机切割

这一步,我们给地形加一些随机性。

做法很简单,随机在剩余的非水域方块里,把1~3个方块切割出来当做是内陆水域。如果你想整个地图没有岛屿,则只需要保证在切割后不会出现一个四周都是水域的方块即可。切割后如下:

五、地形分布

这时候,我们把整个地图切割成两个部分:

一部分是被切割出去当做是水域;

一部分是大陆,而且会被水域分割成多个部分,会有一块相对中心的区域将它们连接起来。

地形分布一般有两种做法:

一种是直接按方块的数字编号来画等高线,依次分布平原、山丘、高原等地形,这就是文章开头提到的那两张示意图的做法;

另一种则是按照区域来划分地形,比如把大陆分割成草地、沙漠、森林、雪山等地形。

这里讨论第二种做法。

我们从边缘出发,在一个随机区间内取小方块的数量,这里假设是[10,12],把每次取得的方块当成一个集合,称为一个地形。

依次执行上述的步骤,就可以把整个地图分割成多个大块的地形,如图:

每个颜色就代表一个大的地形块,这时候就按照地图的需要来分配具体地形即可。

实际上,如果运算量足够大,可以把方块数量显著提高,可以得到更加平滑的边缘和多变的大小地形块。

【转载】一个游戏地图生成的方案相关推荐

  1. Siki_Unity_7-4_高自由度沙盘游戏地图生成_MineCraft_Uniblocks插件(可拓展)

    Unity 7-4 高自由度沙盘游戏地图生成 MineCraft (插件Uniblocks) 任务1&2&3&4 素材 && 课程演示 && 课 ...

  2. maven 一个模块生成多个jar包

    maven 一个模块生成多个jar包 为了便于将一个模块中的接口提供给调用方,需要将部分pakage(interface.dto)单独打包,但是不包括impl类 <build> <s ...

  3. 做小程序费用太高?帮你选一个最省钱的方案

    2019独角兽企业重金招聘Python工程师标准>>> 随着小程序的应用日益广泛,这种"小而美",无需下载安装,使用方便."触手可及"的手机应 ...

  4. java fields是_一个快速生成R2.java中fields的插件

    一个快速生成R2.java中fields的插件 项目地址:github.com/JeasonWong/- 介绍 在子 module 中使用 ButterKnife 时,如果想使用 ButterKnif ...

  5. 转载一个手机RPG游戏制作工具,仿造RPGXP写的

    转载一个手机RPG游戏制作工具,仿造RPGXP写的 有朋友问有没有脚本编辑功能,大家注意啦: 有脚本编辑功能,可视化界面编辑脚本,和RMXP一样 经过一年的开发,手机RPG游戏制作工具--MobieG ...

  6. 转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名...

    转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 July 20, 20 ...

  7. 一个好的SEO方案,让客户信服

    一个好的SEO方案,让客户信服,自己财源滚滚 前言:从事SEO工作也有两年多时间了,为很多网站出过SEO解决方案,因为喜欢SEOWHY的环境,这次申请达人,决定拿出点实在的东西和大家一起分享,希望大家 ...

  8. 转载一个大神的Makefile

    转载自:http://blog.csdn.net/haoel/article/details/2886  Makefile 值得一提的是,在Makefile中的命令,必须要以[Tab]键开始. 什么是 ...

  9. 设计一个秒杀系统-秒杀方案分析

    学习使用,老鸟飞过,欢迎交流 秒杀系统应该考虑哪些因素 高可用:秒杀系统最大的特点就是并发高,在极短的时间内, 瞬间用户量大.试想一下双11的时候可能会有几十万的用户去访问同一个商品详情页面秒杀同一个 ...

最新文章

  1. 镁的提取及应用_电熔镁炉、电熔镁以及菱镁耐火材料的发展及简介
  2. 使用screen/byobu 管理你的远程会话
  3. /boor删除恢复,
  4. 行业思考 | 酷炫动效是否利于你的产品设计?
  5. 优雅的创建一个JavaScript库
  6. STL常用的拷贝和替换算法
  7. ClickHouse 副本协同原理:ReplicatedMergeTree引擎
  8. HDU-3998 Sequence LIS统计
  9. python不同数据的读入_python读写不同编码txt文件_python读写txt文件
  10. 【Unity】 NGUI学习笔记(二)NGUI基础功能
  11. 如何去管理Java项目
  12. kindle 安装词典
  13. 10个优秀的思维导图软件,各种需求都能满足!!!
  14. 华为服务器装系统识别不到硬盘,重装Windows10系统找不到硬盘的两种解决方法
  15. pdf文件如何转换成word?
  16. 对比 GA 、PSO 、DE三种算法 求解连续优化问题的性能
  17. javafx label设置字体大小_如何把智能手机,设置成老年人模式?
  18. CS全球排名44,复旦计科实力如何?
  19. java注册界面发送邮箱验证码(无线程版)
  20. i7处理器好吗_二手CPU值得买吗?购买二手CPU不想交智商税就看这篇文章

热门文章

  1. 云计算与大数据技术应用 第三章
  2. javascript原生实现二级联动下拉菜单
  3. 原型软件--Balsamiq Mockups
  4. word文档编辑受限怎么解除
  5. Marvin is plain Jane WriteUp_实验吧_Crypto
  6. AttacKG: Constructing Technique Knowledge Graph from Cyber Threat Intelligence Reports 源码复现
  7. HTML5实现动态视频背景
  8. 胆结石的发病原因有哪些?
  9. MDPI论文投稿全流程实例讲解
  10. Failed to set attribute: Invalid input data or parameter 解决