pssjim 发表于 2013-8-5 08:54:54

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

本帖最后由 pssjim 于 2013-8-5 12:58 AM 编辑

先附上jpg圖檔圖1

圖2

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


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


目前正在:


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

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

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

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

感激不盡

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

pssjim 发表于 2013-8-5 14:35:38

陷阱不用管XD
因為副本很多個
其中只有幾個會有陷阱
陷阱會讓地圖重新更改或是busy自己幾秒

先謝謝回覆,我再看看文章

zues 发表于 2013-8-5 14:58:58

随机生成的迷宫地图,和单个房间的描述没有关系,每个房间的描述都一样。要从给你的那张8X8 map上找算法。

pssjim 发表于 2013-8-5 15:01:25

抱歉,我忘了說
副本地圖都是隨機的
有6X6到1x X 1x的

pssjim 发表于 2013-8-8 07:51:38

請問
是不是要把符號都用string.gsub換成1(或0)
空格都換成0(或1)

然後找出0(或1)的連結
目前只有想到這樣,不過正確的code依然沒有概念orz

alucar 发表于 2013-8-8 08:57:57

首先是把地图连接状况数字化,比如每个房间编个号,记录房间之间是否直接相连
用二维数组还是一维数组在本质上是一样的,二维直观一点,一维感觉写代码会比较方便
每个房间里有什么东西,或者是起点还是终点,这是第二步的事
地图信息数字化后,这种网格状的地图理论上用A-star算法比较好
不过这个地图最多6*6的格子,用Dijkstra算法也不会感觉到什么区别

pssjim 发表于 2013-8-8 09:11:54

首先是把地图连接状况数字化,比如每个房间编个号,记录房间之间是否直接相连
用二维数组还是一维数组在本 ...
alucar 发表于 2013-8-8 12:57 AM http://pkuxkx.net/forum/images/common/back.gif


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


小弟實在是苦手

我玩的mud,因為有多種副本,每個副本地圖的大小不一樣
但是進去同一個副本,每次進去大小都是一樣的,路線不同
又因為喜歡每一格都去,每一格都打怪(遮臉...)
這幾天看的文章,好像是dijkstra比較適合這種方式(但是虛擬碼也是看不懂orz)

alucar 发表于 2013-8-8 09:22:50

俺不会mush,没写过lua yct39.
要是北侠有这种副本俺就用 zmud 或 tintin 写一个玩了
话说写代码只要有基本思路,具体实现方式就看对一种语言的熟悉度了

moonlily 发表于 2013-8-10 16:38:03

maze={}
maze.inpos={}
maze.outpos={}
maze.currpos={}
maze.struct={}
maze.exits={}

on_mazemap=function (n,l,w,s)
        table.insert(maze.struct,w)
        local length=0
        for m, t in pairs (s) do
                length=length+s.length
                for am, at in pairs (s) do
                        if s.text == "★" then
                                maze.currpos.y=table.getn(maze.struct)/2
                                maze.currpos.x=length/4
                        end
                        if s.backcolour == 32768 then
                                maze.inpos.y=table.getn(maze.struct)/2
                                maze.inpos.x=length/4
                        end
                        if s.backcolour == 128 then
                                maze.outpos.y=table.getn(maze.struct)/2
                                maze.outpos.x=length/4
                        end
                        --world.Note ("s["..m.."]["..am.."] = "..s)      
                end
      end
end

maze_exits=function()
        for i=1,table.getn(maze.struct)-1 do
                local y=math.ceil(i/2)
                if i%2 == 1 then
                        maze.exits={}
                        for j=1,string.len(maze.struct)-4,4 do
                                local x=math.ceil(j/4)
                                maze.exits={}
                                if string.sub (maze.struct, j+2 ,j+3) == "" then
                                        maze.exits["way"]=maze.exits["way"] and maze.exits["way"].."n" or "n"
                                        maze.exits["way"]=maze.exits["way"] and maze.exits["way"].."s" or "s"
                                end
                        end
                end
                if i%2 == 0 then
                        for j=1,string.len(maze.struct)-4,4 do
                                local x=math.ceil(j/4)
                                if string.sub (maze.struct, j+4 ,j+5) == "" then
                                        maze.exits["way"]=maze.exits["way"] and maze.exits["way"].."e" or "e"
                                        maze.exits["way"]=maze.exits["way"] and maze.exits["way"].."w" or "w"
                                end

                        end
                end

      end
end

maze_getpath=function()
        x,y=maze.inpos.x,maze.inpos.y
        mazepath=""
        while maze.exits.way do
                waydir=maze.exits.way
                if string.len(waydir) > 1 then
                        if string.sub(waydir,1,1) == backdir then
                                godir=string.sub(waydir,2,2)
                        else
                                godir=string.sub(waydir,1,1)
                        end
                else
                        godir=string.sub(waydir,1,1)
                end
                print(godir)
                currx,curry=x,y
                if godir == "s" then backdir="n";y=y+1 end
                if godir == "n" then backdir="s";y=y-1 end
                if godir == "e" then backdir="w";x=x+1 end
                if godir == "w" then backdir="e";x=x-1 end
                print(godir,curry,currx,maze.exits.way,y,x)
                if maze.exits.way then
                  if string.len(waydir) == 1 then
                        maze.exits["way"]=nil
                        maze.exits["way"]=string.gsub(maze.exits["way"],backdir, "")
                  else
                        maze.exits["way"]=string.gsub(maze.exits["way"],backdir, "")..backdir
                  end
                  if string.sub(mazepath,-1) == backdir then
                        mazepath=string.sub(mazepath,1,-2)
                  else
                        mazepath=mazepath..godir
                        maze.exits["path"]=mazepath
                  end
                end
        end
end


showstruct=function()
        for i,v in pairs(maze.struct) do
                  print(maze.struct)
      end
        Note("入口:"..maze.inpos.y..","..maze.inpos.x.."出口:"..maze.outpos.y..","..maze.outpos.x.."当前:"..maze.currpos.y..","..maze.currpos.x)
        for i,v in pairs(maze.exits) do
                for ii,vv in pairs(maze.exits) do
                        print(i,ii,vv.path)
                end
        end
end


maze_update=function()

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

end
maze_update()

这是我去年玩NT时候做的算迷宫路径的,貌似可以随便从某点到某点,具体记不清了,当时没接触深度广度算法,所以上面的算法乱七八糟的,你可以参考下

moonlily 发表于 2013-8-10 16:39:40

本帖最后由 moonlily 于 2013-8-10 08:44 AM 编辑

思路都已经忘记了,当时初学mush和lua,程序命令都不太熟悉,写的有点乱,大概是将每个房间的出口存入2维数组,然后大概是像深度优先一样,一条路走到底,没路就返回换个方向继续走,直到走到某个设定的坐标点
现在接触了深度广度算法,貌似可以推翻重新写,会比较直观容易。
具体思路还是抓迷宫图,将每个房间的出口连通信息记录下来(2维数组方便直观些),然后根据深度或广度优先算法,算路径很方便的。
页: [1] 2
查看完整版本: [MushClient]迷宮地圖lua寫法問題請教