[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 陷阱不用管XD
因為副本很多個
其中只有幾個會有陷阱
陷阱會讓地圖重新更改或是busy自己幾秒
先謝謝回覆,我再看看文章 随机生成的迷宫地图,和单个房间的描述没有关系,每个房间的描述都一样。要从给你的那张8X8 map上找算法。 抱歉,我忘了說
副本地圖都是隨機的
有6X6到1x X 1x的 請問
是不是要把符號都用string.gsub換成1(或0)
空格都換成0(或1)
然後找出0(或1)的連結
目前只有想到這樣,不過正確的code依然沒有概念orz 首先是把地图连接状况数字化,比如每个房间编个号,记录房间之间是否直接相连
用二维数组还是一维数组在本质上是一样的,二维直观一点,一维感觉写代码会比较方便
每个房间里有什么东西,或者是起点还是终点,这是第二步的事
地图信息数字化后,这种网格状的地图理论上用A-star算法比较好
不过这个地图最多6*6的格子,用Dijkstra算法也不会感觉到什么区别 首先是把地图连接状况数字化,比如每个房间编个号,记录房间之间是否直接相连
用二维数组还是一维数组在本 ...
alucar 发表于 2013-8-8 12:57 AM http://pkuxkx.net/forum/images/common/back.gif
請問一下
能簡單寫一下lua的寫法嗎?
或是需要用到什麼樣的lua function
小弟實在是苦手
我玩的mud,因為有多種副本,每個副本地圖的大小不一樣
但是進去同一個副本,每次進去大小都是一樣的,路線不同
又因為喜歡每一格都去,每一格都打怪(遮臉...)
這幾天看的文章,好像是dijkstra比較適合這種方式(但是虛擬碼也是看不懂orz) 俺不会mush,没写过lua yct39.
要是北侠有这种副本俺就用 zmud 或 tintin 写一个玩了
话说写代码只要有基本思路,具体实现方式就看对一种语言的熟悉度了 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 08:44 AM 编辑
思路都已经忘记了,当时初学mush和lua,程序命令都不太熟悉,写的有点乱,大概是将每个房间的出口存入2维数组,然后大概是像深度优先一样,一条路走到底,没路就返回换个方向继续走,直到走到某个设定的坐标点
现在接触了深度广度算法,貌似可以推翻重新写,会比较直观容易。
具体思路还是抓迷宫图,将每个房间的出口连通信息记录下来(2维数组方便直观些),然后根据深度或广度优先算法,算路径很方便的。
页:
[1]
2