找了下,网上关于这方面的资料大多是讲随机迷宫生成算法的,但是MMO中的地下城不仅仅是迷宫这么简单,不是只要生成一条或多条通路就算完成,还包括怪物的摆放,一些事件触发器类物件的摆放,地表景观类物件的摆放,还有地表Tile块的指定等。就生成的通路来说,也不可能只有一种简单的石头地形,或者全是沙地路,而在遇到拐弯或小坡小坎的地形时,地形块的指定会更加的复杂。

  当然,这些问题都可以通过技术手段一个个来解决,但还有一个问题,如何保证随机生成出来的地图具有可玩性。这要求生成的道路即不能太直,也不能绕的太厉害,会有一些比较巧妙的区域来给玩家采用一些攻防的战略,怪物的颁布也比较合理。这些属于有些类似于艺术创作的东西,全部让计算机来处理还过于复杂。

  这两天想到了一个方案,以类似于拼图的方式来组装出随机地图。并且可以再简单些,所有的拼图块都是固定大小的正方块,块中间的道路以及地表装饰物等是事先制作好的,这样在拼图时只需要按这些块定义出的接口来确定是否可拼接即可。

  为了让问题再进一步简单,我们可以要求所有块的连接处的通路宽度必须相同,位置也必须固定在每条边的正中间,限制多了当然会让制作时的自由发挥度降低,但复杂度也会降低不少,这个可以适当做些取舍。

  服务器在生成随机地图时需要知道两个块是否能拼接,我们可以对每个块及其连接属性做一些定义,这些定义至少要包括:

  1。该块用到的TileSet编号,只有使用相同TileSet的块才能拼合到一幅地图中。

  2。该块四条边的连通情况,要为每条边都定义是否可连通,通路的Tile块编号属性。

    只能让两边都可连通或都不可连通的块拼命,否则一条路突然中断,那将会是很尴尬的场景。

    另外,拼接块两边通路的Tile编号也必须相同,否则一条沙地路可能会连到另一条石板路上去。

  在为地图摆放怪物及触发器类物件时也有一点点不同,指定位置必须采用相对于当前块的相对坐标,在服务器生成完随机地图后再根据每个块的偏移来修改这些坐标为绝对坐标。

  在生成地图时也有一些细节需要处理,比如某幅地图中一定要出现某个或某几个块,用来放入口出口等。还有一些必须拼合在一起的块,用来实现单独一个块无法容纳下的超大自然景观或是城堡等。可能还需要限制一下某个块只能出现的位置,用来定义地下城的离的比较远的前门和后门等。

  我们可以为每幅要生成的地图定义一个模板,其中就包含这些限制条件,还有其他策划们可能会想到的一些限制条件,要生成指定的随机地图时,从该模板开始,选择合适的块来进行拼接。

  最后是随机地图的使用。因为地图是服务器临时生成的,客户端之前并没有该地图的数据,所以在传统的进入地图命令发送之前,需要多加一步处理:如果要进入的地图是随机生成的,则先将该地图数据发送给客户端,待客户端在内存中创建好该地图后,剩下的过程就与传统过程没有区别了。

  至于服务器如何把生成的地图发给客户端。如果是完全随机生成的地图,要将整幅地图发送给客户端那将是一件很消耗带宽的事,而采用块来拼装的方式后,实际需要发送的数据只有块编号。每个块的定义数据都保存在客户端。

  服务器也需要保留有每个块的格子阻挡信息,在生成完随机地图后,服务器和客户端都要按此块列表来生成完整的格子阻挡信息,用于寻路及客户端行走的合法性检测等。

  以上只是这两天的一点随想,不知道暗黑中的随机地下城是如何生成的,google了下没有结果,有相关资料的麻烦共享一下,或者对此主题提供一些相关思路,不胜感激。

MMO中随机生成地下城的一点随想相关推荐

  1. python随机密码生成在26个字母中随机生成10个_习题6:二.3 随机密码生成

    编写程序在26个字母大小写和9个数字组成的列表中随机生成10个8位密码. import random num_ls = [] # 创建数字.小写字母.大写字母空列表 str_ls = [] STR_l ...

  2. 随机密码生成。编写程序,在26个字母大小写和10个数字组成的列表中随机生成10个8位密码。

    随机密码生成.编写程序,在26个大小写字母和10和数字组成的列表中随机生成10个8位的密码: 根据题目要求,我们编写的程序主干要有哪些内容呢? 1.随机选择 2.26个大小写字母 3.10个阿拉伯数字 ...

  3. 双色球规则:双色球每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球从1—33中随机生成6个不重复的号码;蓝色球号码从1—16中随机生成1个;客户通过键盘录入购买的红色球6个(不重复)和蓝色

    双色球规则:双色球每注投注号码由6个红色球号码和1个蓝色球号码组成. 红色球从1-33中随机生成6个不重复的号码:蓝色球号码从1-16中随机生成1个: 客户通过键盘录入购买的红色球6个(不重复)和蓝色 ...

  4. 随机密码生成。编写程序,接收列表在26个字母大小写和10个数字组成的列表中随机生成10个8位密码。

    随机密码生成.编写程序,接收列表在26个字母大小写和10个数字组成的列表中随机生成10个8位密码. 这里我们要用到random函数. 代码如下: import random for i in rang ...

  5. 计算机中表格怎么用英语说,电脑excel表格如何在表格中随机生成一个大写英文字母...

    电脑excel表格如何在表格中随机生成一个大写英文字母 我们可以利用一个函数(在表格中随机生成大写字母)来帮助我们制作英文练习本,今天小编就告诉大家电脑excel表格如何在表格中随机生成一个大写英文字 ...

  6. 随机密码生成。编写程序,在26个字母大小写和9个数字组成的列表中随机生成10个8位密码。

    #e6.1随机密码生成,在26个字母大小写和9个数字组成的列表中随机生成10个8位密码 import random s = ["a","b","c&q ...

  7. java中随机生成26个字母组合的随机验证码

    实现原理,通过随机生成1-52的随机数,然后从定义好的字母数字中取元素进行组合. 下面是代码: public static void login(){String [] yan ={"a&q ...

  8. java中随机生成汉字

    main方法中使用: //随机生成100个汉字 String ss=""; for(int i=0;i<100;i++){ ss+=getChinese(i); } Syst ...

  9. python中随机生成数字方法

    在python中经常会需要随机生成一些数字,此时就需要用到python中的random模块中的randint函数了,方法如图: 此时执行程序时会随机生成闭区间1到100之间的数字,包含1和100, 但 ...

最新文章

  1. Facebook性能大提升的秘密:HipHop
  2. asp.net mvc 3 unobtrusive client side validation not working in IE
  3. Django的quarySet
  4. Oracle应用容器云的自由
  5. Excel和Word 简易工具类,JEasyPoi 2.1.7 版本发布
  6. storm 出现一次运行结果,后续不在出现的原因
  7. 大数据学习笔记20:MR案例——按电影热度值排序
  8. Linux操作系统下/etc/hosts文件
  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明
  10. 4SUM Leetcode
  11. 火热升级:360Safe VS 雅虎助手
  12. java一元抢购,拼多多1元抢购的步骤是什么?
  13. 压敏电阻特点,与普通电阻有什么不同?
  14. 马士兵JVM课程笔记
  15. 利用蒙特卡洛法求π的近似值:
  16. GIS及空间统计相关基础整理【持续整理中】
  17. vivo pad和小米平板5pro哪个值得买 两者配置对比
  18. 树莓派 安装Flash 教程
  19. 申请留学必须去名企实习吗?如何快速获得名企实习offer
  20. 电脑上怎么清空我的android手机,缓存数据可以清除吗?手机与电脑清除方法详解...

热门文章

  1. Spring4.x❹ Spring的事务管理 DataSourceTransactionManager
  2. Echarts 新认知 地图的label到底怎么居中?
  3. react-native trampoline实现
  4. Cadence ic5 自定义快捷键及奇技淫巧
  5. 【Unity3D插件】AVPro Video1.x 安卓端所有路径均无法播放
  6. python批量处理图像_python批量图片处理简单示例
  7. python文件用pyinstaller库进行打包时,代码中用到的图片和我们自定义的python package包的处理办法
  8. 凉凉!深扒那个有点“咪蒙”的阿里美女高管!
  9. 涉密计算机审计报告范文,涉密信息安全保密审计报告
  10. SSRF之GOPHER协议利用