之前有在研究地下城類型的遊戲,所以做了一個亂數迷宮的產生器,算法是使用單次深入的概念,也就是迷宮會一直往下尋路,直到不能走為止,不能走後會在往回推一格繼續尋路,最後檢查完所有節點都不能走時,迷宮就完成了,用說的有點模糊,先看範例吧
主要的運算寫在generateMaze,可設定牆的厚度,有興趣的人可以參考
private static function generateMaze(map:Map, startX:int, startY:int, wallWeight:int):void { var nextNodeDistance:int = wallWeight + 1; //追蹤路徑,用來倒回用 var tracePaths:Vector.<Node> = new Vector.<Node>(); //更新起始點 map.updateStartNode(startX, startY); var node:Node = map.startNode; node.startNodeDistance = 0; //終點 var endNode:Node = node; do { node.isWalkable = true; //可能的下個節點列表 var posableNextNodes:Vector.<Node> = new Vector.<Node>(); var checkNode:Node; //四方向 for (var i:int = -nextNodeDistance; i <= nextNodeDistance; i += nextNodeDistance * 2) { checkNode = map.getNode(node.x + i, node.y); if (checkNode && !checkNode.isWalkable) posableNextNodes.push(checkNode); checkNode = map.getNode(node.x, node.y + i); if (checkNode && !checkNode.isWalkable) posableNextNodes.push(checkNode); } var posableNodeCount:int = posableNextNodes.length; if (posableNodeCount > 0) { //亂數決定前進方向 var index:int = int(Math.random() * posableNodeCount); var nextNode:Node = posableNextNodes[index]; nextNode.isWalkable = true; nextNode.startNodeDistance = node.startNodeDistance + nextNodeDistance; var offsetX:int = (nextNode.x - node.x) / nextNodeDistance; var offsetY:int = (nextNode.y - node.y) / nextNodeDistance; var pathX:int = node.x; var pathY:int = node.y; var pathDistance:int = node.startNodeDistance; //打通牆壁 while (pathX != nextNode.x || pathY != nextNode.y) { pathX += offsetX; pathY += offsetY; var pathNode:Node = map.getNode(pathX, pathY); if (pathNode) { pathDistance++; pathNode.startNodeDistance = pathDistance; pathNode.isWalkable = true; } } tracePaths.push(nextNode); node = nextNode; } else { node = tracePaths.pop(); if (node.startNodeDistance > endNode.startNodeDistance) endNode = node; } } while (tracePaths.length > 0) map.updateEndNode(endNode.x, endNode.y); }
0 意見 :: [練習]Flash亂數迷宮
張貼留言