查看: 78|回复: 0

[转载发布] 随机迷宫生成[深度/广度]

[复制链接]
  • TA的每日心情
    开心
    5 天前
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月六日(秋) | 显示全部楼层 |阅读模式
    唔 我来6R好像没怎么发过东西呢 只知道用别人的 ..偶尔还是来一发做做贡献吧 不然觉得有点对不起大家呢OTZ
    此货为迷宫生成算法,应该算是比较完善了吧
    不知道有人写过没有 不过由于鄙人阅读脚本的能力甚是太好,别人写的基本都看不懂OTZ Umm..所以还是自己写好了
    脚本如下:
    RUBY 代码
    1. #==============================================================================
    2. # ■ Random_Maze
    3. #------------------------------------------------------------------------------   
    4. #   使用说明书:
    5. #     效果:生成一个随机迷宫数组。(0:地 1:墙)
    6. #     用法:
    7. #        广度优先 --> prim(X最大值,Y最大值,起始X[可省略],起始Y[可省略])
    8. #        深度优先 --> depth(X最大值,Y最大值,起始X[可省略],起始Y[可省略])
    9. #     制作:永远的塞尔达传说(7408) [2015.1.2]
    10. #==============================================================================
    11. class Random_Maze
    12.   #--------------------------------------------------------------------------
    13.   # ● 定义实例变量
    14.   #--------------------------------------------------------------------------
    15.   attr_reader   :pos_x                    # 当前 X 坐标
    16.   attr_reader   :pos_y                    # 当前 Y 坐标
    17.   attr_reader   :list                     # 可通行列表
    18.   attr_reader   :mark                     # 标记列表
    19.   attr_accessor :maze                     # 迷宫
    20.   #--------------------------------------------------------------------------
    21.   # ● 初始化对像
    22.   #--------------------------------------------------------------------------
    23.   def        initialize
    24.                 @maze = []
    25.         end
    26.   #--------------------------------------------------------------------------
    27.   # ● 广度优先
    28.   #--------------------------------------------------------------------------
    29.   def prim(xmax,ymax,start_x = nil,start_y = nil)
    30.     # 初始化
    31.     @maze = []
    32.     start_x = rand(xmax + 1)if start_x == nil
    33.     start_y = rand(ymax + 1)if start_y == nil
    34.     for x in0..xmax
    35.       @maze[x] = []
    36.       for y in0..ymax
    37.         @maze[x][y] = 1
    38.       end
    39.     end
    40.     @maze[start_x][start_y] = 0
    41.     @list = adjacent_wall(start_x,start_y)
    42.     # 生成迷宫
    43.     while !@list.empty?
    44.       id = rand(@list.size-1)
    45.       x = @list[id][0]
    46.       y = @list[id][1]
    47.       d = @list[id][2]
    48.       new_x = x + (d == 3 ? 1 : (d == 2 ? -1 : 0))
    49.       new_y = y + (d == 1 ? 1 : (d == 4 ? -1 : 0))
    50.       # 如果前面也为墙
    51.       if exist?(new_x,new_y)and@maze[new_x][new_y] == 1
    52.         @maze[x][y] = 0
    53.         @maze[new_x][new_y] = 0
    54.         @list = @list + adjacent_wall(new_x,new_y)
    55.         @list.delete_at(id)
    56.       else
    57.         @list.delete_at(id)
    58.       end
    59.     end
    60.     # 返回迷宫
    61.     return@maze.clone
    62.   end
    63.   #--------------------------------------------------------------------------
    64.   # ● 深度优先
    65.   #--------------------------------------------------------------------------
    66.   def depth(xmax,ymax,pos_x = nil,pos_y = nil)
    67.     # 初始化
    68.     @maze = []
    69.     pos_x = rand(xmax + 1)if pos_x == nil
    70.     pos_y = rand(ymax + 1)if pos_y == nil
    71.     for x in0..xmax
    72.       @maze[x] = []
    73.       for y in0..ymax
    74.         @maze[x][y] = 1
    75.       end
    76.     end
    77.     @pos_x = pos_x
    78.     @pos_y = pos_y
    79.     @maze[pos_x][pos_y] = 0
    80.     [url=home.php?mod=space&uid=25204]@mark[/url] = []
    81.     # 生成迷宫
    82.     while not_full?
    83.       all = passage_way(@pos_x,@pos_y)
    84.       if all.empty?
    85.         @pos_x,@pos_y = @mark.pop
    86.       else
    87.         coord = all[rand(all.size) - 1]
    88.         @maze[coord[0]][coord[1]] = 0
    89.         @maze[coord[2]][coord[3]] = 0
    90.         @pos_x = coord[2]
    91.         @pos_y = coord[3]
    92.         @mark.push([@pos_x,@pos_y])
    93.       end
    94.     end
    95.     # 返回迷宫
    96.     return@maze.clone
    97.   end
    98.   #--------------------------------------------------------------------------
    99.   # ● 存在否?
    100.   #--------------------------------------------------------------------------
    101.   def exist?(x,y)
    102.     returnfalseif(x < 0)or(x >= @maze.size)or(y < 0)or(y >= @maze[0].size)
    103.     returntrue
    104.   end
    105.   #--------------------------------------------------------------------------
    106.   # ● 满否?
    107.   #--------------------------------------------------------------------------
    108.   def not_full?
    109.     delta_x = (@pos_x % 2 == 1 ? 1 : 0)
    110.     delta_y = (@pos_y % 2 == 1 ? 1 : 0)
    111.     xmax = (@maze.size / 2).floor
    112.     ymax = (@maze[0].size / 2).floor
    113.     for x in0...xmax
    114.       for y in0...ymax
    115.         returntrueif@maze[x * 2 + delta_x][y * 2 + delta_y] == 1
    116.       end
    117.     end
    118.     returnfalse
    119.   end
    120.   #--------------------------------------------------------------------------
    121.   # ● Mark中存在此坐标否?
    122.   #--------------------------------------------------------------------------
    123.   def marked_coord?(x,y)
    124.     @mark.eachdo |this|
    125.       if this[0] == x and this[1] == y
    126.         returntrue
    127.       end
    128.     end
    129.     returnfalse
    130.   end
    131.   #--------------------------------------------------------------------------
    132.   # ● 取得所有通路
    133.   #--------------------------------------------------------------------------
    134.   def passage_way(x,y)
    135.     result = []
    136.     # 循环四个方向
    137.     for d in1..4
    138.       new_x_a = x + (d == 3 ? 1 : (d == 2 ? -1 : 0))
    139.       new_y_a = y + (d == 1 ? 1 : (d == 4 ? -1 : 0))
    140.       new_x_b = x + (d == 3 ? 2 : (d == 2 ? -2 : 0))
    141.       new_y_b = y + (d == 1 ? 2 : (d == 4 ? -2 : 0))
    142.       if exist?(new_x_b,new_y_b)and@maze[new_x_b][new_y_b] == 1and !marked_coord?(new_x_b,new_y_b)
    143.         result.push([new_x_a,new_y_a,new_x_b,new_y_b])
    144.       end
    145.     end
    146.     return result
    147.   end
    148.   #--------------------------------------------------------------------------
    149.   # ● 获取相邻的墙壁
    150.   #--------------------------------------------------------------------------
    151.   def adjacent_wall(x,y)
    152.     result = []
    153.     # 循环四个方向
    154.     for d in1..4
    155.       new_x = x + (d == 3 ? 1 : (d == 2 ? -1 : 0))
    156.       new_y = y + (d == 1 ? 1 : (d == 4 ? -1 : 0))
    157.       if exist?(new_x,new_y)and@maze[new_x][new_y] == 1
    158.         result.push([new_x,new_y,d])
    159.       end
    160.     end
    161.     # 返回结果
    162.     return result
    163.   end
    164. end
    复制代码


    范例:



    具体看范例吧~嗯嗯 谢谢大家
                 本帖来自P1论坛作者7408,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=375096  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2024-5-15 04:17 , Processed in 0.059857 second(s), 42 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表