北大侠客行MUD论坛

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

跪求 mush lua 迷宮地圖 點到點的寫法

[复制链接]
发表于 2015-10-6 20:00:57 | 显示全部楼层 |阅读模式
本帖最后由 stu 于 2015-10-6 03:27 PM 编辑

小弟我沒程式語言基礎,從zmud跳過來mush,只會一些簡單的lua寫法
因nt系列的mud內迷宮大小不一定,所以想請教會的大大們該怎麼去弄

迷宮範本如下:
┌─┬─┬─┬─┬─┬─┬─┬─┐
│  │  │                  │  │
├  ┼  ┼  ┼─┼  ┼─┼─┼  ┤
│          │          │  │  │
├  ┼─┼─┼─┼  ┼─┼  ┼  ┤
│              │  │          │
├  ┼─┼─┼─┼  ┼  ┼─┼  ┤
│          │  │  │  │      │
├  ┼─┼─┼  ┼  ┼  ┼─┼  ┤
│          │              │  │
├  ┼  ┼  ┼─┼─┼  ┼─┼  ┤
│  │  │  │      │      │  │
├  ┼─┼  ┼  ┼  ┼─┼─┼  ┤
│      │      │          │  │
├  ┼  ┼─┼  ┼  ┼  ┼  ┼─┤
│  │      │  │  │  │      │
└─┴─┴─┴─┴─┴─┴─┴─┘
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-10-8 08:05:09 | 显示全部楼层
对于这类,正规的迷宫,采取一手扶墙策略可以遍历走出。
对于非正规的(存在回环,实时随机变换),就只能随机碰运气了。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-10-8 08:28:25 | 显示全部楼层
扶着墙进去,扶着墙出来么?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-10-8 08:30:17 | 显示全部楼层
随机走,总会出来的
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-10-8 09:32:34 | 显示全部楼层
本帖最后由 stu 于 2015-10-8 08:58 AM 编辑

假如地圖範例如下 :

┌─┬─┬─┬─┬─┐
│  │  │      │  │
├  ┼  ┼  ┼  ┼  ┤
│          │  │  │
├  ┼─┼─┼  ┼  ┤
│  │  │★   │  │
├  ┼  ┼  ┼─┼  ┤
│      │          │
├  ┼  ┼─┼  ┼─┤
│  │      │      │
└─┴─┴─┴─┴─┘
★:代表當前位置

小弟我將上圖轉成數字陣列
1,0,1,0,1,1,1,0,1
1,0,1,0,1,0,1,0,1
1,1,1,1,1,0,1,0,1
1,0,0,0,0,0,1,0,1
1,0,1,0,2,1,1,0,1
1,0,1,0,1,0,0,0,1
1,1,1,0,1,1,1,1,1
1,0,1,0,0,0,1,0,0
1,0,1,1,1,0,1,1,1

0:無路
1:有路
2:當前未置

弄成座標位置是:
座標位置 = {東,西,南,北}
map[0][0] = {0,0,0,1}
map[0][1] = {1,0,0,1}
map[0][2] = {0,1,0,0}
map[0][3] = {1,0,0,1}
map[0][4] = {0,1,0,0}
map[1][0] = {1,0,1,1}
map[1][1] = {0,1,1,1}
map[1][2] = {1,0,0,1}
map[1][3] = {1,1,1,0}
map[1][4] = {0,1,0,1}
map[2][0] = {0,0,1,1}
map[2][1] = {0,0,1,0}
map[2][2] = {1,0,1,0}
map[2][3] = {0,1,0,1}
map[2][4] = {0,0,1,1}
map[3][0] = {1,0,1,1}
map[3][1] = {1,1,0,1}
map[3][2] = {0,1,0,1}
map[3][3] = {0,0,1,1}
map[3][4] = {0,0,1,1}
map[4][0] = {0,0,1,0}
map[4][1] = {0,0,1,0}
map[4][2] = {1,0,1,0}
map[4][3] = {0,1,1,0}
map[4][4] = {0,0,1,0}

左下角座標是0,0  右上角座標是4,4
如要從當前座標點2,2 走到座標點0,4的話
這部分的程式該怎麼著手去寫呢?
請各位大大幫忙解惑一下,謝謝 !
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-10-9 17:50:08 | 显示全部楼层
有人告知說用遞迴的方式寫function出來跑
但沒寫過function 也不知道遞迴的概念
能請各位大大教一下小弟我該怎麼寫嗎  XD
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-10-22 16:22:56 | 显示全部楼层
請問各位大大,下方的演算法如果要用lua表示  該怎麼寫呢??
Procedure GO(maze[])
    VISIT(maze, START_I, START_J, END_I, END_J)
   
Procedure VISIT(maze[], i, j, end_i, end_j)
    IF maze[i][j] == 0
        maze[i][j] = 1
        IF maze[end_i][end_j] == 0
           IF !(VISIT(maze, i, j + 1, end_i, end_j) OR
                VISIT(maze, i + 1, j, end_i, end_j) OR
                VISIT(maze, i, j - 1, end_i, end_j) OR
                VISIT(maze, i - 1, j, end_i, end_j))
               maze[i][j] = 0
    RETURN maze[end_i][end_j] == 1
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-10-24 09:09:59 | 显示全部楼层
本帖最后由 littleknife 于 2015-10-24 09:11 AM 编辑

回复 7# stu,未测试不一定正确:

  1. function GO(maze, START_I, START_J, END_I, END_J)
  2.     VISIT(maze, START_I, START_J, END_I, END_J)
  3. end
  4.    
  5. function VISIT(maze, i, j, end_i, end_j)
  6.     if maze[i][j] == 0        then
  7.         maze[i][j] = 1
  8.         if maze[end_i][end_j] == 0        then
  9.            if (VISIT(maze, i, j + 1, end_i, end_j)==nil or
  10.                 VISIT(maze, i + 1, j, end_i, end_j) or
  11.                 VISIT(maze, i, j - 1, end_i, end_j) or
  12.                 VISIT(maze, i - 1, j, end_i, end_j))        then
  13.                maze[i][j] = 0
  14.                         end
  15.                 end
  16.         end
  17.     return maze[end_i][end_j] == 1
  18. end
复制代码
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-27 06:09 AM , Processed in 0.010028 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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