日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

js實現(xiàn)消滅星星(web簡易版)

瀏覽:210日期:2024-05-15 10:26:49

昨天看視頻之后,整理思路,自己完成了簡易版消滅星星

思路:

模塊1:初始化

初始化總分數(shù)、當前分數(shù)、背景圖、選擇的星星分數(shù) 初始化星星(生成二維數(shù)組,對二維數(shù)組的每一個對象設(shè)置樣式(長、寬、背景圖),生成二維數(shù)組個div元素節(jié)點插入到游戲面板中)

模塊2:預判

判斷:

 鼠標移動到某一個方塊,判斷上下左右是否有連接著的小方塊(采用遞歸方法),然后將其存儲到數(shù)組choose[],移到其他方塊時,choose置為空

閃爍:

 將已選中的小方塊設(shè)置樣式(縮放)

顯示選擇分數(shù):

 設(shè)置初始分數(shù)和遞增分數(shù),根據(jù)選中的塊數(shù)算出選中的分數(shù)

模塊3:點擊

消失:

 點擊已選中的小方塊,將連著的所有小方塊在二維數(shù)組的位置設(shè)置為空,清空choose數(shù)組

移動:

 下移:設(shè)置一個指針,指向最下面的行。每當行+1,若遇到不為空的方塊,則pointer++,若遇到該列某行為空,則將pointer的行數(shù)設(shè)為i

  左移:最底部的一行若有一列為空,將右邊的所有方塊的列-1

判斷:

 每次點擊完成之后判斷游戲是否結(jié)束

代碼部分

html

html結(jié)構(gòu)很簡單

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>Title</title> <script src='http://m.b3g6.com/bcjs/index.js'></script> <link rel='stylesheet' href='http://m.b3g6.com/bcjs/index.css' ></head><body> <div id='pop_star'> <div id='target_score'>目標分數(shù):2000</div> <div id='now_score'>當前分數(shù):0</div> <div id='select_score'>0塊 0分</div> </div></body></html>

CSS

css布局也很簡單,相信不用我來說

* { margin: 0px; padding: 0px; }html, body { height: 100%; width: 100%;}#pop_star { width: 500px; height: 100%; background: url('./pic/background.png'); margin-left: auto; margin-right: auto; position: relative; background-size: cover; font-size: 0px;}#target_score { width: 100%; height: 50px; line-height: 50px; text-align: center; color: white; font-size: 20px; position: relative;}#now_score { width: 100%; height: 50px; line-height: 50px; text-align: center; color: white; font-size: 20px; position: relative;}#select_score { width: 100%; height: 50px; line-height: 50px; text-align: center; color: white; font-size: 20px; position: relative; opacity: 0;}

JS

/* 創(chuàng)建二維數(shù)組 * * * */var table ;var suqareWidth = 50 ; //一個星星/方塊邊長var boardWidth = 10 ; //橫豎方塊個數(shù)var squareSet = [];//小方塊的集合,二維數(shù)組var choose = [];//有相鄰的小方塊,將其放到這個數(shù)組var timer = null ;var baseScore = 5 ;var stepScore = 10 ;var totalScore = 0 ;var targetScore = 1500;var flag = true ;var tempSquare = null;//在處理鼠標動作過程中,動作被屏蔽,導致事件處理完成,有不連貫現(xiàn)象function createSquare(value , row , col){ //創(chuàng)建小方塊節(jié)點 var blocks = document.createElement(’div’); //設(shè)置樣式 blocks.style.width = suqareWidth + ’px’; blocks.style.height = suqareWidth + ’px’; blocks.style.display = ’inline-block’; blocks.style.boxSizing = ’border-box’; blocks.style.position = ’absolute’; blocks.style.borderRadius = '12px'; //小方塊的行和列,小方塊的num.jpg blocks.num = value ; blocks.row = row ; blocks.col = col ; return blocks;}function refresh(){ for(var i = 0 ; i < squareSet.length ; i ++){ for (var j = 0 ; j < squareSet[i].length ; j++) { //嚴謹判斷 if (squareSet[i][j] == null) { continue; } //將二維數(shù)組里面的小方塊對應面板的行和列顯示 squareSet[i][j].row = i; squareSet[i][j].col = j; //列*方塊長度 squareSet[i][j].style.transition = 'left 0.3s, bottom 0.3s'; squareSet[i][j].style.left = squareSet[i][j].col * suqareWidth + ’px’; squareSet[i][j].style.bottom = squareSet[i][j].row * suqareWidth + ’px’; //背景圖 squareSet[i][j].style.backgroundImage = 'url(’img/' + squareSet[i][j].num + '.png’)'; squareSet[i][j].style.backgroundSize = ’cover’; squareSet[i][j].style.transform = ’scale(0.95)’;//是圖片縮小至原來的0.95倍 } }}function checkLinked(square , arr){ //嚴謹判斷 if(square == null){ return; } //添加小方塊到arr arr.push(square); /* 判斷位于該小方塊左邊的小方格是否能被收錄進選擇數(shù)組 1.小方格不能是最左邊的 2.小方格左邊必須有小方塊 3.小方塊左邊的要和該小方塊顏色相同 4.該小方塊左邊沒有被收錄到數(shù)組中去 5.遞歸 * * */ //向左 if(square.col > 0 && squareSet[square.row][square.col - 1] && squareSet[square.row][square.col - 1].num == square.num && arr.indexOf(squareSet[square.row][square.col - 1]) == -1){ checkLinked(squareSet[square.row][square.col - 1] , arr); } //向右 if(square.col < boardWidth - 1 && squareSet[square.row][square.col + 1] && squareSet[square.row][square.col + 1].num == square.num && arr.indexOf(squareSet[square.row][square.col + 1]) == -1){ checkLinked(squareSet[square.row][square.col + 1] , arr); } //向上 if(square.row < boardWidth - 1 && squareSet[square.row + 1][square.col ] && squareSet[square.row + 1][square.col].num == square.num && arr.indexOf(squareSet[square.row + 1][square.col ]) == -1){ checkLinked(squareSet[square.row + 1][square.col] , arr); } //向上 if(square.row > 0 && squareSet[square.row - 1][square.col] && squareSet[square.row - 1][square.col].num == square.num && arr.indexOf(squareSet[square.row - 1][square.col]) == -1){ checkLinked(squareSet[square.row - 1][square.col] , arr); }}//讓選中的小方塊閃爍function flicker(arr){ var num = 0 ; //設(shè)置計時器,讓其一之閃爍 timer = setInterval(function(){ for (var i = 0 ; i < arr.length ; i++) { //設(shè)置縮放樣式 arr[i].style.border = '3px solid #BFEFFF'; arr[i].style.transform = 'scale('+(0.9 + 0.05 *Math.pow(-1 , num))+')'; } //小方塊閃爍完成之后num++,使其再次縮放 num++; },300);}function back(){ //若計時器還存在,清楚計數(shù)器 if(timer != null){ clearInterval(timer); } //返回原樣式 for(var i = 0 ; i < squareSet.length ; i++){ for(var j = 0 ; j < squareSet[i].length ; j++){ //嚴謹判斷 if (squareSet[i][j] == null) { continue; } squareSet[i][j].style.border = '0px solid #BFEFFF'; squareSet[i][j].style.transform = 'scale(0.95)'; } } }//選中分數(shù)function selectScore(){ var socre = 0 ; //遍歷choose for(var i = 0 ; i < choose.length ; i++){ socre += baseScore + stepScore * i ; } //嚴謹判斷 if (socre <= 0) { return ; } //設(shè)置select_score的樣式 var select_score = document.getElementById(’select_score’); select_score.innerHTML = choose.length + '塊' + socre + '分'; select_score.style.transition = null ; //設(shè)置透明度,讓其突然顯示 select_score.style.opacity = 1 ; //讓其逐漸消失 setTimeout(function(){ select_score.style.transition = ’opacity 1s’; select_score.style.opacity = 0; },1000); }//鼠標移動到該小方塊時,閃爍function mouseOver(obj){ //當鼠標在移動到該方塊突然移動到其他位置時 if(!flag){ tempSquare = obj; return ; } //當鼠標移開選中的方塊之后,讓其回到原來的樣式 back(); //選擇相鄰相同的小方格 //傳一個數(shù)組 choose = []; checkLinked(obj , choose);//obj是當前鼠標移到的小方塊,choose是存儲響鈴小方塊的數(shù)組 if (choose.length <= 1) { choose = [] ; return; } //將選中的設(shè)置樣式,讓其閃爍 flicker(choose); //顯示所選中的小方塊的分數(shù) selectScore();}function move(){ /* 1.設(shè)置一個指針,開始的時候指針指向最下面一行 2.此時指針和j是否一樣,一樣都++。 3.若改行該列該列有小方塊,均++,反之j++,pointer不變,循環(huán)判斷該條件 3.當j移動到該列某行的小方塊,該小方塊存在,則將j指向的小方塊的位置設(shè)置為指針指向的那一個小方塊的位置 * */ //向下移動 for (var i = 0 ; i < boardWidth ; i ++) { var pointer = 0;//pointer指向小方塊,當遇到null的時候停止,等待上面的小方塊落到這里來 for (var j = 0 ; j < boardWidth ; j ++) { if (squareSet[j][i] != null) { if (j != pointer) { squareSet[pointer][i] = squareSet[j][i]; squareSet[j][i].row = pointer; squareSet[j][i] = null; } pointer ++; } } } //橫向移動 for (var i = 0 ; i < squareSet[0].length ; ) { if (squareSet[0][i] == null) { for (var j = 0 ; j < boardWidth ; j ++) { squareSet[j].splice(i, 1); } continue; } i ++; } refresh();}function isFinish(){ for (var i = 0 ; i < squareSet.length ; i++) { for (var j = 0 ; j < squareSet[i].length ; j++) { //判斷周圍是否還有可消除的方塊 var temp = []; checkLinked(squareSet[i][j] , temp); if(temp.length > 1){ return false ; } } } return true;}function init(){ //獲取面板 table = document.getElementById(’pop_star’); //創(chuàng)建二維數(shù)組 for(var i = 0 ; i < boardWidth ; i++){ squareSet[i] = new Array(); for(var j = 0 ; j < boardWidth; j++){ //創(chuàng)建小方塊 var square = createSquare(Math.floor(Math.random() * 5), i, j); //鼠標移動到該方塊 square.onmouseover = function(){ mouseOver(this); } //點擊小方塊時的操作 square.onclick = function(){ //小方塊在被點擊的時候其他操作不能影響他的執(zhí)行 if(choose.length == 0 || !flag ){ return ; } flag = false; tempSquare = null ; /* 1.增加當前分數(shù) 2.小方塊消失 3.向下或想做移動 4.判斷游戲是否結(jié)束 */ var socre = 0 ; //遍歷choose for(var i = 0 ; i < choose.length ; i++){ socre += baseScore + stepScore * i ; } totalScore += socre ;//總分數(shù) //改變樣式 document.getElementById(’now_score’).innerHTML = ’當前分數(shù):’ + totalScore; //小方塊消失 /* 1.從二維數(shù)組里面移除選擇了的小方塊 2.在面板上移除div,不然div會一直占著格子 * */ for(var i = 0 ; i < choose.length ; i++){ //立即函數(shù),立即出發(fā)該函數(shù),否則的話,不會執(zhí)行 (function(i){ setTimeout(function(){ //將二維數(shù)組的某一值設(shè)置為空,后面的會向前移 squareSet[choose[i].row][choose[i].col] = null ; //移除div table.removeChild(choose[i]); },i * 100); })(i); } //移動 setTimeout(function(){ move(); setTimeout(function(){ var finished = isFinish(); if(finished){ if (totalScore >= targetScore) { alert(’闖關(guān)成功’); } else{ alert(’闖關(guān)失敗’); } }else{//還可以繼續(xù) choose = [] ; flag = true; mouseOver(tempSquare); } } , 300 + choose.length * 150); },choose.length * 100); } //將小方塊放進二維數(shù)組 squareSet[i][j] = square; //將創(chuàng)建好的小方塊插入到面板中 table.appendChild(square); } } //顯示小星星,刷新整個面板 refresh();}//頁面加載完成之后,初始化所有操作window.onload = function(){ init();}

其實這里還有優(yōu)化的就是闖關(guān)部分,大致的思路就是,游戲每過一關(guān)增加目標分數(shù),當游戲結(jié)束時,闖關(guān)失敗,目標分數(shù)恢復初始值。

大家有什么不懂,可以在評論區(qū)評論。

jq進階版的源碼詳情見我github,網(wǎng)址

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

標簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本成人在线不卡视频| 中文字幕成在线观看| 激情五月综合| 久久久久亚洲| 欧美a级片一区| 蜜桃一区二区三区| 亚洲欧洲一区二区天堂久久| 欧美日韩精品免费观看视欧美高清免费大片| 日韩欧美一区二区三区在线视频 | 免费在线亚洲| 精品国产精品国产偷麻豆| 91亚洲自偷观看高清| 久久蜜桃精品| 亚洲欧美久久久| 日本成人精品| 荡女精品导航| 亚洲二区精品| 欧美一区=区| 欧美一级二级视频| 精品国产三区在线| 日韩在线欧美| 夜夜精品视频| 日本午夜免费一区二区| 欧美成人精品午夜一区二区| 精品国产免费人成网站| 尹人成人综合网| 91九色综合| 久久精品国产久精国产爱| 99热精品久久| 综合亚洲视频| 国产精品最新自拍| 激情视频网站在线播放色| 不卡一区2区| 日韩精品久久久久久| 国产一区二区三区成人欧美日韩在线观看 | 中文字幕日本一区二区| 麻豆中文一区二区| 一区视频在线| 国产精品久久久久久av公交车| 不卡福利视频| 亚洲欧美网站在线观看| 成人在线观看免费视频| 亚洲欧美日本视频在线观看| 国产精品视频一区二区三区综合| 成人日韩在线| 婷婷亚洲精品| 亚洲www啪成人一区二区| 亚洲视频国产精品| 黄色aa久久| 97成人超碰| 国产一区二区三区自拍| 国产午夜一区| 亚洲午夜黄色| 国产精品视频一区二区三区综合 | 群体交乱之放荡娇妻一区二区| 亚洲狼人精品一区二区三区| 日韩免费久久| 欧美激情视频一区二区三区在线播放| 免费久久久久久久久| 天堂精品久久久久| 91看片一区| 日韩国产精品久久久| 在线视频观看日韩| 久久久一本精品| 国产精品极品国产中出| 中日韩男男gay无套| 精品国产亚洲一区二区在线观看| 麻豆久久精品| 久久久久久网| 日本vs亚洲vs韩国一区三区二区| 五月精品视频| 国产极品久久久久久久久波多结野| 欧美成人综合| 久久97视频| 四虎成人精品一区二区免费网站 | 国产极品嫩模在线观看91精品| 亚洲欧美网站| 99久久婷婷| 精品一区二区三区中文字幕 | 国产精品一区二区美女视频免费看 | 欧美在线观看天堂一区二区三区| 99精品网站| 国产精品xxx在线观看| 热久久国产精品| 欧美日韩亚洲在线观看| 精品一区二区三区中文字幕 | 手机在线电影一区| 欧美日韩18| 男女精品网站| 激情视频一区二区三区| 国产欧美日韩精品高清二区综合区| 一本一本久久| 九色精品91| 私拍精品福利视频在线一区| 精品一区二区三区免费看| 91欧美精品| 日本一区福利在线| 亚洲免费福利一区| 免费看黄色91| 鲁大师影院一区二区三区| 亚洲一级网站| 日韩不卡免费高清视频| 成人av三级| 国产精选在线| 日本久久综合| 国产美女精品视频免费播放软件| 亚洲精品麻豆| 免费看精品久久片| 久久先锋影音| 美女久久网站| 免费看精品久久片| 久久国产福利| 亚洲综合精品| 国产视频一区三区| 国产午夜久久| 蜜桃伊人久久| 亚洲精一区二区三区| 老牛国产精品一区的观看方式| japanese国产精品| 伊人久久婷婷| 亚洲免费网址| 伊人久久大香伊蕉在人线观看热v| 国产午夜精品一区二区三区欧美| 亚洲作爱视频| 在线精品亚洲| 日本麻豆一区二区三区视频| 日韩av资源网| 国产精品入口久久| 国产一区二区三区探花| 国际精品欧美精品| 韩国久久久久久| 婷婷精品视频| 亚洲制服少妇| 麻豆91精品| 亚洲aa在线| 国产日韩视频在线| 卡一精品卡二卡三网站乱码| 国产一区二区三区久久| 日韩在线观看一区| 欧美在线亚洲| 中文一区一区三区免费在线观| 欧美日韩精品一本二本三本| 亚洲伦乱视频| 999精品在线| 波多野结衣一区| 久久国产99| 日韩不卡一区二区三区 | 欧美日韩国产高清电影| 久色成人在线| 亚洲毛片在线免费| 国产精品亚洲欧美一级在线| 97人人精品| 亚洲综合日韩| 久久国产视频网| 久久麻豆视频| 99久久久久久中文字幕一区| 蜜臀久久99精品久久久画质超高清| 91精品丝袜国产高跟在线| 久久久91麻豆精品国产一区| 欧美日韩水蜜桃| 日韩欧美高清一区二区三区| 麻豆精品久久久| 亚洲国产综合在线看不卡| 少妇精品久久久一区二区三区| 久久国产人妖系列| 午夜精品成人av| 亚洲理论在线| 国内不卡的一区二区三区中文字幕| 免费黄色成人| 国产欧美日韩在线一区二区| 日韩精品不卡一区二区| 一区二区三区四区在线观看国产日韩| 国产精品密蕾丝视频下载| 丝袜诱惑一区二区| 亚洲91精品| 好看不卡的中文字幕| 国产探花一区二区| 中文在线а√在线8| 三级欧美在线一区| 国产欧美一级| 婷婷激情久久| 国产精品一区二区精品| 不卡在线一区二区| 国产精品xxx| 麻豆久久精品| 日韩精品专区| 日韩va亚洲va欧美va久久| 午夜精品成人av| 欧美精品国产白浆久久久久| 成人午夜精品| 久久精品99久久久| 蜜臀av免费一区二区三区| 国产精品手机在线播放| 日韩视频中文| 久久久国产精品网站| 亚洲精品动态| 亚洲手机在线| 手机在线电影一区| 国产欧美久久一区二区三区| 精品在线91|