Web掃雷開發(fā)小記(2)

上篇

所有代碼可以在我的Github中找到宾舅,在線試玩:點(diǎn)擊

這一次主要做一件事,就是計(jì)算出每個(gè)方格周圍共有幾個(gè)雷,然后將數(shù)字繪制在方格中。

創(chuàng)建Mineblock對(duì)象

首先創(chuàng)建一個(gè)Mineblock對(duì)象固蛾,代表畫布中每一個(gè)方格,總共480個(gè)蒂阱。

該對(duì)象接收兩個(gè)參數(shù)洪乍,該方格所在的行和列。屬性包括了columns,rows,isMined,roundMines 开瞭。

function Mineblock (cloumns, rows) {
    this.cloumns = cloumns;
    this.rows = rows;
    this.isMined = false;//boolean default false
    this.roundMines = 0;//0-8
}

其中roundMines 代表當(dāng)前方格周圍有幾個(gè)雷懒震。

創(chuàng)建二維數(shù)組

在上一篇的基礎(chǔ)上進(jìn)行改進(jìn)罩息。

生成一個(gè)30x16總共480個(gè)元素的二維數(shù)組,存儲(chǔ)了480個(gè)Mineblock對(duì)象个扰。

同樣的瓷炮,需要在這480個(gè)元素中,挑出99個(gè)不重復(fù)的元素作為雷递宅。

    for (let i = 0; i < 99; i++) {
        let index = Math.floor(Math.random() * positions.length);
        let position = positions[index];
        let x = position.x;
        let y = position.y;
        mines[x][y].isMined = true;
        positions.splice(index, 1);
        }

沒(méi)什么好解釋的娘香,方法跟上一篇差不多。

生成數(shù)字

然后就是生成數(shù)字办龄。

讓我們回想一下掃雷的規(guī)則烘绽,當(dāng)你點(diǎn)開一個(gè)方塊時(shí),上面的數(shù)字表明了在該方塊的周圍俐填,總共8個(gè)方塊中诀姚,一共有幾個(gè)雷。

當(dāng)前方塊的位置如果是第i行玷禽,第j列的話赫段,那我需要檢查總共八個(gè)方塊,即第i-1行的三個(gè)即j-1,j,j+1矢赁,第i行的兩個(gè)j-1,j+1糯笙,第i+1行的三個(gè)j-1,j,j+1

這個(gè)用二維數(shù)組做起來(lái)就很一目了然。

        var mineNum;
        for (let i = 0, length1 = mines.length; i < length1; i++) {
            for (let j = 0, length1 = mines[i].length; j < length1; j++) {
                mineNum = 0;
                for (let k = -1; k < 2; k++) {
                    for (let l = -1; l < 2; l++) {
                        if (i + l > -1 && j + k > -1 && i + l < 30 && j + k < 16) {
                                if (mines[i + l][j + k].isMined === true) {
                                    mineNum++;

                            }
                        }
                    }
                }
                mines[i][j].roundMines = mineNum;
            }
        }

其中的檢查條件if (i + l > -1 && j + k > -1 && i + l < 30 && j + k < 16) 即保證當(dāng)?shù)谝恍谢蛘咦詈笠恍幸活惖那闆r時(shí)撩银,不會(huì)超過(guò)數(shù)組的邊界给涕。

繪制面板

繪制面板沒(méi)什么好說(shuō),不過(guò)這次不只是雷额获,還有數(shù)字的繪制够庙,從數(shù)組中的Mineblock對(duì)象的roundMines屬性獲得就好。

    for (let i = 0; i < mines.length; i++) {
        for (let j = 0; j < mines[i].length; j++) {
            if (mines[i][j].isMined === true) {
                mineContext.fillStyle = "red";
                mineContext.fillRect(mines[i][j].cloumns * 20, mines[i][j].rows * 20, this.block_width, this.block_height); //繪制矩形
            } else {
                mineContext.fillStyle = "blue";
                mineContext.font = "15px Arial";
                mineContext.textAlign = 'center';
                mineContext.fillText(mines[i][j].roundMines, mines[i][j].cloumns * 20 + 10, mines[i][j].rows * 20 + 15);
            }
        }
    }

游戲結(jié)束

最后再加一個(gè)條件抄邀,當(dāng)點(diǎn)擊到雷時(shí)游戲結(jié)束耘眨,彈出一個(gè)提示框,同時(shí)清除掉遮罩層境肾。

        maskCanvas.addEventListener("click", function(e) {
            p = getPosition(e);
            index = getMineIndex(p.x, p.y);
            maskContext.clearRect(index.xIndex * BLOCK_WIDTH, index.yIndex * BLOCK_HEIGHT, BLOCK_WIDTH - 1, BLOCK_HEIGHT - 1);
            if (mines[index.xIndex][index.yIndex].isMined === true) {
                alert("you lose");
                maskContext.clearRect(0, 0, 600, 320);
            }
        }, false);

效果如下:

彈出提示
顯示地雷分布
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末剔难,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奥喻,更是在濱河造成了極大的恐慌偶宫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件环鲤,死亡現(xiàn)場(chǎng)離奇詭異纯趋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門吵冒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)唇兑,“玉大人,你說(shuō)我怎么就攤上這事桦锄。” “怎么了蔫耽?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵结耀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我匙铡,道長(zhǎng)图甜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任鳖眼,我火速辦了婚禮黑毅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钦讳。我一直安慰自己矿瘦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布愿卒。 她就那樣靜靜地躺著缚去,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琼开。 梳的紋絲不亂的頭發(fā)上易结,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音柜候,去河邊找鬼搞动。 笑死,一個(gè)胖子當(dāng)著我的面吹牛渣刷,可吹牛的內(nèi)容都是我干的鹦肿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辅柴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狮惜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起碌识,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碾篡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后筏餐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體开泽,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年魁瞪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了穆律。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠呼。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖峦耘,靈堂內(nèi)的尸體忽然破棺而出剔蹋,到底是詐尸還是另有隱情,我是刑警寧澤辅髓,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布泣崩,位于F島的核電站,受9級(jí)特大地震影響洛口,放射性物質(zhì)發(fā)生泄漏矫付。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一第焰、第九天 我趴在偏房一處隱蔽的房頂上張望买优。 院中可真熱鬧,春花似錦挺举、人聲如沸杀赢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葵陵。三九已至,卻和暖如春瞻佛,著一層夾襖步出監(jiān)牢的瞬間脱篙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工伤柄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绊困,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓适刀,卻偏偏與公主長(zhǎng)得像秤朗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笔喉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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