
ãŸããã
â
ååã ããã HabrãªãŒãã£ãšã³ã¹ã®åå¿ãè©äŸ¡ããåé¡ãæŽçãããµã€ã¯ã«ã®2çªç®ã®èšäºãæžãå§ããŸããã 倧è¡ã®åå¿ã¯ç§ã®æ³å®ãããã¯ããã«è¯å®çã§ãããã€ãŸããæç¶ãçæã®æãè峿·±ããããã¯ã®1ã€ã§ããè¿·è·¯ã®äœæã«ã€ããŠäŒè©±ãç¶ããŠããŸãã
ãã®ããŒãã§ã¯ãã©ã³ãã ããã³æ¬äŒŒã©ã³ãã çæãšã¯äœããã¢ã«ãŽãªãºã ã¯äºãã«åçã«ç°ãªãè¿·è·¯ãäžããããšãã§ãããã®ãããã³ãããã®äžå©ãªç¹ã«ã€ããŠèª¬æããŸãã 仿¥ã®åéºã®ããŒããŒã¯ããŠã£ã«ãœã³ã¢ã«ãŽãªãºã ãšã©ã³ãã ã¹ããã³ã°ããªãŒïŒåäžã¹ããã³ã°ããªãŒïŒãäœæããããã®Aldous-Broderã¢ã«ãŽãªãºã ã§ãã
泚æãã©ãã£ã㯠ã
åé¡ã®çæ³çãªè¿·è·¯ãäœã§ããããæãåºããŸãããã ã°ã©ãã®åé ç¹ããä»ã®é ç¹ãŸã§æ£ç¢ºã«1ã€ã®ãã¹ããããåããšããžã2åééããã«ãã¹ãŠã®é ç¹ãééã§ããªãå Žåããã®ãããªã°ã©ãã
ã¹ããã³ã°ããªãŒãšåŒã³
ãŸã ã åã»ã«ããä»ã®ã»ã«ãžã®æ€èšäžã®ã©ããªã³ã¹ã§ãæ£ç¢ºã«1ã€ã®éè·¯ããããåãå»äžã2åééããããšãªããã¹ãŠã®ã»ã«ã蚪ããããšãã§ããªãå Žåããã®ãããªã©ããªã³ã¹ã
çæ³çã§ãããšèšããŸãã æå³ã¯1ã€ã®ç°¡åãªçç±ã§å€ãããŸãããè¿·å®®ã¯ã°ã©ãã§ãããåã®èšäºã§æžããŸããã ãŸã èªãã§ããªãå Žåã¯ãå
ã«é²ãåã«ããå°ãäžã«ã¹ã¯ããŒã«ãããªã³ã¯ããã©ã£ãŠãããããçè§£ããããšã匷ããå§ãããŸãã
ãŸãããã®ããŒãã§ç޹ä»ããã¢ã«ãŽãªãºã ã¯éåžžã«äœéã§ãæããªããã®ã§ããããããã¯å
šäœããã³ç§ã®ãã¹ãŠã®èšäºã®åºç€ã§ããããã察åŠããå¿
èŠããããŸãã ç§ãããã«åœŒãããå§ããªãã£ãäž»ãªçç±ã¯ããŠã£ã«ãœã³ã¯åå¿è
ã«ãšã£ãŠéåžžã«ç°¡åã«å®è£
ããã³çè§£ããããšãã§ããããããåœŒã®æ¥µç«¯ãªå¥œå¥å¿ã劚ãããã®ã§ã¯ãªãããã§ãã
Luaã«ã€ããŠãŠã£ã«ãœã³ã®ã¢ã«ãŽãªãºã ããããŠãããããç§ãæžããŠããä»ã®ããã€ãã®ã¢ã«ãŽãªãºã ã§ã¯ã次ã®ïŒããŒãã«[ãã€ã³ããã¯ã¹]ïŒé¢æ°ã䜿çšããŠããŸã ã¢ã¯ã»ã¹ãããŠããªãã©ã³ãã ãªã»ã«ãéžæããŸãã ãã®èª¬æã¯ãLuaã®å
¬åŒããã¥ã¡ã³ãããã®ãã®ã§ãã
ã¢ããªã±ãŒã·ã§ã³ãããŒãã«å
ã®ãã¹ãŠã®ãã£ãŒã«ããååŸã§ããããã«ããŸãã æåã®ãã©ã¡ãŒã¿ãŒã¯ããŒãã«ã2çªç®ã¯ãã®ããŒãã«ã®ã€ã³ããã¯ã¹ã§ãã nextã¯ãããŒãã«å
ã®æ¬¡ã®ã€ã³ããã¯ã¹ãšããã«å¯Ÿå¿ããå€ãè¿ããŸãã 2çªç®ã®ãã©ã¡ãŒã¿ãŒãnilã®å Žåãnextã¯éå§ã€ã³ããã¯ã¹ãšããã«é¢é£ä»ããããå€ãè¿ããŸãã æåŸã®ã€ã³ããã¯ã¹ãåŒã³åºããããšãããŸãã¯ç©ºã®ããŒãã«ã«nilãããå Žåãnextã¯nilãè¿ããŸãã 2çªç®ã®ãã©ã¡ãŒã¿ãŒãæ¬ èœããŠããå ŽåãnilãšããŠè§£éãããŸãã ç¹ã«ãnextïŒtïŒã䜿çšããŠãããŒãã«ã空ãã©ããã確èªã§ããŸãã
ãããã£ãŠãmath.randomã䜿çšããŠã»ã«ãéžæããåŠçããããã©ããã確èªããããã¹ã¿ãã¯ããŒãã«ã®ã¹ã¿ãã¯ã䜿çšããŠããã·ã¥ããŒãã«ã§ãã®å Žæã远跡ãã代ããã«ã座æšã§ããã·ã¥ãããããŒã1ã€ã ã䜿çšã§ããŸã次ããèŠçŽ ãåãåºããŸãã
key = next(cellsHash, nil) local start_x, start_y = aux.deHashKey(key) cellsHash[key] = nil â , nil /
å€äœãšã©ã³ãã æ§
ã©ã³ãã çæãšã¯ã©ãããæå³ã§ããïŒ 2çªç®ã®ã©ããªã³ã¹ã§ã1çªç®ãšã¯ç°ãªããåã«2ã€ã®å£ããªãå Žåããããã¯å®å
šã«ã©ã³ãã ã§ãããšèšããŸããïŒ ãŸãã¯ãæåã®è¿·è·¯ã«ããã«2ã€ã®æ°Žå¹³éè·¯ãããå Žåã¯ã©ãã§ããããïŒ ã¯ãããããã
ã©ããªã³ã¹ã®ã©ã³ãã æ§ãšããã°ãç§ãã¡ãäœãæå³ããã®ããæç¢ºã«èªèããªããã°ãªããŸããã äºåæšã¢ã«ãŽãªãºã ã®çµæãèŠãŠã¿ãŸãããïŒ


ã芧ã®ãšãããã©ããªã³ã¹èªäœã¯å®å
šã«ç°ãªããŸãããå€äœã¯ãããã«ç°ãªããŸãã
ã©ã³ãã ãªçµæãåŸãããŸãããïŒ ã¯ã 圌ããã®ããã«èããããšã¯ã§ããŸããïŒ ãŸããç§ã®æèŠã§ã¯ããããã
åé¡ã¯ãã€ã¢ã¹ã§ããããããäž»ã«ãã©ã³ãã æ§ããæ±ºå®ããŸãã å®çŸ©äžãã©ã³ãã ãªè¿·è·¯ãäœæããæçµçã«åæ§ã®è¿·è·¯ãäœæããã¢ã«ãŽãªãºã ã ãã€ããªããªãŒã®ããã«ãé¡äŒŒæ§ããçºé³ãããå Žåããã®ãããªè¿·è·¯ã¯ç°¡åã«è§£æ±ºããããšèšããŸãã ããã€ãã®ã©ããªã³ã¹ãæ¯èŒãããšãã«ãã¢ã«ãŽãªãºã ãäœã«åŒãä»ããããããæç¢ºã«èšãããšãé£ããå Žåããã®ãããªã©ããªã³ã¹ã解決ããã®ã¯ããé£ãããšèšããŸãã ãã€ã¢ã¹ãèŠã€ããã«ã¯ãçæã®ããã€ãã®çµæãæ¯èŒãããã®ã¿ã€ãã®è¿·è·¯ã解決ããããã«ãããã¹ããŒããªãã¹ãŸãã¯èªåèªèº«ã®æ€çŽ¢ãäœæã§ããçµ±èšã¢ãã«ãæ§ç¯ããå¿
èŠããããŸãã ããšãã°ãäºåæšã¢ã«ãŽãªãºã ã«ã¯ãåçŽæ¹åã®éè·¯ã®nåã®æ°Žå¹³æ¹åã®éè·¯ããããšèšããŸãã ããã¯ãããŒã¿ãèæ
®ã«å
¥ããŠãåºå£ãèŠã€ããããã»ã¹ãé«éåã§ããããšãæå³ããŸãã
ãããããã€ã¢ã¹ããŸã£ããå¿
èŠãšããªãå Žåã¯ã©ãã§ããããïŒ ããšãã°ãã°ã©ãã®æ¥ç¶ãããŠããªã9åã®ãã€ã³ããããä»ãšã¯ãŸã£ããç°ãªãã¹ããã³ã°ããªãŒãååŸãããã³ã«ã 次ã«ãã¢ã«ãŽãªãºã ã®åæ¹åãåçã«ãªãå¿
èŠããããŸãã ããã¯ããã§ã«å®äºããããŒã¯ãééã§ããããšãæå³ããŸãããããã£ãŠããµã€ã¯ã«ã®åå埩ã§ãããã«ãããã©ããã«é¢ä¿ãªãã4ã€ã®æ¹åã®ãããããã©ã³ãã ã«éžæããŸãã å¯äžã®æ¡ä»¶ã¯ããã£ãŒã«ããè¶
ããªãããšã§ãã
çšèªãŠããã©ãŒã ã¹ããã³ã°ããªãŒãšããã°ã ã¹ããã³ã°ããªãŒãäœã§ãããã¯æ¢ã«ããã£ãŠããŸãã ã°ã©ãã®ãã¹ãŠã®é ç¹ããšããžã§æ¥ç¶ããåããšããžã2åééããã«é ç¹ããå¥ã®é ç¹ã«å°éã§ããªãããã«ãããšãã¹ããã³ã°ããªãŒãäœæãããŸãã ããããã°ã©ãã«3ã€ä»¥äžã®é ç¹ãããå Žåãããã«å€ãã®ããªãŒããªãšãŒã·ã§ã³ããããããããŸããã ãã®ãããåäžã¹ããã³ã°ããªãŒã¯ãç¹å®ã®ã°ã©ãã«ãããã¹ããã³ã°ããªãŒã®ããªãšãŒã·ã§ã³ã®1ã€ã§ãã
ãªã©ã äºãã«å®å
šã«ç°ãªãå®å
šã«ã©ã³ãã ãªã©ããªã³ã¹ãå¿
èŠã§ãããé床ãç ç²ã«ããæºåããã§ããŠããŸãã ããã§ã¯ãAldous-Broderã¢ã«ãŽãªãºã ãšWilsonã¢ã«ãŽãªãºã ã«ã€ããŠçè§£ããŸãããã
Aldous-Broderã¢ã«ãŽãªãºã

説æäºåæšã¢ã«ãŽãªãºã ãæãçè§£ãããããšèšã£ãããšãèŠããŠããŸããïŒ ã ãããç§ã¯cã§ããã åžžã«èæ
®ããŠããã®ã¯1ã€ã®æ¹åãš1ã€ã®åŽé¢ã®ã¿ãæ±ããããå®è£
ã¯éåžžã«ç°¡åã§ãããåå§æ§ãšãæãããã§ã¯Aldous-Broderã¢ã«ãŽãªãºã ãã¯ããã«é²ãã§ããŸãã ãã®å
šäœã®ãã€ã³ãã¯ãäœæãããã¹ããã³ã°ããªãŒã®äžéšã«ã€ãŸãããŠå¥ã®ãã€ã³ããåãä»ããããšãæåŸ
ããŠããã£ãŒã«ãããã¡ãã¡æ©ãåããåã³ã©ã³ãã ã«è¿·è·¯ã®ãã€ã³ããéžæããæ¥ç¶ããããã®ã®1ã€ã«å
¥ããŸã§æ©ãããšã§ãã
Aldous-Broderã«ã¯ãã€ã¢ã¹ããããŸããã 絶察ã«ã ãã®å©ããåããŠåŸãããè¿·è·¯ã¯ãã¹ãŠå®å
šã«ã©ã³ãã ã§ããã䌌ãŠããŸããã ã¢ã«ãŽãªãºã ã«ã¯ãæ¹åæ§ããšã³ã¿ã³ã°ã«ã¡ã³ãããŸãã¯ãã®ä»ã®ç¹æ§ã®å¥œã¿ã¯ãããŸããã çµæã®ã©ããªã³ã¹ã¯ã©ã³ãã ã§ãããåæ§ã«çºçããå¯èœæ§ããããŸãã
åé¡ã¯ãä¹±æ°ãžã§ãã¬ãŒã¿ãŒã®æ¬ é¥ã§ããå¯èœæ§ããããŸããä¹±æ°ãžã§ãã¬ãŒã¿ãŒèªäœã¯ãããã€ãã®å€ã«åŒãå¯ããããããé »ç¹ã«å€ãäžããå ŽåããããŸãã ããããããšãã°ãèªç¶ãã€ãºïŒé¢šããŠã©ã³åŽ©å£ïŒã«åºã¥ããã©ã³ãã ãžã§ãã¬ãŒã¿ãŒã䜿çšããå Žåããããããã¢ã«ãŽãªãºã ã®æäœãæçµçã«å®å
šã«æ¥œããããšãã§ããŸãã
確ãã«ã圌ã®äœåã芳å¯ããããšã¯ãååšã®ãã¹ãŠã®è
ææ§ãšç¡æå³ãã®çã®èªèãäžããŸãã 圌ã¯5Ã5ã®ãã£ãŒã«ãã§30ç§ã«åãŸããããªãã£ããããã¢ãã¡ãŒã·ã§ã³ã§gifãèšé²ããã®ã«å€ãã®æéãè²»ãããŸããã æåŸã®1ã€ã®æªãã§ãã¯ã®ã»ã«ã®ã¿ãã¹ããã³ã°ããªãŒã«æ¥ç¶ãç¶ãããšãAldous-Broderã¯å¥ã®ã³ãŒããŒã«è¡ããããã§åãã©ããããŸããã æçµçã«åœŒã¯è¿·è·¯ã®ãã¹ãŠã®ã»ã«ãåãããšãã§ããããã«ãã¢ãã¡ãŒã·ã§ã³ã®é床ã倧å¹
ã«äžãããã£ãŒã«ããæžããå¿
èŠããããŸããã
ããã¯ãã¹ããã³ã°ããªãŒã®åçã®å¯èœæ§ã®ããå€çš®ãç ç©¶ãã2人ã®ç¬ç«ããç ç©¶è
ã«ãã£ãŠäœæãããŸãããã«ãªãã©ã«ãã¢å€§åŠããŒã¯ã¬ãŒæ ¡ã®ææã§ããDavid AldousãšãçŸåšGoogleã§åããŠããç§åŠè
ã®Andrei Broderã§ãã ãããã®ç ç©¶ãã©ã®åéã§åœ¹ç«ã€ããæç¢ºã«èšãããšã¯å°é£ã§ãã ãã ããã©ããªã³ã¹ã«å ããŠãã¢ã«ãŽãªãºã ã¯æ°åŠçãªç¢ºçã®ç ç©¶ã§ãã°ãã°ãããã¢ããããŸããããã®åäœåçãèãããšé©ãããšã§ã¯ãããŸããã
æ£åŒãªã¢ã«ãŽãªãºã ïŒ- ã©ã³ãã ãªé ç¹ïŒã»ã«ïŒãéžæããŸãã å®å
šã«ã©ã³ãã ã
- ã©ã³ãã ã«é£æ¥ããé ç¹ïŒã»ã«ïŒãéžæããŠãããã«é²ã¿ãŸãã 蚪åãããŠããªãå Žåã¯ãããªãŒã«è¿œå ããŸãïŒåã®ããªãŒã«æ¥ç¶ãããããã®éã®å£ãåé€ããŸãïŒã
- ãã¹ãŠã®ã»ã«ã衚瀺ããããŸã§æé 2ãç¹°ãè¿ããŸãã
äœæ¥äŸãã£ãŒã«ãäžã®çŸåšã®äœçœ®ã¯èµ€ã§åŒ·èª¿è¡šç€ºãããŸãã
å·Šäžé
ããå§ããŸãã ããã§ã¯çããããšã¯ãããŸããã

ã©ã³ãã ã«å³ã«ç§»åããŠã2ã€ã®ã»ã«éã®å£ãåé€ããããšã«ããŸããã ããã£ãã

éãæªãã ç§ãã¡ã®RNGã¯ãç§ãã¡ãå·Šã«æ»ããšèšããŸãã

ä»ããŠã³ã éäžã§ãæªèšªåã®ã»ã«ããã¹ãŠæ¥ç¶ãããããã®éã®å£ãåé€ããŸãã

ãŸãã©ãããŒã ããŠã³ïŒ

ããŠã1åã®æ»ãã¯èš±ãããŸãã

å³åŽã«ç§»åããŠå£ãåé€ããããšãéžæããŸãã

ãããŠãããã§ç§ãã¡ã¯2åäžéã§ãããæåã«æ»ããŸãã


éžæè¢ã¯äºåºŠèœã¡ãŠãããŸããããŸããã çŽ æŽããããå°ãªããšãããã€ãã®çš®é¡ã


äžã«è¡ã£ãŠå£ãåãé€ããŸãã

ãããŠã次ã®ã»ã«ã«ç§»åããŸããå£ã¯æ¢ã«åãããªãŒã«ãããããå£ã¯åé€ããŸããã

ç®çããªãæ©ãåããæ©ãåãæã§ãã




ã»ã«2-2ã«æ»ããäžã«éããŠå£ãåãé€ããŸãã

æé€ãå®äºããçæãããè¿·è·¯ãååŸããŸãã

é·æïŒ- ãã€ã¢ã¹ã¯ãããŸããã
- ã©ããªã³ã¹ã¯å®å
šã«ã©ã³ãã ã§ããããããããã解決ããããã®ç¹å®ã®ã¢ã«ãŽãªãºã ãäœæããããšã¯ã§ããŸããã
- ãã®äººã®æ±ºå®ã®è€éãã
- ç°¡åãªå®è£
ã
çæïŒ- ã¹ããŒãã è¿·è·¯ãçæãããéãããªãã¯å¹Žããšã£ãŠæ»ã¬æéãããã§ãããã
- ç¡éã®è¿·è·¯ãçæããããšã¯ã§ããŸããã
- çºé»çµäºæã®å¹çã®å€§å¹
ãªäœäžã
å®è£
local mod = {} local aux = {} aux.width = false aux.height = false aux.sx = false aux.sy = false aux.grid = false aux.dirs = {"UP", "DOWN", "LEFT", "RIGHT"} function aux.createGrid (rows, columns) local MazeGrid = {} for y = 1, rows do MazeGrid[y] = {} for x = 1, columns do MazeGrid[y][x] = {visited = false, bottom_wall = true, right_wall = true} end end return MazeGrid end function mod.createMaze(x1, y1, x2, y2, grid) aux.width, aux.height, aux.sx, aux.sy = x2, y2, x1, y1 aux.grid = grid or aux.createGrid(y2, x2) aux.aldous_broder() return aux.grid end function aux.aldous_broder() local unvisited_cells = aux.width * aux.height local ix = math.random(aux.sx, aux.width) local iy = math.random(aux.sy, aux.height) aux.grid[iy][ix].visited = true unvisited_cells = unvisited_cells - 1 while unvisited_cells ~= 0 do local dir = aux.dirs[math.random(1, 4)] if dir == "UP" then if iy-1 >= aux.sy then if aux.grid[iy-1][ix].visited == false then aux.grid[iy-1][ix].bottom_wall = false aux.grid[iy-1][ix].visited = true unvisited_cells = unvisited_cells - 1 end iy = iy-1 end elseif dir == "DOWN" then if iy+1 <= aux.height then if aux.grid[iy+1][ix].visited == false then aux.grid[iy][ix].bottom_wall = false aux.grid[iy+1][ix].visited = true unvisited_cells = unvisited_cells - 1 end iy = iy+1 end elseif dir == "RIGHT" then if ix+1 <= aux.width then if aux.grid[iy][ix+1].visited == false then aux.grid[iy][ix].right_wall = false aux.grid[iy][ix+1].visited = true unvisited_cells = unvisited_cells - 1 end ix = ix+1 end elseif dir == "LEFT" then if ix-1 >= aux.sx then if aux.grid[iy][ix-1].visited == false then aux.grid[iy][ix-1].right_wall = false aux.grid[iy][ix-1].visited = true unvisited_cells = unvisited_cells - 1 end ix = ix-1 end end end end return mod
ãŠã£ã«ãœã³ã¢ã«ãŽãªãºã

説æããã§ãšããç§ãã¡ã¯ã€ãã«ãã£ãšæ·±å»ãªäœãã«å°éããŸããã ãŠã£ã«ãœã³ã®ã¢ã«ãŽãªãºã ã¯ãå®è£
ãšçè§£ã®äž¡æ¹ã«ãããŠã以åã®ã¢ã«ãŽãªãºã ãããã¯ããã«è€éã§ãã ãŠã£ã«ãœã³ã®ç®æšã¯ãåœŒã®æããªããŒãããŒã§ããAldous-Broderã®ç®æšã®ããã«ãåæ§ã«ç¢ºçã®é«ãã©ã³ãã ãªã¹ããã³ã°ããªãŒãçæããããšã§ãã åäœåçã¯å€å°äŒŒãŠããŸããã詳现ã¯å€§ããç°ãªããŸãã
ãã®ã¢ã«ãŽãªãºã ã¯ãè¿·è·¯ïŒã°ã©ãïŒã®ç§»ååŽã®ã©ã³ãã ãªéžæã«çããåºã¥ããŠããŸããã2ã€ã®éèŠãªéãããããŸãã
ãã£ãŒã«ãå
ãç§»åããŠãã¹ããã³ã°ããªãŒã®é ç¹ãèŠã€ããåã«èšªãããã¹ãŠã®é ç¹ããèšæ¶ãããŸãã æ¢ã«è¿œå ãããé ç¹ã«åºäŒããšããã«ãçæãããããªãŒã«çµæã®ãµãã°ã©ãïŒãã©ã³ãïŒãæ·»ä»ããŸãã ãµãã°ã©ãã«ã«ãŒããäœæãããŠããå Žåã¯ãåé€ããŸãã ã«ãŒããšã¯ãäžæçãªãµãã°ã©ãã«ãã§ã«ããé ç¹ãšãå¥ã®ãã€ã³ãã«ããé ç¹ãšã®æ¥ç¶ãæå³ããŸãã ã€ãŸããé ç¹ã2ã€ãè¶
ããé ç¹ããã£ãŠã¯ãªããŸããã ããªããä»çè§£ããŠããªããªããããã¯æããããŸãã-ããªãã¯ä»äºã®äŸã§ããã«æç¢ºã«èŠãã§ãããã
ãµãã°ã©ããã¹ããã³ã°ããªãŒã«ã¢ã¿ããããåŸã次ã®ã©ã³ãã ãã€ã³ãã®éžæã¯ããŸã ã¢ã¿ãããããŠããªãé ç¹ããã®ã¿çºçããŸãã ãã®çµæãAldous-Broderãšã¯ç°ãªãããŠã£ã«ãœã³ã«ã¯ããã§ã«åŠçãããããŒã¯ãããŠããªãããŸãããšããäžå©ãªç¹ããããŸããã
Aldous-Broderã®ãããªWilsonã®ã¢ã«ãŽãªãºã ã¯ãåãã®ãªãå®å
šã«ã©ã³ãã ãªã©ããªã³ã¹ãçæããŸãã ã¢ã«ãŽãªãºã ã«ã¯ãæ¹åæ§ããšã³ã¿ã³ã°ã«ã¡ã³ãããŸãã¯ãã®ä»ã®ç¹æ§ã®å¥œã¿ã¯ãããŸããã æ®å¿µãªãããæè¯ã®çµæãåŸãã«ã¯ãæ°å€ã®èšå®ããªãããŒããŠã§ã¢ä¹±æ°ãžã§ãã¬ãŒã¿ãŒã䜿çšããå¿
èŠããããŸãã
ã¢ã«ãŽãªãºã èªäœã¯ã1996幎ã«ãDavid Wilsonã«ãã£ãŠãç確çã®ã©ã³ãã ã¹ããã³ã°ããªãŒã®çæã«é¢ããè«æã§å
¬éãããŸããã åãšåæ§ã«ãè¿·è·¯ã«å ããŠãæ°åŠç確çã«å°å¿µããããŸããŸãªãµã€ãã«è³æããããã¢ãã衚瀺ãããŸãã ããã«ãç¹ã«åäžã¹ããã³ã°ããªãŒãšãŠã£ã«ãœã³ã¢ã«ãŽãªãºã ã«é¢ããããã€ãã®è峿·±ãåºçç©ã«åºäŒããŸããã ãããã®1ã€ã§ã¢ã«ãŽãªãºã èªäœããã詳现ã«èª¬æãããŠããå Žåããã1ã€ã§ã¯å
šäœãšããŠæŠå¿µèªäœãšã¹ããã³ã°ããªãŒã®æ°åŠçåºç€ã説æãããŠããŸãã
èªè
ãèå³ãæã£ãããããããããŒã2aãæžããŸããããã§ãäœåèªäœãšãã®éšåçãªç¿»èš³ãåŒçšããŸãã ããã§æ°åŠçãªæ£åœåãé¿ããäž»ãªçç±ã¯ãç§ã®èšäºãåå¿è
ãä¹ŸåŒæ°åŠãããããã°ã©ãã³ã°ã«èå³ããã人ã察象ã«ããŠããããã§ãã
æ£åŒãªã¢ã«ãŽãªãºã ïŒ- ã¹ããã³ã°ããªãŒã«å±ããªãã©ã³ãã ãªé ç¹ãéžæããŠãããªãŒã«è¿œå ããŸãã
- ã¹ããã³ã°ããªãŒã«å±ããªãã©ã³ãã ãªé ç¹ãéžæããããªãŒã«æ¢ã«è¿œå ãããŠããé ç¹ã«å°éãããŸã§ã°ã©ãã®ç§»åïŒè¿·è·¯ïŒãéå§ããŸãã ãµã€ã¯ã«ã圢æãããå Žåããããåé€ããŸãã
- çµæã®ãµãã°ã©ãã®ãã¹ãŠã®é ç¹ãã¹ããã³ã°ããªãŒã«è¿œå ããŸãã
- ãã¹ãŠã®é ç¹ãã¹ããã³ã°ããªãŒã«è¿œå ããããŸã§ãæé 2ã3ãç¹°ãè¿ããŸãã
é·æïŒ- ãã€ã¢ã¹ã¯ãããŸããã
- ã©ããªã³ã¹ã¯å®å
šã«ã©ã³ãã ã§ããããããããã解決ããããã®ç¹å®ã®ã¢ã«ãŽãªãºã ãäœæããããšã¯ã§ããŸããã
- ãã®äººã®æ±ºå®ã®è€éãã
- æå³ã®ãªãæŸæµªã¯ãããŸããã
- Oldos-Broderãšæ¯èŒããéåºŠã¯æ°åã§ãã
çæïŒ- é£ããå®è£
ã
- çæã®éå§æã«é床ãäœäžããŸãã
- Aldous-Broderããã倧ããªã¡ã¢ãªèŠä»¶ã
å®è£
local mod = {} local aux = {} aux.width = false aux.height = false aux.sx = false aux.sy = false aux.grid = false aux.dirs = {"UP", "DOWN", "LEFT", "RIGHT"} function aux.createGrid (rows, columns) local MazeGrid = {} for y = 1, rows do MazeGrid[y] = {} for x = 1, columns do MazeGrid[y][x] = {visited = false, bottom_wall = true, right_wall = true} end end return MazeGrid end function mod.createMaze(x1, y1, x2, y2, grid) aux.width, aux.height, aux.sx, aux.sy = x2, y2, x1, y1 aux.grid = grid or aux.createGrid(y2, x2) aux.wilson() return aux.grid end function aux.hashKey(x, y) return x * aux.height + (y - 1) end function aux.deHashKey(value) return math.floor(value/aux.height), value%aux.height + 1 end function aux.hashCells(grid) local vtable = {} for yk, yv in pairs(grid) do for xk, xv in pairs(yv) do if xv.visited == false then vtable[aux.hashKey(xk, yk)] = xv end end end return vtable end function aux.wilson() local cellsHash = aux.hashCells(aux.grid)
ãšãããŒã°ïŒ
äžèšã®ãã¹ãŠãèŠçŽãããšãããè€éãªã¢ã«ãŽãªãºã ã«çæããã°ã©ãã®ããã€ãã®ïŒããã€ãã®ïŒæŠå¿µãèŠã€ããããäž»ãªå°é£ã¯ãŸã æ¥ãŠããªãããšã«æ³šæãã䟡å€ããããŸãã EllerãKraskalãPrimã®æããã«çŽããããã¢ã«ãŽãªãºã ã¯ãã°ã©ããšããªãŒã®æäœã®ã¿ã«åºã¥ããŠãããè峿·±ããšã¯ãããé£ããåºçç©ãæºåããŠããŸãã ãã ããããããæžãå§ããåã«ããªã¿ãŒã³ãµãŒãã¢ã«ãŽãªãºã ãšããCatchïŒKillããšåŒã°ãããã®ãèŠãŠãã ãããè¿·è·¯ãçæããäœæ¥ã¯ä»ã®ãã¹ãŠãšã¯éåžžã«ç°ãªããŸãã æ¬¡ã®èšäºã«ã€ããŠãã³ããäžããŸããã
ä»ã«äœã åã®éšåãžã®ã³ã¡ã³ãã§ãäžéšã®äººã
ã¯åœŒãã®çæã¢ã«ãŽãªãºã ãå°ãããæšãŠããããŸããã ç¬èªã®æ¹æ³ã§ã©ããªã³ã¹ã®äœæãäžåºŠå®è£
ããä»ããèŠããããšãã§ããå Žåã¯ãå
±æããŠãã ããã ãããããããªãã®èš±å¯ãåŸãŠãç§ã圌ã«ã€ããŠæžãèšäºã®ããã€ãã§ã äžè¬çã«ãç§ã¯ãã®ãããã¯ã«é¢ããè峿·±ã話ãæãåºã«æºè¶³ããŠããŸãã åŠæ ¡ã®ããŒãããã¯ã倧åŠã®ã³ã³ãã¥ãŒã¿ãŒã§è¿·è·¯ãæãæ¹æ³ãèŠããŠããŠãæ§ããŸããã
ãŸãããããŠãã€ãã®ããã«ã é¡ããæ¹å€ãã³ã¡ã³ãã¯ãã€ã§ãæè¿ããŸãããããã¯ãæ°ã«å
¥ã£ãŠæ¬¡ã®ããŒããèŠããå Žåã¯ãã³ã¡ã³ãã«æžããŠãã ããã
Lua +ã®ã¢ã«ãŽãªãºã ã®ãœãŒã¹+ Love2Dã§ã¬ã³ããªã³ã°ïŒã³ã¡ã³ãå
ã®ãªã¯ãšã¹ãã§ã³ãŒããã¬ã€ã¢ãŠããããŸãããªãã¡ã¯ã¿ãªã³ã°ãããŸããïŒïŒ
Github