Javascript掃雷是一款輕量級(jí)的游戲,可以通過瀏覽器進(jìn)行游玩,流行于Windows操作系統(tǒng)上的游戲,也是學(xué)習(xí)Javascript編程的一種方式。下面介紹一些簡(jiǎn)單的用Javascript編寫掃雷的方法。
首先,我們需要建立一個(gè)函數(shù)來(lái)創(chuàng)建游戲場(chǎng)景。我們可以為每個(gè)格子設(shè)置一個(gè)id,以便在后面的代碼中使用。下面是一個(gè)簡(jiǎn)單的代碼片段:
function createScene(row, col) { var html = '<table>'; for (var i = 0; i < row; i++) { html += '<tr>'; for (var j = 0; j < col; j++) { html += '<td id="cell_' + i + '_' + j + '"></td>'; } html += '</tr>'; } html += '</table>'; document.getElementById('container').innerHTML = html; }
上面的代碼中,我們通過對(duì)循環(huán)變量 i 和 j 進(jìn)行拼接,得到了每個(gè)格子的id。之后,我們使用innerHTML將html代碼注入到了頁(yè)面中。
接下來(lái),我們需要添加一些事件監(jiān)聽器來(lái)處理用戶的點(diǎn)擊事件。當(dāng)用戶點(diǎn)擊某個(gè)格子時(shí),我們需要根據(jù)情況來(lái)判斷該格子內(nèi)是否有雷,以及是否需要翻開周圍的所有格子。下面是一個(gè)簡(jiǎn)單的代碼片段:
document.getElementById('container').addEventListener('click', function(e) { var el = e.target; var id = el.id; if (el.tagName === 'TD') { var i = parseInt(id.split('_')[1]); var j = parseInt(id.split('_')[2]); if (hasBomb(i, j)) { alert('噼里啪啦,你踩到雷了!'); } else { reveal(i, j); } } });
上面的代碼中,我們首先獲取了用戶的點(diǎn)擊目標(biāo),然后通過id屬性解析了其行、列坐標(biāo)。接著判斷該格子是否為雷,如果是雷則彈出失敗提示,反之則調(diào)用 reveal 函數(shù)來(lái)翻開周圍格子。
最后,我們需要實(shí)現(xiàn)一些功能函數(shù)來(lái)完成游戲的各種操作。例如,我們需要定義一個(gè)函數(shù)來(lái)生成雷的位置,以及一個(gè)函數(shù)來(lái)翻開周圍的所有格子。下面是一個(gè)簡(jiǎn)單的代碼片段:
function generateBomb() { var bomb = []; for (var i = 0; i < BOMB_COUNT; i++) { var x = Math.floor(Math.random() * ROW_COUNT); var y = Math.floor(Math.random() * COL_COUNT); if (bomb.indexOf(x + ',' + y) !== -1) { i--; } else { bomb.push(x + ',' + y); document.getElementById('cell_' + x + '_' + y).dataset.bomb = true; } } } function reveal(x, y) { var cell = document.getElementById('cell_' + x + '_' + y); if (cell.innerHTML || cell.dataset.bomb) { return; } var count = getBombCount(x, y); cell.innerHTML = count || ''; if (!count) { reveal(x - 1, y - 1); reveal(x - 1, y); reveal(x - 1, y + 1); reveal(x, y - 1); reveal(x, y + 1); reveal(x + 1, y - 1); reveal(x + 1, y); reveal(x + 1, y + 1); } } function getBombCount(x, y) { var count = 0; var i, j; for (i = x - 1; i <= x + 1; i++) { for (j = y - 1; j <= y + 1; j++) { if (i < 0 || i >= ROW_COUNT || j < 0 || j >= COL_COUNT) { continue; } if (document.getElementById('cell_' + i + '_' + j).dataset.bomb) { count++; } } } return count; }
上面的代碼中,generateBomb 函數(shù)用于隨機(jī)生成雷的位置,并將其打上標(biāo)記;reveal 函數(shù)用于翻開周圍的所有格子,如果周圍沒有雷,則遞歸調(diào)用自身實(shí)現(xiàn)翻開方塊;getBombCount 函數(shù)用于統(tǒng)計(jì)周圍雷的數(shù)量。
在完成以上步驟后,我們就成功實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的Javascript掃雷游戲,玩家只需要通過點(diǎn)擊各個(gè)格子來(lái)探索地雷,享受掃雷游戲給人帶來(lái)的快樂。