一种简单的2D Roguelike地图生成算法

前言

最近刚确定下来毕业设计要做的内容——一个2DRoguelike类型的游戏。因此研究了几天的地图生成算法,终于于如今成功制作了地图的生成。先放几张示意图感受一下:



是不是还蛮有感觉的呢!

一、核心思路

首先我们要明白的是一点。地图的随机生成方法有很多,但是前提是必须要保证这些地图区域的复杂性和连通性。因此虽然随机生成难度不大,但是合理性还是需要考虑的。

大体思路是这样的:
1.首先我们要随机生成一些墙和通路。这些是完全随机的。当然最外圈是必然是墙的。
2.接下来对这些完全随机生成的方块按照一定规则进行反复处理。
3.在完全处理过后,会生成一些并不连通的区域,打通他们。
4.在生成入口和出口。

二、随机生成墙和通路

这一段没什么好说的。不过如果按照我的算法来做的话,这个初始随机是墙和通路的概率是多少并无什么太大关系。我分别测试了20%、50%、80%的概率初始生成墙,发现最终的地图区别并没有什么明显的区别。
我的地图是15*15的。首先我定义了一个Map类。它代表着每一个地图的格子。当然这个类我的名字起的并不好,不过我也想不出什么更好的名字了,所以就干脆不变了。这个Map类里面包含这些属性:

public int type = 0;
    //0通路 1墙 2复活点 3上楼点
    public int RoundWallCount = 0;
    public int x;
    public int y;
    //数据结构
    public bool IsVisited = false;

type代表的是当前格子的类型。RoundWallCount指的则是当前格子周围的墙(type==1)的数量。x和y指的是当前格子的坐标。至于IsVisited在后面的打通部分有用处。
首先定义一个Map[,]的二维数组。作为我当前的全部地图。然后对这个地图进行初始化,完全生成一个15*15的地面。

        Object OFloor = Resources.Load("Prefabs/Floor", typeof(GameObject));
        for(int x = 0; x < 15; x++)
        {
   
            for(int y = 0; y < 15; y++)
            {
   
                GameObject GO = Instantiate(OFloor, PFloor) as GameObject;
                GO.transform.position = new Vector3(x, y, 0);
            }
        }

这些地面是完全不需要规则的,只管生成就好。接下来就需要随机生成墙了。

 for (int x = 0; x < 15; x++)
        {
   
            for (int y = 0; y < 15; y++)
            {
   
                Map[x, y] = new Map();
                Map[x, y].x = x;
                Map[x, y].y = y;
                if (Random.Range(0, 100) < 50 ||x == 0 || y == 0 || x == 14 || y == 14)
                {
   
                    Map[x, y].type = 1;
                }
            }
        }

当然我的type的默认值是0.所以如果不是墙,那么并不需要赋值。
我放几张图表示一下这个算法生成的结果

二、循环处理地图

这时候我们发现这张图虽然有点感觉,但是不连通的区域实在是太多了。所以我们要进行一系列算法来修改地图,使这张地图尽可能地连通。
核心算法是这样的。反复进行以下操作:
1.取当前每一个格子周围的墙的数量
2.如果当前格子是墙,那么当他周围的墙<5个或者大于7个时,将其转变为路面
3.如果当前格子是路,那么当他周围的墙>=4个或者小于2个时,把他变成墙

  for (int i = 0; i < 3; i++)
        {
   
            //记录墙的数量
            for (int x = 1; x < 14; x++)
            {
   
                for (int y = 1; y < 14; y++)
                {
   
                    //检查周围一圈墙的数量
                    Map[x, y].RoundWallCount = 0;
                    for (int tx = x - 1; tx < x + 2; tx++)
                    {
   
                        for (int ty = y - 1; ty < y + 2; ty++)
                        {
   
                            if (Map[tx, ty].type == 1)
                            {
   
                                Map[x, y].RoundWallCount 
  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在开发一款名为Tyrant的Roguelike游戏中,作者使用了一种模块化的易于使用的Java RogueLike库,该库提供了多种算法的视野、视线和投影。即将推出的功能包括基于噪声的世界生成、地牢生成和路径查找。这个库的详细信息可以在它的网站上找到。 对于地牢的生成,有一种常见的方法是从一个小的地牢开始,然后慢慢向四周扩散,直到整个地牢形成。这种方法可以满足一些地下城主想要用吊桥、陷阱等来守护房间的需求。通过结合这些算法和方法,可以实现Java算法Roguelike地牢的生成。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [一种 Roguelike 地牢生成算法](https://blog.csdn.net/weixin_33027875/article/details/114039219)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Roguelike library for Java-开源](https://download.csdn.net/download/weixin_42156940/18157263)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值