Web版掃雷開發(fā)小記(3)

前篇:

web版掃雷開發(fā)小記(1)
web版掃雷開發(fā)小記(2)
web版掃雷開發(fā)小記(3)
web版掃雷開發(fā)小記(4)

完整代碼:我的Github

在線試玩:點(diǎn)擊

上一節(jié)完成了數(shù)字的顯示,這次主要完成一個功能,即當(dāng)當(dāng)前方塊周圍沒有雷(roundMines為0)時修噪,自動挖開周邊的雷。

思路分析

首先先弄明白掃雷中的這一游戲規(guī)則辫封。

當(dāng)用戶點(diǎn)擊到一個方塊砖第,而它的周圍沒有雷時荷腊,就會挖開它周圍的方塊绍移,而當(dāng)它的周邊共計(jì)8個方塊中悄窃,有一個方塊也是周圍沒有雷的話,又會繼續(xù)挖開這個方塊周圍的方塊蹂窖。如下圖:


空的方塊

很容易想到轧抗,這是一個遞歸的思想,設(shè)計(jì)一個cleanArea()函數(shù)恼策,遍歷某方塊周圍的八個方塊鸦致,當(dāng)其中一個方塊的roundMines屬性為0時潮剪,則遞歸調(diào)用cleanArea()函數(shù)涣楷,直到該區(qū)域方塊都被挖開為止。

(這里的實(shí)現(xiàn)搜羅了下其他人的想法抗碰,還可以用BFS實(shí)現(xiàn)狮斗,畢竟遞歸太低效了。不過我算法不咋樣弧蝇,還是先用著遞歸吧碳褒,有時間了來研究研究BFS)

函數(shù)實(shí)現(xiàn)

cleanArea()函數(shù)接收兩個參數(shù),當(dāng)前點(diǎn)擊方塊的列columns和行rows 看疗。

通過兩層for 循環(huán)嵌套沙峻,遍歷當(dāng)前方塊周邊的8個方塊,將周邊方塊的行列數(shù)push到定義的一個數(shù)組中两芳,然后通過讀取該數(shù)組的值摔寨,對方塊進(jìn)行clearRect()

添加isClicked屬性

然而按照這個思路實(shí)現(xiàn)起來有諸多問題怖辆,最主要的一個問題就是循環(huán)會遍歷到該方塊本身是复。

例如,當(dāng)前方塊行為12竖螃,列為15淑廊,它的roundMines為0,那么函數(shù)就會遍歷周邊的方塊特咆,當(dāng)我遍歷到比如行11季惩,列15的方塊時,發(fā)現(xiàn)它的roundMines為0,那么遞歸函數(shù)調(diào)用画拾,以行11关摇,列15為當(dāng)前方塊,開始遍歷碾阁,其他方塊暫且不論输虱,當(dāng)檢查到行12,列15的方塊時(是的兩個方塊互為周邊塊)脂凶。發(fā)現(xiàn)也是0宪睹,好,又是一個遞歸調(diào)用蚕钦。于是兩個遞歸互相調(diào)用亭病,永無止境……

這是我最開始寫的:

function cleanArea(columns, rows, mineObject) {
    for (var k = -1; k < 2; k++) {
        for (var l = -1; l < 2; l++) {
            if (columns + l > -1 && rows + k > -1 && columns + l < 30 && rows + k < 16 ) {
                mineObject.cleanArr.push({
                    columns: columns + l,
                    rows: rows + k
                });
                if (mineObject.mines[columns + l][rows + k].roundMines === 0) {
                    mineObject.cleanArea(columns + l, rows + k, mineObject);
                }
            }
        }
    }
}

這個問題解決起來也簡單,添加一個條件判斷語句就好嘶居。例如這里兩個范圍-1到1的變量l和k罪帖,代表行和列的變化,那么當(dāng)兩個變量都為0時邮屁,就代表是當(dāng)前塊整袁。

但是當(dāng)我添加一個(l!==0)&&(k!==0)的條件時,程序每次在其中一個變量為0時就會判斷為true佑吝。百思不得其解坐昙,自認(rèn)這個判斷寫得也沒有問題,搜索了一下大家也都是這么寫得芋忿。沒辦法炸客,只有擱置。

同時也感謝這個bug戈钢,讓我思考到了更為便捷且語義更加明確的方法:

在之前定義的Mineblock類中痹仙,再添加一個isClicked屬性,初始值為false殉了。對于每個方塊开仰,當(dāng)被點(diǎn)擊到時isClicked更改為true。對于上述方法也同樣如此宣渗,當(dāng)我在將它push到定義的數(shù)組中時抖所,同時更改isClicked屬性。

那么在我判斷中痕囱,我只需要加入isClicked===false的判斷田轧,就可以規(guī)避掉所有或被點(diǎn)擊或被挖開的方塊。

代碼如下:

function cleanArea(columns, rows, mineObject) {
    for (var k = -1; k < 2; k++) {
        for (var l = -1; l < 2; l++) {
            if (columns + l > -1 && rows + k > -1 && columns + l < 30 && rows + k < 16 && mineObject.mines[columns + l][rows + k].isClicked === false) {
                mineObject.cleanArr.push({
                    columns: columns + l,
                    rows: rows + k
                });
                mineObject.mines[columns + l][rows + k].isClicked = true;
                if (mineObject.mines[columns + l][rows + k].roundMines === 0) {
                    mineObject.cleanArea(columns + l, rows + k, mineObject);
                }
            }
        }
    }
}

效果可以看上面的截圖

添加游戲成功條件

游戲失敗的條件很簡單鞍恢,點(diǎn)擊到一個雷方塊時就結(jié)束傻粘。游戲成功稍微麻煩一點(diǎn)每窖,概念上很簡單,所有不是雷的方塊都被點(diǎn)開時游戲就成功了弦悉。但是怎么做呢窒典?

最開始的想法很蠢,每次點(diǎn)擊或者挖開一個方塊時稽莉,都調(diào)用一個函數(shù)瀑志。這個函數(shù)的作用是什么呢?遍歷當(dāng)前所有isMined===false的對象污秆,查看它的isClicked屬性是否等于true劈猪。若所有方塊都已經(jīng)被挖開,那么游戲成功良拼。

聽起來思路其實(shí)很清晰战得,但這個方法不用說,太不節(jié)約了庸推。

最后決定給MineSweeping對象添加一個屬性count常侦,作用很簡單,每點(diǎn)開或者挖開一個方塊時贬媒,count數(shù)都+1聋亡,當(dāng)count數(shù)達(dá)到480-99(高級掃雷)時,即游戲成功掖蛤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杀捻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚓庭,更是在濱河造成了極大的恐慌,老刑警劉巖仅仆,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件器赞,死亡現(xiàn)場離奇詭異,居然都是意外死亡墓拜,警方通過查閱死者的電腦和手機(jī)港柜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咳榜,“玉大人夏醉,你說我怎么就攤上這事∮亢” “怎么了畔柔?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長臣樱。 經(jīng)常有香客問我靶擦,道長腮考,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任玄捕,我火速辦了婚禮踩蔚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枚粘。我一直安慰自己馅闽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布馍迄。 她就那樣靜靜地躺著捞蛋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柬姚。 梳的紋絲不亂的頭發(fā)上拟杉,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機(jī)與錄音量承,去河邊找鬼搬设。 笑死,一個胖子當(dāng)著我的面吹牛撕捍,可吹牛的內(nèi)容都是我干的拿穴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼忧风,長吁一口氣:“原來是場噩夢啊……” “哼默色!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狮腿,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腿宰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后缘厢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吃度,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年贴硫,在試婚紗的時候發(fā)現(xiàn)自己被綠了椿每。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡英遭,死狀恐怖间护,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挖诸,我是刑警寧澤汁尺,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站税灌,受9級特大地震影響均函,放射性物質(zhì)發(fā)生泄漏亿虽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一苞也、第九天 我趴在偏房一處隱蔽的房頂上張望洛勉。 院中可真熱鬧,春花似錦如迟、人聲如沸收毫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽此再。三九已至,卻和暖如春玲销,著一層夾襖步出監(jiān)牢的瞬間输拇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工贤斜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留策吠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓瘩绒,卻偏偏與公主長得像猴抹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锁荔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

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

  • 目錄:Web掃雷開發(fā)小記(1)Web掃雷開發(fā)小記(2)Web掃雷開發(fā)小記(3) 其實(shí)在完成上篇的功能之后蟀给,一個掃雷...
    franose閱讀 521評論 0 0
  • 掃雷是我第一個取得顯著成就的游戲,但一直沒有機(jī)會寫一篇關(guān)于它的文章阳堕。前不久跋理,一家游戲媒體約我就掃雷做個采訪,列舉了...
    深加思考閱讀 2,763評論 4 5
  • 目錄Web掃雷開發(fā)小記(2)Web掃雷開發(fā)小記(3)Web掃雷開發(fā)小記(4) 剛好今天做阿里前端筆試問到掃雷了嘱丢,那...
    franose閱讀 909評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,275評論 25 707
  • 如果有一天薪介,你的崗位被人替代了,請不要奇怪越驻,因?yàn)槟氵€在過年,而人家已經(jīng)在上班了…… 如果有一天道偷,你的客戶被人搶走了...
    帝星微寒閱讀 387評論 0 0