迷宮生成算法JS實(shí)現(xiàn)

1.簡單的遞歸分割

代碼如下:

import Phaser from 'phaser';

export default class extends Phaser.State {
  init() { }
  preload() { }
  create() {
    let self = this;
    this.stage.backgroundColor = '#fff';
    let map = [];
    let size = 61;
    for (let i = 0; i < size; i++) { //初始化迷宮的墻
      map.push([]);
      for (let j = 0; j < size; j++) {
        if (i === 0 || i === size - 1 || j === 0 || j === size - 1) {
          map[i].push(1);
        } else {
          map[i].push(0);
        }
      }
    }
    map[0][1] = 0;
    map[size - 1][size - 2] = 0;

    function getEven(min, max) { // 隨機(jī)獲取區(qū)間中的偶數(shù)
      let result;
      while (true) {
        result = self.game.math.between(min, max) || 0;
        if (result % 2 === 0 && result !== min && result !== max) {
          break;
        }
      }
      return result;
    }
    function getOdd(min, max) { // 隨機(jī)獲取區(qū)間中的奇數(shù)
      let result;
      while (true) {
        result = self.game.math.between(min, max) || 0;
        if (result % 2 === 1 && result !== min && result !== max) {
          break;
        }
      }
      return result;
    }

    // 生成迷宮的函數(shù)
    function generate(map, x1, y1, x2, y2) {
      if (x2 - x1 <= 2 || y2 - y1 <= 2) { //如果沒位置了,直接return
        return;
      }
      // 生成十字圍墻
      let wallY = getEven(y1, y2); 
      let wallX = getEven(x1, x2);
      for (let i = x1; i < x2; i++) {
        map[wallY][i] = 1;
      }
      for (let i = y1; i < y2; i++) {
        map[i][wallX] = 1;
      }
      // 隨機(jī)挖三個(gè)洞
      let direct = [1, 1, 1, 1];
      direct[Math.random() * 4 | 0] = 0;
      if (direct[0]) { // 上
        let roadY = getOdd(y1, wallY);
        map[roadY][wallX] = 0;
      }
      if (direct[1]) { // 下
        let roadY = getOdd(wallY, y2);
        map[roadY][wallX] = 0;
      }
      if (direct[2]) { // 左
        let roadX = getOdd(x1, wallX);
        map[wallY][roadX] = 0;
      }
      if (direct[3]) { // 右
        let roadX = getOdd(wallX, x2);
        map[wallY][roadX] = 0;
      }
      // 繼續(xù)遞歸
      generate(map, x1, y1, wallX, wallY);
      generate(map, wallX, y1, x2, wallY);
      generate(map, x1, wallY, wallX, y2);
      generate(map, wallX, wallY, x2, y2);
    }
    generate(map, 0, 0, map[0].length - 1, map.length - 1);
    let bmd = this.add.bitmapData(5, 5);
    bmd.context.fillStyle = '#000';
    bmd.context.fillRect(0, 0, 5, 5);
    this.cache.addBitmapData('wall', bmd);
    for (let i = 0; i < map.length; i++) {
      for (let j = 0; j < map[0].length; j++) {
        if(map[i][j]){
          this.add.sprite(j * 5, i * 5, this.cache.getBitmapData('wall'));
        }
      }
    }
  }
}

效果如圖所示
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旦委,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖扳还,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仓坞,死亡現(xiàn)場離奇詭異,居然都是意外死亡喷楣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門鹤树,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铣焊,“玉大人,你說我怎么就攤上這事罕伯∏粒” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵追他,是天一觀的道長坟募。 經(jīng)常有香客問我岛蚤,道長,這世上最難降的妖魔是什么婿屹? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任灭美,我火速辦了婚禮,結(jié)果婚禮上昂利,老公的妹妹穿的比我還像新娘届腐。我一直安慰自己,他們只是感情好蜂奸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布犁苏。 她就那樣靜靜地躺著,像睡著了一般扩所。 火紅的嫁衣襯著肌膚如雪围详。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天祖屏,我揣著相機(jī)與錄音助赞,去河邊找鬼。 笑死袁勺,一個(gè)胖子當(dāng)著我的面吹牛雹食,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播期丰,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼群叶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钝荡?” 一聲冷哼從身側(cè)響起街立,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎埠通,沒想到半個(gè)月后赎离,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡植阴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年蟹瘾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掠手。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖狸捕,靈堂內(nèi)的尸體忽然破棺而出喷鸽,到底是詐尸還是另有隱情,我是刑警寧澤灸拍,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布做祝,位于F島的核電站砾省,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏混槐。R本人自食惡果不足惜编兄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望声登。 院中可真熱鬧狠鸳,春花似錦、人聲如沸悯嗓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脯厨。三九已至铅祸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間合武,已是汗流浹背临梗。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稼跳,地道東北人盟庞。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像岂贩,于是被迫代替她去往敵國和親茫经。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評論 25 707
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持萎津,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券卸伞,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 6,549評論 3 22
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法锉屈,類相關(guān)的語法荤傲,內(nèi)部類的語法,繼承相關(guān)的語法颈渊,異常的語法遂黍,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • 闐闐讓我給她按摩,很高興我陪她在床上俊嗽,22:30左右雾家,闐呼呼睡著。 為了讓自己穩(wěn)定绍豁,寫日記芯咧,等會泡群學(xué)習(xí)。 ...
    麗萍在這閱讀 291評論 8 3
  • 四只小龜都已經(jīng)出殼了,老大是草龜敬飒,老二是鱷龜邪铲,老三和老四都是巴西龜。 這是老大无拗,因?yàn)樘^頑皮带到,...
    麥子Mary閱讀 506評論 0 1