得分: 分
摘要:判斷游戲是否結(jié)束如果棋子移動了得到的,就再次產(chǎn)生新的棋子調(diào)用函數(shù),給棋子涂色并記錄當(dāng)前分?jǐn)?shù)建立滑動屏幕監(jiān)聽事件,通過判斷滑動方向來執(zhí)行對應(yīng)的移動操作,并在每次滑動屏幕后調(diào)用判斷游戲是否結(jié)束。
一、前言
今年過完年來到學(xué)校步入了大三下學(xué)期,一番掙扎之后狠心放棄了學(xué)了一年多的Java,決定開始轉(zhuǎn)戰(zhàn)喜歡的前端。然后每天泡在實(shí)驗(yàn)室里學(xué)習(xí)前端的基礎(chǔ),一切從零開始,這期間剛好是各大互聯(lián)網(wǎng)公司春招的時(shí)候就順便往幾個(gè)大廠投了的簡歷,申請暑期實(shí)習(xí)。2048小游戲是360奇舞學(xué)院的前端星的壓軸選拔題目。剛看到這個(gè)題目時(shí)一臉懵,因?yàn)槲抑皼]玩過2048小游戲不知道這是個(gè)什么東西【允悲】,接下來就跟大家一起分享一下我用了5天的課余時(shí)間從不知道這是個(gè)什么游戲到最后把它寫出來的過程吧。[這是一道30分的題目 我得了23分 大佬評語是動畫做的差了點(diǎn)]
二、題目描述用JavaScript實(shí)現(xiàn)一個(gè)2048小游戲
題目要求:
實(shí)現(xiàn)web的2048游戲,使用JavaScript或TypeScript完成
基本規(guī)則、計(jì)算分?jǐn)?shù)和判斷終局準(zhǔn)確無誤
移動數(shù)字時(shí)有基本的動畫效果
加分項(xiàng)
適配移動端
其他額外的效果或可玩性改進(jìn)
代碼實(shí)現(xiàn)優(yōu)雅,注釋完整
三、游戲設(shè)計(jì)思路先一起來看一下項(xiàng)目文件結(jié)構(gòu)(此項(xiàng)目我沒用任何框架和jQuery庫)
頁面布局樣式,先把頁面基本元素展示出來(HTML+CSS完整代碼)。
HTML
2048小游戲 2048小游戲
重新開始
得分: 分
這里我做了手機(jī)端適配,這段代碼可以讓頁面在手機(jī)端等比放大。
CSS
body { background-color: #ced9c5; text-align: center; font-size: 20px; font-weight: bold; font-family: "Microsoft YaHei"; } /*header部分樣式*/ header{ display: block; margin: 0px auto; text-align: center; } header h1{ font-size: 1.5em; } header #newgame_btn{ width: 100px; padding:10px; background: #7da962; font-family:inherit; font-size: 20px; color: #fff; border-radius: 10px; text-decoration: none; } /*table樣式*/ table { margin: 0px auto; margin-top: 30px; border-radius: 10px; background-color: #bfc0bb; border-spacing: 8px; } td { width: 80px; height: 80px; border-radius: 10px; -webkit-transition: all 0.2s ease-out; -moz-transition: all 0.2s ease-out; -o-transition: all 0.2s ease-out; transition: all 0.2s ease-out; } /*footer部分樣式*/ main .number_title { font-size: 0.8em; } main #show_number{ color: #f8563d; font-size: 1.3em; } .inner { height: 50px; line-height: 1.8; text-align: center; padding: 15px; font-size: .7em; color: #656565; } footer .operation_pc{ border-top: 1px solid #bfc0bb; } footer .operation_phone{ border-bottom: 1px solid #bfc0bb; }
棋盤棋子初始化與產(chǎn)生新的棋子、計(jì)分和對產(chǎn)生的新棋子涂色
通過了解游戲規(guī)則,游戲中有16個(gè)格子,游戲剛開始時(shí)需要隨機(jī)在兩個(gè)格子里出現(xiàn)兩個(gè)數(shù),接下來每次移動后要產(chǎn)生一個(gè)隨機(jī)數(shù),隨機(jī)數(shù)只能是隨機(jī)的2或4。所以這里我們就要做一個(gè)生成隨機(jī)數(shù)的函數(shù)。
通過調(diào)用這個(gè)函數(shù)并傳入最大和最小數(shù)值的參數(shù),然后函數(shù)會返回一個(gè)介于這兩個(gè)數(shù)之間(包括這兩個(gè)數(shù))的一個(gè)隨機(jī)整數(shù)。
function GetRandom(Min,Max){ return Min + Math.round((Max-Min) * Math.random()); }
調(diào)用產(chǎn)生隨機(jī)數(shù)的函數(shù),在1~16的空格子里產(chǎn)生隨機(jī)的2或4。
要注意的是,在產(chǎn)生隨機(jī)的2或4時(shí)要先判斷要放入隨機(jī)數(shù)的格子是否是空的,如果隨機(jī)找的格子不為空則不產(chǎn)生隨機(jī)的2或4,要再次調(diào)用自身直到找到空的格子為止。
/*給隨機(jī)的格子放入隨機(jī)的2或4*/ function RandomNum(){ // 產(chǎn)生一個(gè)1~16的隨機(jī)數(shù)來獲取一個(gè)格子的ID let num = GetRandom(1,16); // 空格子數(shù)量計(jì)數(shù)器 let count = 0; // 判斷產(chǎn)生隨機(jī)格子內(nèi)是否有數(shù)字 if(document.getElementById(num).innerHTML == ""){ // 產(chǎn)生2或4隨機(jī)數(shù)并放入隨機(jī)產(chǎn)生的空格子中 document.getElementById(num).innerHTML = GetRandom(1,2) * 2; } // 如果格子有數(shù)字遍歷棋盤是否放慢了棋子 else{ // 遍歷棋盤是否有空格子,如果有計(jì)數(shù)器就累加1 for(let i = 1; i <= 16; i++){ let piece_ = document.getElementById(i); if( piece_.innerHTML== ""){ count++; } } // 判斷棋盤是否有空格,如果有就再次執(zhí)行隨機(jī)產(chǎn)生棋子的函數(shù) if(count > 0){ RandomNum(); } } }
接下來創(chuàng)建一個(gè)每次棋子移動后產(chǎn)生結(jié)果的函數(shù),這里創(chuàng)建一個(gè)控制不同數(shù)字背景顏色的對象
let color_object = { "":"#d3d3d3", "2":"#fef4f2", "4":"#fed9a2", "8":"#fc8c5e", "16":"#f8692f", "32":"#f8563d", "64":"#ff3936", "128":"#00c3dd", "256":"#00a4be", "512":"#00abcb", "1024":"#00abcb", "2048":"#00abcb", "4096":"#005d6e" };
產(chǎn)生隨機(jī)數(shù)和結(jié)果的函數(shù)創(chuàng)建后,進(jìn)行函數(shù)的初始化。
function init(){ // 獲取棋盤table對象 let checkerBoard = document.getElementById("checkerBoard"); let text = ""; let id = 1; // 循環(huán)產(chǎn)生tr*4+td*4的行和列并給每一個(gè)tablecell賦予ID值(用1~16分別代表每個(gè)格子的ID值) for(let i = 1; i < 5; i++){ // 拼接text += " "; for(let j = i; j <= i+12; j += 4){ // 拼接 text += "" } // 把循環(huán)產(chǎn)生的行和列放入table中 checkerBoard.innerHTML = text; // 在棋盤中循環(huán)放入兩個(gè)由RandomNum()產(chǎn)生的隨機(jī)位置和隨機(jī)的2或4 for(let k = 0; k < 2; k++){ RandomNum(); } Result(); }text += " "; // 使td的ID值依次遞增 id++; } // 拼接
main.js(完整的main.js代碼)
/*新打開窗口時(shí)初始化游戲*/ window.onload = init(); /*點(diǎn)擊重新開始游戲按鈕時(shí)初始化游戲*/ function newGame(){ init(); } /*生成一個(gè)介于兩個(gè)整數(shù)之間的隨機(jī)整數(shù)*/ function GetRandom(Min,Max){ return Min + Math.round((Max-Min) * Math.random()); } /*給隨機(jī)的格子放入隨機(jī)的2或4*/ function RandomNum(){ // 產(chǎn)生一個(gè)1~16的隨機(jī)數(shù)來獲取一個(gè)格子的ID let num = GetRandom(1,16); // 空格子數(shù)量計(jì)數(shù)器 let count = 0; // 判斷產(chǎn)生隨機(jī)格子內(nèi)是否有數(shù)字 if(document.getElementById(num).innerHTML == ""){ // 產(chǎn)生2或4隨機(jī)數(shù)并放入隨機(jī)產(chǎn)生的空格子中 document.getElementById(num).innerHTML = GetRandom(1,2) * 2; } // 如果格子有數(shù)字遍歷棋盤是否放慢了棋子 else{ // 遍歷棋盤是否有空格子,如果有計(jì)數(shù)器就累加1 for(let i = 1; i <= 16; i++){ let piece_ = document.getElementById(i); if( piece_.innerHTML== ""){ count++; } } // 判斷棋盤是否有空格,如果有就再次執(zhí)行隨機(jī)產(chǎn)生棋子的函數(shù) if(count > 0){ RandomNum(); } } } /*初始化游戲數(shù)據(jù)*/ function init(){ // 獲取棋盤table對象 let checkerBoard = document.getElementById("checkerBoard"); let text = ""; let id = 1; // 循環(huán)產(chǎn)生tr*4+td*4的行和列并給每一個(gè)tablecell賦予ID值(用1~16分別代表每個(gè)格子的ID值) for(let i = 1; i < 5; i++){ // 拼接text += " "; for(let j = i; j <= i+12; j += 4){ // 拼接 text += "" } // 把循環(huán)產(chǎn)生的行和列放入table中 checkerBoard.innerHTML = text; // 在棋盤中循環(huán)放入兩個(gè)由RandomNum()產(chǎn)生的隨機(jī)位置和隨機(jī)的2或4 for(let k = 0; k < 2; k++){ RandomNum(); } Result(); } /*給不同數(shù)值的棋子涂上不同的顏色,并計(jì)算得分*/ function Result(){ // 給分?jǐn)?shù)初始值為0 let score = 0; // 計(jì)數(shù)棋子的數(shù)量 let count = 0; // 定義一個(gè)數(shù)值對應(yīng)顏色的對象 let color_object = { "":"#d3d3d3", "2":"#fef4f2", "4":"#fed9a2", "8":"#fc8c5e", "16":"#f8692f", "32":"#f8563d", "64":"#ff3936", "128":"#00c3dd", "256":"#00a4be", "512":"#00abcb", "1024":"#00abcb", "2048":"#00abcb", "4096":"#005d6e" }; for(let i = 1; i <= 16; i++){ // 遍歷所有棋子,給對應(yīng)數(shù)值的棋子涂上對應(yīng)的顏色 let text = document.getElementById(i); text.style.backgroundColor = color_object[text.innerHTML]; // 以棋子數(shù)值為8的棋子作為臨界給數(shù)值大于等于8和小于8的棋子數(shù)字分別設(shè)置不同的顏色 if(text.innerHTML >= 8){ text.style.color = "#fff"; }else{ text.style.color = "#6e6f71"; } // 如果格子的數(shù)值不為空就把此格子上棋子的數(shù)值累加作為當(dāng)前得分 if(text.innerHTML != ""){ score += parseInt(text.innerHTML); count++; } } // 如果棋子數(shù)量為2時(shí),即游戲剛初始化,此時(shí)分?jǐn)?shù)置零 if(count == 2){ document.getElementById("show_number").innerHTML = 0; } // 如果棋子數(shù)量不是二則正常累加得分 else{ document.getElementById("show_number").innerHTML = score; } }text += " "; // 使td的ID值依次遞增 id++; } // 拼接
接下來開始讓棋子動起來(pc端用方向鍵操作,移動端用手指滑動操作)
創(chuàng)建一個(gè)棋子移動的函數(shù),并設(shè)兩個(gè)參數(shù)。
function Change(piece_1,piece_2){ // 判斷如果棋子要移動的方向有空格就將其移動 if(piece_1.innerHTML == "" && piece_2.innerHTML != ""){ res = true; piece_1.innerHTML = piece_2.innerHTML; piece_2.innerHTML = ""; } // 判斷如果相鄰棋子都不為空并且數(shù)值相等就將他們合并,同時(shí)將一個(gè)格子置空 else if(piece_1.innerHTML != "" && piece_1.innerHTML == piece_2.innerHTML){ res = true; piece_1.innerHTML = parseInt(piece_1.innerHTML) + parseInt(piece_2.innerHTML); piece_2.innerHTML = ""; } }
棋子往各個(gè)方向移動的函數(shù)Top()、Down()、Right()、Left()這里不再一一陳述見下面完整代碼。
建立鍵盤監(jiān)聽來判斷按壓對應(yīng)的方向鍵執(zhí)行對應(yīng)的移動函數(shù),并在每次按壓后調(diào)用gameOver();判斷游戲是否結(jié)束。
document.onkeydown = function pc_move(){ res = false; if(event.keyCode == 38) Top(); else if(event.keyCode == 40) Down(); else if(event.keyCode == 37) Left(); else if(event.keyCode == 39) Right(); // 判斷游戲是否結(jié)束 gameOver(); // 如果棋子移動了得到的res==true,就再次產(chǎn)生新的棋子 if(res) RandomNum(); // 調(diào)用Result()函數(shù),給棋子涂色并記錄當(dāng)前分?jǐn)?shù) Result(); }
建立滑動屏幕監(jiān)聽事件,通過判斷滑動方向來執(zhí)行對應(yīng)的移動操作,并在每次滑動屏幕后調(diào)用gameOver();判斷游戲是否結(jié)束。
值得注意的是在手機(jī)上滑動時(shí)屏幕默認(rèn)的動作是頁面滑動,所以用下面的一行代碼來阻止默認(rèn)事件的執(zhí)行。
e.preventDefault();
function touch_move(){ // 定義滑動的起點(diǎn)和終點(diǎn)X、Y坐標(biāo)值 let startX = 0; let startY = 0; let endX = 0; let endY = 0; // 獲取棋盤對象 let table = document.getElementById("checkerBoard"); // 給棋盤綁定"touchstart"事件 table.addEventListener("touchstart",function(e){ let touch = event.targetTouches[0]; // 在手指點(diǎn)擊屏幕時(shí)阻止屏幕拖動事件 e.preventDefault(); //獲取手指滑動起點(diǎn)坐標(biāo) startX = touch.pageX; startY = touch.pageY; }); // 給棋盤綁定"touchmove"事件 table.addEventListener("touchmove",function(e){ let touch = event.targetTouches[0]; // 在手指滑動屏幕時(shí)阻止屏幕拖動事件 e.preventDefault(); //獲取手指滑動屏幕的終點(diǎn)坐標(biāo) endX = touch.pageX; endY = touch.pageY; }); // 給棋盤綁定"touchend"事件 table.addEventListener("touchend",function(e){ // 在手指滑動屏幕結(jié)束時(shí)阻止屏幕拖動事件 e.preventDefault(); //滑動結(jié)束,計(jì)算出手指分別在X、Y軸上滑動距離 let distanceX = endX - startX; let distanceY = endY - startY; res = false; // console.log("startX " + startX + " startY" + startY); // console.log("endX" + endX + " endY" + endY); // console.log("distanceX" + distanceX + " distanceY" + distanceY) // console.log("------------------------------------------------------------------------------"); // 如果終點(diǎn)坐標(biāo)X、Y值都不為零則進(jìn)入下一步判斷滑動方向 if(endX!=0 && endY!=0){ //向上滑動 if(Math.abs(distanceY) > Math.abs(distanceX) && distanceY < -10){ Top(); } //向下滑動 else if(Math.abs(distanceY) > Math.abs(distanceX) && distanceY > 10){ Down(); } //向左滑動 else if(Math.abs(distanceX) > Math.abs(distanceY) && distanceX < -10){ Left(); } //向右滑動 else if(Math.abs(distanceX) > Math.abs(distanceY) && distanceX > 10){ Right(); } // 判斷游戲是否結(jié)束 gameOver(); // 如果棋子移動了得到的res==true,就再次產(chǎn)生新的棋子 if(res){ RandomNum(); } // 將以上綁定事件獲取的起始點(diǎn)坐標(biāo)值置零 startX = startY = endX = endY = 0; } // 調(diào)用Result()函數(shù),給棋子涂色并記錄當(dāng)前分?jǐn)?shù) Result(); }); } touch_move();
move.js(move.js完整代碼)
// 控制棋盤是否產(chǎn)生隨機(jī)的棋子,當(dāng)res==true時(shí)產(chǎn)生新的棋子 let res = false; /*移動棋子使相鄰并且相同數(shù)值的棋子合并,同時(shí)將數(shù)值相加*/ function Change(piece_1,piece_2){ // 判斷如果棋子要移動的方向有空格就將其移動 if(piece_1.innerHTML == "" && piece_2.innerHTML != ""){ res = true; piece_1.innerHTML = piece_2.innerHTML; piece_2.innerHTML = ""; } // 判斷如果相鄰棋子都不為空并且數(shù)值相等就將他們合并,同時(shí)將一個(gè)格子置空 else if(piece_1.innerHTML != "" && piece_1.innerHTML == piece_2.innerHTML){ res = true; piece_1.innerHTML = parseInt(piece_1.innerHTML) + parseInt(piece_2.innerHTML); piece_2.innerHTML = ""; } } /*向上移動棋子*/ function Top(){ for(let i = 1; i < 5; i++){ for(let j = i; j <= i + 12; j += 4){ for(let k = j; k > 4; k -= 4){ let piece_1 = document.getElementById(k - 4); let piece_2 = document.getElementById(k); Change(piece_1,piece_2); } } } } /*向下移動棋子*/ function Down(){ for(let i = 1; i < 5; i++){ for(let j = i + 12; j >= i; j -= 4){ for(let k = j; k < 13; k += 4){ let piece_1 = document.getElementById(k + 4); let piece_2 = document.getElementById(k); Change(piece_1,piece_2); } } } } /*向左移動棋子*/ function Left(){ for(let i = 1; i <= 13; i += 4){ for(let j = i; j <= i + 3; j += 1){ for(let k = j; k > i; k -= 1){ let piece_1 = document.getElementById(k - 1); let piece_2 = document.getElementById(k); Change(piece_1,piece_2); } } } } /*向右移動棋子*/ function Right(){ for(let i = 1; i <= 13; i += 4){ for(let j = i + 4; j >= i; j -= 1){ for(let k = j; k < i + 3; k += 1){ let piece_1 = document.getElementById(k + 1); let piece_2 = document.getElementById(k); Change(piece_1,piece_2); } } } } /*按壓鍵盤方向鍵使棋子移動*/ document.onkeydown = function pc_move(){ res = false; if(event.keyCode == 38) Top(); else if(event.keyCode == 40) Down(); else if(event.keyCode == 37) Left(); else if(event.keyCode == 39) Right(); // 判斷游戲是否結(jié)束 gameOver(); // 如果棋子移動了得到的res==true,就再次產(chǎn)生新的棋子 if(res) RandomNum(); // 調(diào)用Result()函數(shù),給棋子涂色并記錄當(dāng)前分?jǐn)?shù) Result(); } /*滑動手機(jī)屏幕使棋子移動*/ function touch_move(){ // 定義滑動的起點(diǎn)和終點(diǎn)X、Y坐標(biāo)值 let startX = 0; let startY = 0; let endX = 0; let endY = 0; // 獲取棋盤對象 let table = document.getElementById("checkerBoard"); // 給棋盤綁定"touchstart"事件 table.addEventListener("touchstart",function(e){ let touch = event.targetTouches[0]; // 在手指點(diǎn)擊屏幕時(shí)阻止屏幕拖動事件 e.preventDefault(); //獲取手指滑動起點(diǎn)坐標(biāo) startX = touch.pageX; startY = touch.pageY; }); // 給棋盤綁定"touchmove"事件 table.addEventListener("touchmove",function(e){ let touch = event.targetTouches[0]; // 在手指滑動屏幕時(shí)阻止屏幕拖動事件 e.preventDefault(); //獲取手指滑動屏幕的終點(diǎn)坐標(biāo) endX = touch.pageX; endY = touch.pageY; }); // 給棋盤綁定"touchend"事件 table.addEventListener("touchend",function(e){ // 在手指滑動屏幕結(jié)束時(shí)阻止屏幕拖動事件 e.preventDefault(); //滑動結(jié)束,計(jì)算出手指分別在X、Y軸上滑動距離 let distanceX = endX - startX; let distanceY = endY - startY; res = false; // console.log("startX " + startX + " startY" + startY); // console.log("endX" + endX + " endY" + endY); // console.log("distanceX" + distanceX + " distanceY" + distanceY) // console.log("------------------------------------------------------------------------------"); // 如果終點(diǎn)坐標(biāo)X、Y值都不為零則進(jìn)入下一步判斷滑動方向 if(endX!=0 && endY!=0){ //向上滑動 if(Math.abs(distanceY) > Math.abs(distanceX) && distanceY < -10){ Top(); } //向下滑動 else if(Math.abs(distanceY) > Math.abs(distanceX) && distanceY > 10){ Down(); } //向左滑動 else if(Math.abs(distanceX) > Math.abs(distanceY) && distanceX < -10){ Left(); } //向右滑動 else if(Math.abs(distanceX) > Math.abs(distanceY) && distanceX > 10){ Right(); } // 判斷游戲是否結(jié)束 gameOver(); // 如果棋子移動了得到的res==true,就再次產(chǎn)生新的棋子 if(res){ RandomNum(); } // 將以上綁定事件獲取的起始點(diǎn)坐標(biāo)值置零 startX = startY = endX = endY = 0; } // 調(diào)用Result()函數(shù),給棋子涂色并記錄當(dāng)前分?jǐn)?shù) Result(); }); } touch_move();
進(jìn)行游戲結(jié)束判斷(遍歷棋盤當(dāng)棋盤放滿棋子,并且每個(gè)棋子上下左右相鄰位置都不相同則游戲結(jié)束)
gameOver.js(gameOver.js完整代碼)
/*游戲結(jié)束判斷*/ function gameOver(){ // 設(shè)置一個(gè)空格子計(jì)數(shù)器 let count = 0; // 遍歷棋盤是否有空格子,如果有計(jì)數(shù)器就累加1 for(let i = 1; i <= 16; i++){ let piece_ = document.getElementById(i); if( piece_.innerHTML== ""){ count++; } } // 判斷棋盤是否擺滿棋子 if(count == 0){ // 當(dāng)棋盤擺滿棋子時(shí),遍歷所有棋子看其與相鄰的棋子數(shù)值是否相等,一旦有相等的計(jì)數(shù)器就累加1 for(let i = 1; i <= 16; i++){ let piece_self = document.getElementById(i); let piece_add_1 = document.getElementById(i + 1); let piece_cut_1 = document.getElementById(i - 1); let piece_add_4 = document.getElementById(i + 4); let piece_cut_4 = document.getElementById(i - 4); switch (i){ case 1: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML)){ count++; } break; case 2: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML)){ count++; } break; case 3: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML)){ count++; } break; case 4: if(parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML)){ count++; } break; case 5: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; case 6: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; case 7: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; case 8: if(parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; case 9: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; case 10: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; case 11: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; case 12: if(parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_add_4.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; case 13: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; case 14: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; case 15: if(parseInt(piece_self.innerHTML) == parseInt(piece_add_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; case 16: if(parseInt(piece_self.innerHTML) == parseInt(piece_cut_1.innerHTML) || parseInt(piece_self.innerHTML) == parseInt(piece_cut_4.innerHTML)){ count++; } break; default: break; } } // 當(dāng)遍歷所有棋子后與相鄰位置棋子數(shù)值都不相等,游戲結(jié)束 if(count == 0){ // 獲取當(dāng)前得分 let score = document.getElementById("show_number").innerHTML; alert("瀟灑人生,極限挑戰(zhàn)。游戲結(jié)束! 您的得分:"+score+" 分"); // 點(diǎn)擊確定按鈕后初始化游戲 init(); } } }
至此整個(gè)項(xiàng)目設(shè)計(jì)過程就結(jié)束了,由于剛轉(zhuǎn)入前端代碼書寫肯定不是很優(yōu)雅,歡迎大家對我的代碼不足之處進(jìn)行指正。
(寢室已經(jīng)斷電,室友已是鼾聲四起,準(zhǔn)備睡覺啦,明天一早還要起來去上課【允悲】)
完整項(xiàng)目訪問我的github倉庫
點(diǎn)擊此處體驗(yàn)我的2048小游戲歡迎大家轉(zhuǎn)載此文章 但請注明出處 謝謝合作
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94503.html
摘要:現(xiàn)象登入生產(chǎn)環(huán)境,使用命令因?yàn)檫@時(shí)候并沒有打的,所以只能觀察現(xiàn)象。其他的可以根據(jù)這個(gè)類推,是內(nèi)純的占用量。 前言 我們的游戲上線之初,經(jīng)常有玩家反饋卡,或者有網(wǎng)絡(luò)延遲等現(xiàn)象,造成用戶流失等現(xiàn)象,這時(shí)候我就想到是不是可能是之前的jvm配置有問題,或者存在內(nèi)存泄露等問題。 現(xiàn)象 登入生產(chǎn)環(huán)境,使用命令,因?yàn)檫@時(shí)候并沒有打gc的log,所以只能觀察現(xiàn)象。 jstat -gcutil 270...
摘要:直到今天,突然看到一個(gè)有意思的微信小游戲。后來試了幾次之后才發(fā)現(xiàn),這個(gè)小游戲比較刁,不僅做了微信的登錄授權(quán),而且做了手機(jī)端訪問的判斷,更甚至竟然用的還是協(xié)議的網(wǎng)頁。調(diào)用的目標(biāo)發(fā)生了異常。 記一次使用Fiddler抓包工具抓取Https協(xié)議數(shù)據(jù)的踩坑過程 前言 記得從剛?cè)腴T前端第一天開始,當(dāng)時(shí)的師傅就跟我介紹了一個(gè)可以抓取一些必須要在微信瀏覽器打開的鏈接的工具Fiddler,主要用來抓取...
摘要:為了實(shí)現(xiàn)物體隨機(jī)出現(xiàn)的效果,讓每個(gè)物體隨機(jī)多少秒后開始出現(xiàn)最后一個(gè)物體出現(xiàn)完,多少秒后出現(xiàn)結(jié)束畫面等等,需要理清楚各個(gè)定時(shí)器的關(guān)系,并對其添加語義化良好的標(biāo)記,及時(shí)對未完結(jié)的定時(shí)器進(jìn)行清除,防止定時(shí)器帶來的意想不到的問題。 快到年終的時(shí)候做了一個(gè)以游戲形式展示的h5活動頁,第一次嘗試使用js寫小游戲,很有趣的過程,很寶貴的經(jīng)驗(yàn)。 效果圖 直接上個(gè)效果的gif圖,游戲的一小部分效果,錄出...
閱讀 902·2021-10-25 09:44
閱讀 1279·2021-09-23 11:56
閱讀 1198·2021-09-10 10:50
閱讀 3141·2019-08-30 15:53
閱讀 2145·2019-08-30 13:17
閱讀 629·2019-08-29 18:43
閱讀 2506·2019-08-29 12:57
閱讀 865·2019-08-26 12:20