成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

javascript實現(xiàn)掃雷簡易版

瀏覽:3日期:2023-06-18 09:33:32

本文實例為大家分享了javascript實現(xiàn)掃雷簡易版的具體代碼,供大家參考,具體內(nèi)容如下

使用截圖

javascript實現(xiàn)掃雷簡易版

說明

這個完成的建議版本,所以沒有插旗子,沒有計時,就是最基本的原理實現(xiàn),熟練的大佬30min就能完成

代碼講解

初始數(shù)據(jù)

var MAPSIZE = 10; var BOMBNUM = 1; var BOMBPOSITION = {}; var SQUAERPOSITION = {}; var SQUARECHECK = {}; var end = false;

初始化地圖(CreateMap())

用BOMBPOSITION這個hash表記錄雷的位置,然后生成地圖長*地圖寬數(shù)量的div塊然后完成定位,然后用SQUAERPOSITION記錄這些div塊并且用SQUARECHECK記錄當(dāng)前這些塊有沒有被點擊(記錄是否是未開啟塊)

function CreateMap() { //生成初始的地圖 //根據(jù)雷的數(shù)目生成一個隨機雷數(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 () { //這里點擊后進行判斷 if (end == false) { if (BOMBPOSITION[i + '_' + j] == 1) { //展示所有炸彈的位置 GAMEOVER(); } else { //進行一個遞歸的更改 Remove(i, j); } } } document.getElementById('container').appendChild(divEle); SQUAERPOSITION[i + '_' + j] = divEle; SQUARECHECK[i + '_' + j] = false; } } }

生成雷(Create_BOMB())

這里的生成就是完善BOMBPOSITION這個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++; } } }

每個div塊的點擊事件

游戲結(jié)束GAMEOVER()

如果點到了雷就展示所有雷的位置然后游戲結(jié)束

function GAMEOVER() { for (let index in BOMBPOSITION) { SQUAERPOSITION[index].innerText = '@' } end = true; }

處理點擊的塊(Remove())

這個處理是個遞歸過程,一個div會引起其他div的處理所有要先檢查下游戲是不是結(jié)束了,如果沒結(jié)束就遍歷周邊一圈的塊,也就是x - 1 -> x + 1 y - 1 -> y + 1,但是自身就不需要遍歷了,這里要注意,然后這些塊如果已經(jīng)被處理過了也不用進行處理,遍歷完后如果有雷則在這個塊上記錄雷數(shù)目,如果沒有雷那么就將周邊塊中未遍歷的進行Remove()處理,這個過程是一個遞歸,也可以理解成深度優(yōu)先級處理。

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++) { //遍歷八個方向剩下的 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())

在遍歷周邊塊的時候要注意,這個周邊塊需要是合理的

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ù)目生成一個隨機雷數(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 () { //這里點擊后進行判斷 if (end == false) { if (BOMBPOSITION[i + '_' + j] == 1) { //展示所有炸彈的位置 GAMEOVER(); } else { //進行一個遞歸的更改 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++) { //遍歷八個方向剩下的 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 id='container'> </div></body></html>

更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經(jīng)典游戲 玩不停

java經(jīng)典小游戲匯總

javascript經(jīng)典小游戲匯總

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
悠悠资源网久久精品| 亚洲免费精品| 91视频在线看| 69精品人人人人| 日韩av不卡在线观看| 久久久av水蜜桃| 亚洲一区在线免费观看| 一区二区高清视频| 亚洲视频图片小说| 黄色亚洲免费| 国产日产欧美一区二区三区 | 国产成人av电影| 欧美人与z0zoxxxx视频| 久久国产福利国产秒拍| 欧美日韩一区二区三区免费看| 乱一区二区av| 久久亚洲一区| 日韩国产在线一| 亚洲欧美网站| 亚洲国产成人av| 麻豆久久精品| 天天色天天爱天天射综合| 欧美亚洲专区| 夜夜嗨av一区二区三区 | 欧美乱妇20p| 国产一区二区三区免费| 欧美男人的天堂一二区| 国产在线国偷精品产拍免费yy| 欧美日韩极品在线观看一区| 久久精品久久99精品久久| 91黄视频在线| 精品在线播放免费| 欧美日韩一级黄| 国产在线播放一区| 欧美久久免费观看| 国产精品一二三在| 欧美大片在线观看| 91免费版pro下载短视频| 日本一区二区免费在线观看视频| 亚洲视频久久| 一区二区成人在线| 色婷婷综合久久久中文一区二区| 日本成人在线不卡视频| 欧美老肥妇做.爰bbww| 国产精品99久久久久久久女警| 欧美一区二区黄| 91同城在线观看| 国产精品日韩精品欧美在线 | 日韩视频免费直播| 不卡的av中国片| 国产精品久久久久一区| 国产精品一级| 久久精工是国产品牌吗| 欧美一区二区三区日韩视频| 99久久精品99国产精品| 亚洲欧洲日本在线| 美女日韩在线中文字幕| 麻豆一区二区三| 69久久夜色精品国产69蝌蚪网| 不卡的av在线播放| 国产亚洲成aⅴ人片在线观看| 亚洲高清视频一区二区| 爽好多水快深点欧美视频| 欧美精品自拍偷拍| 欧美国产三区| 午夜精品福利一区二区蜜股av| 欧美电影在线免费观看| 欧美日韩精品免费观看视频完整 | 精品成人一区二区三区四区| 国产精品v欧美精品v日韩 | 91蜜桃传媒精品久久久一区二区| 综合电影一区二区三区| 亚洲一区二区在| 国产另类ts人妖一区二区| 国产区在线观看成人精品| 国产精品永久入口久久久| 精品一区在线看| 日本一区二区免费在线观看视频| 免费永久网站黄欧美| 国产二区国产一区在线观看| 中文字幕av一区二区三区高 | 久久久久青草大香线综合精品| 亚洲精品日韩久久| 久久99精品视频| 国产欧美日韩另类一区| 美日韩在线观看| av中文字幕一区| 亚洲一区二区av电影| 欧美一区二区三区在线| 91久久极品少妇xxxxⅹ软件| 激情综合亚洲精品| 成人欧美一区二区三区小说| 欧美偷拍一区二区| 欧美激情性爽国产精品17p| 亚州成人在线电影| 精品国产一区二区三区四区四| 国产精品普通话对白| 国产精品 欧美精品| 一区二区三区国产精品| 精品国产一区二区三区四区四| 午夜亚洲一区| 欧美成人一品| 日本亚洲一区二区| 久久久久久一二三区| 在线观看日韩电影| 亚洲国产精选| 成人91在线观看| 日本成人在线一区| 欧美国产97人人爽人人喊| 欧美在线一二三四区| 欧美视频四区| 国产剧情一区二区| 亚洲国产精品一区二区久久| 欧美精品一区二区三区蜜桃| 色偷偷久久人人79超碰人人澡| 精品96久久久久久中文字幕无| 丁香天五香天堂综合| 青草av.久久免费一区| 亚洲欧洲成人精品av97| 91精品国产入口在线| 欧美在线综合| 欧美精品国产一区二区| 国产成人精品免费在线| 性做久久久久久久免费看| 欧美国产丝袜视频| 日韩精品一区二区三区视频在线观看 | 中文在线一区| 欧美一区二区| 国产精品一区二区在线看| 亚洲成人午夜电影| 亚洲国产精品v| 日韩欧美一区电影| 欧美羞羞免费网站| 另类图片国产| 91久久极品少妇xxxxⅹ软件| av欧美精品.com| 九九在线精品视频| 亚洲国产精品一区二区久久恐怖片| 国产日产欧美一区二区视频| 日韩欧美在线综合网| 欧美亚洲禁片免费| 久久国产一区| 亚洲激情不卡| 国产精品观看| 91丝袜呻吟高潮美腿白嫩在线观看| 国产一区二区三区在线观看免费| 五月婷婷久久综合| 亚洲一区二区五区| 亚洲蜜桃精久久久久久久| 国产视频一区二区在线| 精品少妇一区二区| 日韩一区二区免费视频| 欧美日韩久久久| 欧美亚洲综合久久| 色又黄又爽网站www久久| 国产精品视频福利| 一本色道久久精品| 国自产拍偷拍福利精品免费一| 欧美一区二区三区免费看| eeuss鲁片一区二区三区 | 午夜天堂影视香蕉久久| 亚洲欧美日韩综合aⅴ视频| 国产精品丝袜一区| 欧美激情综合五月色丁香小说| 久久久亚洲综合| 精品国产91乱码一区二区三区| 日韩精品一区二区三区视频在线观看| 91精品久久久久久蜜臀| 欧美精品v日韩精品v韩国精品v| 色吧成人激情小说| 色诱亚洲精品久久久久久| 日本久久电影网| 欧美视频一区在线| 欧美日韩高清在线| 欧美三级日韩三级国产三级| 久久人人97超碰人人澡爱香蕉| 亚洲一区二区三区免费在线观看| 亚洲精品看片| 日韩视频精品| 亚洲欧美bt| 久久久久国产一区二区| 玖玖玖国产精品| 色94色欧美sute亚洲线路一久| 久久国产福利| 色老汉av一区二区三区| 欧美私模裸体表演在线观看| 欧美又粗又大又爽| 在线不卡中文字幕| 欧美一级理论片| 久久综合久久综合久久综合| 国产欧美日韩三级| 中文字幕亚洲在| 欧美激情艳妇裸体舞| 国产精品传媒在线| 中文字幕制服丝袜成人av| 18欧美亚洲精品| 一区二区三国产精华液| 日日欢夜夜爽一区| 国内外精品视频| eeuss鲁片一区二区三区在线观看|