北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 11122|回复: 11

[MushClient]迷宮地圖lua寫法問題請教

[复制链接]
发表于 2013-8-5 08:54:54 | 显示全部楼层 |阅读模式
本帖最后由 pssjim 于 2013-8-5 12:58 AM 编辑

先附上jpg圖檔圖1

圖2

再附上mud 直接copy的地圖(我還不會copy顏色碼)


迷宮地圖:
白色方塊表示迷宮入口;紅色方塊表示迷宮出口;藍色五角星表示你當前的位置。
青色方塊表示特殊房間;黃色方塊表示有寶箱;紫色方塊表示有陷阱;黃色五角星表示其他玩家當前的位置
┌─┬─┬─┬─┬─┬─┬─┬─┐
│  │  │                  │  │
├  ┼  ┼  ┼─┼  ┼─┼─┼  ┤
│          │          │  │  │
├  ┼─┼─┼─┼  ┼─┼  ┼  ┤
│              │  │          │
├  ┼─┼─┼─┼  ┼  ┼─┼  ┤
│          │  │  │  │      │
├  ┼─┼─┼  ┼  ┼  ┼─┼  ┤
│          │              │  │
├  ┼  ┼  ┼─┼─┼  ┼─┼  ┤
│  │  │★│      │      │  │
├  ┼─┼  ┼  ┼  ┼─┼─┼  ┤
│      │      │          │  │
├  ┼  ┼─┼  ┼  ┼  ┼  ┼─┤
│  │      │  │  │  │      │
└─┴─┴─┴─┴─┴─┴─┴─┘


目前正在:[2,2]


看過文章和網友講解,大概都是要把地圖丟進去table裡
然後用演算法分析...(這個完成看不動,有a star演算法和另一個Dxxxx演算法)

或者是把每一串都用for(這邊也聽不懂)

主要是地圖裡每一格要跑過一遍,因為要打怪和撿東西
地圖一開始,會是圖1的格式,看不到最快路徑,但是地上隨機開寶箱
就會出現圖2格式,是完整的地圖資料
每到一格就檢查要不要打怪-->打完怪或是沒有怪可以打-->撿東西-->換下一格
全部格子都跑完了,就去走出口

不知道有沒有版友可以教教我的
不奢望直接寫出bot,但是希望能指點我要怎麼開始或是要朝什麼方向或是要用哪些lua資料

感激不盡

北大侠客行MUD,中国最好的MUD

本帖子中包含更多资源

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

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-8-5 14:35:38 | 显示全部楼层
陷阱不用管XD
因為副本很多個
其中只有幾個會有陷阱
陷阱會讓地圖重新更改或是busy自己幾秒

先謝謝回覆,我再看看文章
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-8-5 14:58:58 | 显示全部楼层
随机生成的迷宫地图,和单个房间的描述没有关系,每个房间的描述都一样。要从给你的那张8X8 map上找算法。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-8-5 15:01:25 | 显示全部楼层
抱歉,我忘了說
副本地圖都是隨機的
有6X6到1x X 1x的
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-8-8 07:51:38 | 显示全部楼层
請問
是不是要把符號都用string.gsub換成1(或0)
空格都換成0(或1)

然後找出0(或1)的連結
目前只有想到這樣,不過正確的code依然沒有概念orz
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-8-8 08:57:57 | 显示全部楼层
首先是把地图连接状况数字化,比如每个房间编个号,记录房间之间是否直接相连
用二维数组还是一维数组在本质上是一样的,二维直观一点,一维感觉写代码会比较方便
每个房间里有什么东西,或者是起点还是终点,这是第二步的事
地图信息数字化后,这种网格状的地图理论上用A-star算法比较好
不过这个地图最多6*6的格子,用Dijkstra算法也不会感觉到什么区别
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-8-8 09:11:54 | 显示全部楼层
首先是把地图连接状况数字化,比如每个房间编个号,记录房间之间是否直接相连
用二维数组还是一维数组在本 ...
alucar 发表于 2013-8-8 12:57 AM



請問一下
能簡單寫一下lua的寫法嗎?
或是需要用到什麼樣的lua function


小弟實在是苦手

我玩的mud,因為有多種副本,每個副本地圖的大小不一樣
但是進去同一個副本,每次進去大小都是一樣的,路線不同
又因為喜歡每一格都去,每一格都打怪(遮臉...)
這幾天看的文章,好像是dijkstra比較適合這種方式(但是虛擬碼也是看不懂orz)
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-8-8 09:22:50 | 显示全部楼层
俺不会mush,没写过lua
要是北侠有这种副本俺就用 zmud 或 tintin 写一个玩了
话说写代码只要有基本思路,具体实现方式就看对一种语言的熟悉度了
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-8-10 16:38:03 | 显示全部楼层
  1. maze={}
  2. maze.inpos={}
  3. maze.outpos={}
  4. maze.currpos={}
  5. maze.struct={}
  6. maze.exits={}

  7. on_mazemap=function (n,l,w,s)
  8.         table.insert(maze.struct,w[1])
  9.         local length=0
  10.         for m, t in pairs (s) do
  11.                 length=length+s[m].length
  12.                 for am, at in pairs (s[m]) do
  13.                         if s[m].text == "★" then
  14.                                 maze.currpos.y=table.getn(maze.struct)/2
  15.                                 maze.currpos.x=length/4
  16.                         end
  17.                         if s[m].backcolour == 32768 then
  18.                                 maze.inpos.y=table.getn(maze.struct)/2
  19.                                 maze.inpos.x=length/4
  20.                         end
  21.                         if s[m].backcolour == 128 then
  22.                                 maze.outpos.y=table.getn(maze.struct)/2
  23.                                 maze.outpos.x=length/4
  24.                         end
  25.                         --world.Note ("s["..m.."]["..am.."] = "..s[m][am])        
  26.                 end
  27.         end
  28. end

  29. maze_exits=function()
  30.         for i=1,table.getn(maze.struct)-1 do
  31.                 local y=math.ceil(i/2)
  32.                 if i%2 == 1 then
  33.                         maze.exits[y]={}
  34.                         for j=1,string.len(maze.struct[i])-4,4 do
  35.                                 local x=math.ceil(j/4)
  36.                                 maze.exits[y][x]={}
  37.                                 if string.sub (maze.struct[i], j+2 ,j+3) == "  " then
  38.                                         maze.exits[y][x]["way"]=maze.exits[y][x]["way"] and maze.exits[y][x]["way"].."n" or "n"
  39.                                         maze.exits[y-1][x]["way"]=maze.exits[y-1][x]["way"] and maze.exits[y-1][x]["way"].."s" or "s"
  40.                                 end
  41.                         end
  42.                 end
  43.                 if i%2 == 0 then
  44.                         for j=1,string.len(maze.struct[i])-4,4 do
  45.                                 local x=math.ceil(j/4)
  46.                                 if string.sub (maze.struct[i], j+4 ,j+5) == "  " then
  47.                                         maze.exits[y][x]["way"]=maze.exits[y][x]["way"] and maze.exits[y][x]["way"].."e" or "e"
  48.                                         maze.exits[y][x+1]["way"]=maze.exits[y][x+1]["way"] and maze.exits[y][x+1]["way"].."w" or "w"
  49.                                 end

  50.                         end
  51.                 end

  52.         end
  53. end

  54. maze_getpath=function()
  55.         x,y=maze.inpos.x,maze.inpos.y
  56.         mazepath=""
  57.         while maze.exits[y][x].way do
  58.                 waydir=maze.exits[y][x].way
  59.                 if string.len(waydir) > 1 then
  60.                         if string.sub(waydir,1,1) == backdir then
  61.                                 godir=string.sub(waydir,2,2)
  62.                         else
  63.                                 godir=string.sub(waydir,1,1)
  64.                         end
  65.                 else
  66.                         godir=string.sub(waydir,1,1)
  67.                 end
  68.                 print(godir)
  69.                 currx,curry=x,y
  70.                 if godir == "s" then backdir="n";y=y+1 end
  71.                 if godir == "n" then backdir="s";y=y-1 end
  72.                 if godir == "e" then backdir="w";x=x+1 end
  73.                 if godir == "w" then backdir="e";x=x-1 end
  74.                 print(godir,curry,currx,maze.exits[y][x].way,y,x)
  75.                 if maze.exits[y][x].way then
  76.                   if string.len(waydir) == 1 then
  77.                         maze.exits[curry][currx]["way"]=nil
  78.                         maze.exits[y][x]["way"]=string.gsub(maze.exits[y][x]["way"],backdir, "")
  79.                   else
  80.                         maze.exits[y][x]["way"]=string.gsub(maze.exits[y][x]["way"],backdir, "")..backdir
  81.                   end
  82.                   if string.sub(mazepath,-1) == backdir then
  83.                         mazepath=string.sub(mazepath,1,-2)
  84.                   else
  85.                         mazepath=mazepath..godir
  86.                         maze.exits[y][x]["path"]=mazepath
  87.                   end
  88.                 end
  89.         end
  90. end


  91. showstruct=function()
  92.         for i,v in pairs(maze.struct) do
  93.                     print(maze.struct[i])
  94.         end
  95.         Note("入口:"..maze.inpos.y..","..maze.inpos.x.."出口:"..maze.outpos.y..","..maze.outpos.x.."当前:"..maze.currpos.y..","..maze.currpos.x)
  96.         for i,v in pairs(maze.exits) do
  97.                 for ii,vv in pairs(maze.exits[i]) do
  98.                         print(i,ii,vv.path)
  99.                 end
  100.         end
  101. end


  102. maze_update=function()

  103.         addtri("maze_struct","^([┌│├└].+[┐│┤┘])$","maze","on_mazemap")

  104. end
  105. maze_update()

复制代码
这是我去年玩NT时候做的算迷宫路径的,貌似可以随便从某点到某点,具体记不清了,当时没接触深度广度算法,所以上面的算法乱七八糟的,你可以参考下
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-8-10 16:39:40 | 显示全部楼层
本帖最后由 moonlily 于 2013-8-10 08:44 AM 编辑

思路都已经忘记了,当时初学mush和lua,程序命令都不太熟悉,写的有点乱,大概是将每个房间的出口存入2维数组,然后大概是像深度优先一样,一条路走到底,没路就返回换个方向继续走,直到走到某个设定的坐标点
现在接触了深度广度算法,貌似可以推翻重新写,会比较直观容易。
具体思路还是抓迷宫图,将每个房间的出口连通信息记录下来(2维数组方便直观些),然后根据深度或广度优先算法,算路径很方便的。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 07:51 AM , Processed in 0.010638 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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