搜索附件  
同能RPG制作大师 附件中心 同能RM技术讨论区 RPG Maker XP 讨论区 随机迷宫生成[深度/广度]: d1.png

随机迷宫生成[深度/广度]: d1.png

 

随机迷宫生成[深度/广度]:
唔 我来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在线咨询功能删除,谢谢。
随机迷宫生成[深度/广度]: d1.png

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

GMT+8, 2024-9-21 17:58 , Processed in 0.038990 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部