javascript實(shí)現(xiàn)掃雷簡易版
本文實(shí)例為大家分享了javascript實(shí)現(xiàn)掃雷簡易版的具體代碼,供大家參考,具體內(nèi)容如下
使用截圖
說明
這個(gè)完成的建議版本,所以沒有插旗子,沒有計(jì)時(shí),就是最基本的原理實(shí)現(xiàn),熟練的大佬30min就能完成
代碼講解
初始數(shù)據(jù)
var MAPSIZE = 10; var BOMBNUM = 1; var BOMBPOSITION = {}; var SQUAERPOSITION = {}; var SQUARECHECK = {}; var end = false;
初始化地圖(CreateMap())
用BOMBPOSITION這個(gè)hash表記錄雷的位置,然后生成地圖長*地圖寬數(shù)量的div塊然后完成定位,然后用SQUAERPOSITION記錄這些div塊并且用SQUARECHECK記錄當(dāng)前這些塊有沒有被點(diǎn)擊(記錄是否是未開啟塊)
function CreateMap() { //生成初始的地圖 //根據(jù)雷的數(shù)目生成一個(gè)隨機(jī)雷數(shù)目 Create_BOMB(); for (let i = 0; i < MAPSIZE; i++) { for (let j = 0; j < MAPSIZE; j++) { var divEle = document.createElement("div"); divEle.className = "lattice"; divEle.style.top = 20 * i + "px"; divEle.style.left = 20 * j + "px"; divEle.onclick = function () { //這里點(diǎn)擊后進(jìn)行判斷 if (end == false) { if (BOMBPOSITION[i + "_" + j] == 1) { //展示所有炸彈的位置 GAMEOVER(); } else { //進(jìn)行一個(gè)遞歸的更改 Remove(i, j); } } } document.getElementById("container").appendChild(divEle); SQUAERPOSITION[i + "_" + j] = divEle; SQUARECHECK[i + "_" + j] = false; } } }
生成雷(Create_BOMB())
這里的生成就是完善BOMBPOSITION這個(gè)hash表
function Create_BOMB() { let bombnum = 0; while (bombnum < BOMBNUM) { let x = _.random(0, MAPSIZE - 1); let y = _.random(0, MAPSIZE - 1); if (BOMBPOSITION[x + "_" + y] == undefined) { BOMBPOSITION[x + "_" + y] = 1; bombnum++; } } }
每個(gè)div塊的點(diǎn)擊事件
游戲結(jié)束GAMEOVER()
如果點(diǎn)到了雷就展示所有雷的位置然后游戲結(jié)束
function GAMEOVER() { for (let index in BOMBPOSITION) { SQUAERPOSITION[index].innerText = "@" } end = true; }
處理點(diǎn)擊的塊(Remove())
這個(gè)處理是個(gè)遞歸過程,一個(gè)div會(huì)引起其他div的處理所有要先檢查下游戲是不是結(jié)束了,如果沒結(jié)束就遍歷周邊一圈的塊,也就是x - 1 -> x + 1 y - 1 -> y + 1,但是自身就不需要遍歷了,這里要注意,然后這些塊如果已經(jīng)被處理過了也不用進(jìn)行處理,遍歷完后如果有雷則在這個(gè)塊上記錄雷數(shù)目,如果沒有雷那么就將周邊塊中未遍歷的進(jìn)行Remove()處理,這個(gè)過程是一個(gè)遞歸,也可以理解成深度優(yōu)先級(jí)處理。
function Remove(x, y) { if (ISGAMEOVER()) { if (end == false) { alert("游戲結(jié)束"); GAMEOVER(); } return; } let Result_Detection = Bomb_Detection(x, y); if (Result_Detection[0].length == 1) { if (Result_Detection[0][0] == 0) { //單純變顏色 Change(x, y); } else { //更改里面的文字是雷的數(shù)目 Change(x, y); SQUAERPOSITION[x + "_" + y].innerText = Result_Detection[0][0]; } } else { //如果沒有雷自己先變化然后遍歷剩下的 Change(x, y); for (let i = 0; i < Result_Detection.length; i++) { //遍歷八個(gè)方向剩下的 Remove(Result_Detection[i][0], Result_Detection[i][1]); } //console.log(x + " " + y); //console.log(Result_Detection); } }
檢測游戲是否結(jié)束(ISGAMEOVER())
就是看一下還有多少塊沒被處理,如果正好是雷的數(shù)目那就游戲結(jié)束了
function ISGAMEOVER() { let UsedNum = 0; for (let index in SQUARECHECK) { if (SQUARECHECK[index] == true) { UsedNum++; } } console.log(UsedNum); if (UsedNum == MAPSIZE * MAPSIZE - BOMBNUM) return true; else return false; }
周邊遍歷(Bomb_Detection())
如果有雷就返回[[Bomb_num]],如果沒有雷但是周邊的都被遍歷過了就返回[[0]],如果沒有雷然后有未被遍歷過的元素則返回未遍歷數(shù)組queue[]
function Bomb_Detection(x, y) { let queue = []; let bombnum = 0; for (let i = x - 1; i <= x + 1; i++) { for (let j = y - 1; j <= y + 1; j++) { if ((i != x || j != y)&&Edge_Detection(i,j) == true) { if (BOMBPOSITION[i + "_" + j] == 1) { bombnum++; } else if (SQUARECHECK[i + "_" + j] == false) { queue.push([i, j]); } } } } if (bombnum > 0) { //如果周邊有雷 return [ [bombnum] ]; } else if (bombnum == 0 && queue.length == 0) { //如果周邊沒雷但是所有的都被遍歷過了 return [ [0] ]; } else { return queue; } }
邊界檢測(Edge_Detection())
在遍歷周邊塊的時(shí)候要注意,這個(gè)周邊塊需要是合理的
function Edge_Detection(x, y) { //只要在0,0 -> MAPSIZE,MAPSIZE就行 if (x >= 0 && y >= 0 && x < MAPSIZE && y < MAPSIZE) { return true } else { return false } }
處理被處理的塊(Change())
如果是周邊沒有雷那就是變成空白,如果有就寫上數(shù)字,如果是雷就里面加上@
function Change(x, y) { SQUAERPOSITION[x + "_" + y].className = "lattice2"; SQUARECHECK[x + "_" + y] = true; SQUAERPOSITION[x + "_" + y].style.top = 20 * x + "px"; SQUAERPOSITION[x + "_" + y].style.left = 20 * y + "px"; }
整體代碼
<!DOCTYPE html> <html> <head> <title>掃雷</title> <meta charset="utf-8"> <style> .container { left: 200px; height: 200px; width: 200px; position: relative; } .lattice { height: 20px; width: 20px; top: 0px; left: 0px; border-style: solid; border-width: 1px; border-color: #ffffff; background-color: #5E5E5E; position: absolute; color: crimson; } .lattice2 { height: 20px; width: 20px; top: 0px; left: 0px; border-style: solid; border-width: 1px; border-color: #5E5E5E; background-color: #ffffff; position: absolute; color: black; } </style> <script type="text/javascript" src="http://cdn.bootcss.com/lodash.js/4.16.6/lodash.min.js"></script> <script> var MAPSIZE = 10; var BOMBNUM = 1; var BOMBPOSITION = {}; var SQUAERPOSITION = {}; var SQUARECHECK = {}; var end = false; function Init() { CreateMap(); } function CreateMap() { //生成初始的地圖 //根據(jù)雷的數(shù)目生成一個(gè)隨機(jī)雷數(shù)目 Create_BOMB(); for (let i = 0; i < MAPSIZE; i++) { for (let j = 0; j < MAPSIZE; j++) { var divEle = document.createElement("div"); divEle.className = "lattice"; divEle.style.top = 20 * i + "px"; divEle.style.left = 20 * j + "px"; divEle.onclick = function () { //這里點(diǎn)擊后進(jìn)行判斷 if (end == false) { if (BOMBPOSITION[i + "_" + j] == 1) { //展示所有炸彈的位置 GAMEOVER(); } else { //進(jìn)行一個(gè)遞歸的更改 Remove(i, j); } } } document.getElementById("container").appendChild(divEle); SQUAERPOSITION[i + "_" + j] = divEle; SQUARECHECK[i + "_" + j] = false; } } } function Create_BOMB() { let bombnum = 0; while (bombnum < BOMBNUM) { let x = _.random(0, MAPSIZE - 1); let y = _.random(0, MAPSIZE - 1); if (BOMBPOSITION[x + "_" + y] == undefined) { BOMBPOSITION[x + "_" + y] = 1; bombnum++; } } } function Remove(x, y) { if (ISGAMEOVER()) { if (end == false) { alert("游戲結(jié)束"); GAMEOVER(); } return; } let Result_Detection = Bomb_Detection(x, y); if (Result_Detection[0].length == 1) { if (Result_Detection[0][0] == 0) { //單純變顏色 Change(x, y); } else { //更改里面的文字是雷的數(shù)目 Change(x, y); SQUAERPOSITION[x + "_" + y].innerText = Result_Detection[0][0]; } } else { //如果沒有雷自己先變化然后遍歷剩下的 Change(x, y); for (let i = 0; i < Result_Detection.length; i++) { //遍歷八個(gè)方向剩下的 Remove(Result_Detection[i][0], Result_Detection[i][1]); } //console.log(x + " " + y); //console.log(Result_Detection); } } function Change(x, y) { SQUAERPOSITION[x + "_" + y].className = "lattice2"; SQUARECHECK[x + "_" + y] = true; SQUAERPOSITION[x + "_" + y].style.top = 20 * x + "px"; SQUAERPOSITION[x + "_" + y].style.left = 20 * y + "px"; } function GAMEOVER() { for (let index in BOMBPOSITION) { SQUAERPOSITION[index].innerText = "@" } end = true; } function ISGAMEOVER() { let UsedNum = 0; for (let index in SQUARECHECK) { if (SQUARECHECK[index] == true) { UsedNum++; } } console.log(UsedNum); if (UsedNum == MAPSIZE * MAPSIZE - BOMBNUM) return true; else return false; } function Bomb_Detection(x, y) { let queue = []; let bombnum = 0; for (let i = x - 1; i <= x + 1; i++) { for (let j = y - 1; j <= y + 1; j++) { if ((i != x || j != y)&&Edge_Detection(i,j) == true) { if (BOMBPOSITION[i + "_" + j] == 1) { bombnum++; } else if (SQUARECHECK[i + "_" + j] == false) { queue.push([i, j]); } } } } if (bombnum > 0) { //如果周邊有雷 return [ [bombnum] ]; } else if (bombnum == 0 && queue.length == 0) { //如果周邊沒雷但是所有的都被遍歷過了 return [ [0] ]; } else { return queue; } } function Edge_Detection(x, y) { //只要在0,0 -> MAPSIZE,MAPSIZE就行 if (x >= 0 && y >= 0 && x < MAPSIZE && y < MAPSIZE) { return true } else { return false } } </script> </head> <body onload="Init()"> <div class="container" id="container"> </div> </body> </html>
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js+canvas實(shí)現(xiàn)簡單掃雷小游戲
- 通過javascript實(shí)現(xiàn)掃雷游戲代碼實(shí)例
- HTML+JavaScript實(shí)現(xiàn)掃雷小游戲
- js實(shí)現(xiàn)掃雷小程序的示例代碼
- JavaScript版經(jīng)典游戲之掃雷游戲完整示例【附demo源碼下載】
- 分享自己用JS做的掃雷小游戲
- 使用純javascript實(shí)現(xiàn)經(jīng)典掃雷游戲
- JavaScript制作windows經(jīng)典掃雷小游戲
- js版掃雷實(shí)現(xiàn)代碼 原理不錯(cuò)
- javascript 掃雷游戲
- js實(shí)現(xiàn)簡單掃雷
相關(guān)文章
Javascript必知必會(huì)(四)js類型轉(zhuǎn)換
這篇文章主要介紹了Javascript必知必會(huì)(四)js類型轉(zhuǎn)換 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06Google Map V3 綁定氣泡窗口(infowindow)Dom事件實(shí)現(xiàn)代碼
無法在infowindow里面添加的div進(jìn)行綁定事件處理,官方的API,發(fā)現(xiàn)了google.maps.InfoWindow下面的Events里面有個(gè)domready事件2013-04-04js判斷背景圖片是否加載成功使用img的width實(shí)現(xiàn)
判斷背景圖片是否加載成功想必大家對(duì)此很陌生吧,會(huì)了之后就可以判斷css背景圖片了,具體判斷代碼如下,感興趣的朋友可以參考下哈2013-05-05JS組件Bootstrap Table表格行拖拽效果實(shí)現(xiàn)代碼
這篇文章分享了JS組件Bootstrap Table表格行拖拽效果實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-12-12javascript js 操作數(shù)組 增刪改查的簡單實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猨avascript js 操作數(shù)組 增刪改查的簡單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06詳解JS轉(zhuǎn)換數(shù)值函數(shù)Number()、parseInt()、parseFloat()
JS中有三種函數(shù)可以將非數(shù)值轉(zhuǎn)換成數(shù)值:Number()、parseInt()和parseFloat()。接下來通過本文詳細(xì)的給大家介紹JS轉(zhuǎn)換數(shù)值函數(shù)Number()、parseInt()、parseFloat()的實(shí)例代碼,感興趣的朋友一起看看吧2018-08-08javascript DOM對(duì)象的學(xué)習(xí)實(shí)例代碼
javascript DOM對(duì)象的學(xué)習(xí)實(shí)例代碼2009-06-06javascript函數(shù)中參數(shù)傳遞問題示例探討
本節(jié)主要與大家探討下javascript函數(shù)中參數(shù)傳遞問題,有不明白的朋友可以參考下2014-07-07