摘要:前言前段時(shí)間發(fā)現(xiàn)網(wǎng)上有很多收費(fèi)或公開課都有教用做小游戲的,然后自己就也想動(dòng)手做一個(gè),做這個(gè)小游戲主要是為了鍛煉自己的邏輯能力,也算是對(duì)之前一些學(xué)習(xí)的總結(jié)吧注實(shí)現(xiàn)方法完全是自己邊玩邊想的,所有些亂還請(qǐng)見諒另外配色方案是在某個(gè)游戲截屏,然后用吸
前言
前段時(shí)間發(fā)現(xiàn)網(wǎng)上有很多收費(fèi)或公開課都有教用 js 做 2048 小游戲的,然后自己就也想動(dòng)手做一個(gè),做這個(gè)小游戲主要是為了鍛煉自己的邏輯能力,也算是對(duì)之前一些學(xué)習(xí)的總結(jié)吧
注:
實(shí)現(xiàn)方法完全是自己邊玩 2048 邊想的,所有些亂還請(qǐng)見諒
另外配色方案是在某個(gè) 2048 游戲截屏,然后用 ps 吸取的,非本人原創(chuàng)
代碼中有很多都可以使用數(shù)組相關(guān)的方法來(lái)代替,這里是為了自己理解數(shù)組方法是什么原理
由于時(shí)間關(guān)系本次不做詳解
游戲邏輯隨機(jī)位置生成數(shù)字 2 或 4
按方向鍵,有挨著的相同的數(shù)字就合并成新的數(shù)字
按方向鍵,數(shù)字會(huì)移動(dòng)到對(duì)應(yīng)方向的最邊上(按左,數(shù)字全部移動(dòng)到左邊)
每次按方向鍵,合并完成后,會(huì)在沒有數(shù)字的隨機(jī)位置都會(huì)生成新的數(shù)字 2 或 4
當(dāng)前分?jǐn)?shù)等于當(dāng)前所有數(shù)字相加
當(dāng)有數(shù)字達(dá)到 2048 游戲結(jié)束
項(xiàng)目相關(guān)這個(gè)版本是用原生 ES6 寫的,只實(shí)現(xiàn)了游戲邏輯中的 1,2,3,4;
第一版地址:https://github.com/yhtx1997/S...
之后是打算用 vue 重新寫一遍,并且完善下,因?yàn)殚L(zhǎng)時(shí)間用原生,導(dǎo)致 vue 有些生疏,借此機(jī)會(huì)重新溫習(xí)下
項(xiàng)目代碼 采用二維數(shù)組進(jìn)行數(shù)據(jù)的管理,默認(rèn)全部為零let arr = [ [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0] ];隨機(jī)創(chuàng)建數(shù)字
let s = 0; let create = () => { let x = Math.floor(Math.random() * 4); let y = Math.floor(Math.random() * 4); // console.log(s) if (s > 100) { s = 0; return; } if (arr[x][y] == 0) { if (Math.floor(Math.random() * 10) % 2 == 0) { arr[x][y] = 2; } else { arr[x][y] = 4; } s = 0; return; } else { s++; return create(); } }渲染頁(yè)面
let updateHtml = () => { //獲取元素 let warp = document.getElementById("warp"); let html = ""; //將數(shù)據(jù)轉(zhuǎn)換為 HTML for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr[i].length; j++) { html += `事件監(jiān)聽${arr[i][j]==0?"":arr[i][j]}`; } } //將 數(shù)據(jù)轉(zhuǎn)換的 HTML 渲染到頁(yè)面 warp.innerHTML = html; }
window.onkeydown = (e) => { switch (e.keyCode) { case 37: // ← console.log("←"); arr = new move(arr).moveLeft(); create(); //隨機(jī)位置新建 updateHtml(); //更新數(shù)據(jù)到頁(yè)面 break; case 38: // ↑ console.log("↑"); arr = new move(arr).moveUp(); create(); //隨機(jī)位置新建 updateHtml(); //更新數(shù)據(jù)到頁(yè)面 break; case 39: // → console.log("→"); arr = new move(arr).moveRight(); create(); //隨機(jī)位置新建 updateHtml(); //更新數(shù)據(jù)到頁(yè)面 break; case 40: // ↓ console.log("↓"); arr = new move(arr).moveDown(); create(); //隨機(jī)位置新建 updateHtml(); //更新數(shù)據(jù)到頁(yè)面 break; } }具體處理函數(shù) 先提取非零數(shù)字
export default function ClearZero (arr){//去零 let clearZero = [[],[],[],[]]; for (let i = 0; i < 4; i++) { for (let j = 0; j < 4; j++) { if (arr[i][j] != 0) { clearZero[i].push(arr[i][j]) } } } return clearZero; }將挨著的相等數(shù)字分組并相加
分組
import Deduplication from "./deduplication";//將相鄰且相同的數(shù)字相加 export default class Grouping{//將相鄰的相同數(shù)字分組 constructor(clearZero){ this.clearZero = clearZero; } left(){ let newarr = [[],[],[],[]]; for (let j = 0; j < this.clearZero.length; j++) { let grouping = []; let i = 0; //將重復(fù)的 分到一組 while (i < this.clearZero[j].length) { if (this.clearZero[j][i] == this.clearZero[j][i + 1]) { grouping.push([this.clearZero[j][i], this.clearZero[j][i + 1]]); i += 2; } else { grouping.push(this.clearZero[j][i]); i++; } } //去重復(fù) newarr[j] = Deduplication(grouping); } return newarr; } right(){ let newarr = [[],[],[],[]]; for (let i = 0; i < this.clearZero.length; i++) { let grouping = []; let j = this.clearZero[i].length - 1; //將重復(fù)的 分到一組 while (j >= 0) { if (this.clearZero[i][j] == this.clearZero[i][j - 1]) { grouping.unshift([this.clearZero[i][j], this.clearZero[i][j - 1]]); j -= 2; } else { grouping.unshift(this.clearZero[i][j]); j--; } } //將重復(fù)的進(jìn)行計(jì)算 newarr[i] = Deduplication(grouping); } return newarr; } }
相加
export default function Deduplication (grouping){//將相鄰且相同的數(shù)字相加 for (let i = 0; i < grouping.length; i++) { if (typeof grouping[i] == "object") { grouping[i] = grouping[i][0] + grouping[i][1]; } } return grouping; }添加占位用的零
export default function AddZero (newarr,w){//加零 for (let i = 0; i < newarr.length; i++) { while (newarr[i].length != 4) { if(w == "l"){ newarr[i].push(0); }else if(w == "r"){ newarr[i].unshift(0); } } } return newarr; }上下的處理
將 Y 軸的處理轉(zhuǎn)換成 X 軸的處理
export default function turn(arr) {//將數(shù)組轉(zhuǎn)一下 let clearZero = [[],[],[],[]]; for (let i = 0; i < 4; i++) { for (let j = 0; j < 4; j++) { clearZero[i][j] = arr[j][i] } } return clearZero; }
等處理完成后再調(diào)用上邊的函數(shù),將 X 軸的處理結(jié)果轉(zhuǎn)換回 Y 軸的表現(xiàn)方式
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/101085.html
前言 這次使用了 vue 來(lái)編寫 2048,主要目的是溫習(xí)一下 vue。 但是好像沒有用到太多 vue 的東西,==! 估計(jì)可能習(xí)慣了不用框架吧 之前由于時(shí)間關(guān)系沒有對(duì)實(shí)現(xiàn)過(guò)程詳細(xì)講解,本次會(huì)詳細(xì)講解下比較繞的函數(shù) 由于篇幅問(wèn)題簡(jiǎn)單的函數(shù)就不做詳解了 代碼地址: https://github.com/yhtx1997/S... 實(shí)現(xiàn)功能 數(shù)字合并 當(dāng)前總分計(jì)算 沒有可移動(dòng)的數(shù)字時(shí)不進(jìn)行任何...
摘要:往期回顧在上一期的前端特效里,我們已經(jīng)把果汁混合的效果里面的圓形菜單做好了,如果你錯(cuò)過(guò)了上篇文章今天我們要討論的是杯子里面的液體生成問(wèn)題先來(lái)回顧下咱們的果汁混合效果吧果汁混合效果,掃描下方二維碼就看到啦我們接著上期的內(nèi)容來(lái)繼續(xù)往下講吧,本期 往期回顧 在上一期的【前端特效】?里,我們已經(jīng)把果汁混合的效果里面的圓形菜單做好了,如果你錯(cuò)過(guò)了上篇文章今天我們要討論的是杯子里面的液體生成問(wèn)題 ...
摘要:拿足球比賽的例子來(lái)說(shuō),我們的目標(biāo)只是進(jìn)球,下底傳中這種模式僅僅是達(dá)到進(jìn)球目標(biāo)的一種手段。但在這種動(dòng)態(tài)解釋型語(yǔ)言中,給對(duì)象動(dòng)態(tài)添加職責(zé)是再簡(jiǎn)單不過(guò)的事情。這就造成了語(yǔ)言的裝飾者模式不再關(guān)注于給對(duì)象動(dòng)態(tài)添加職責(zé),而是關(guān)注于給函數(shù)動(dòng)態(tài)添加職責(zé)。 非商業(yè)轉(zhuǎn)載請(qǐng)注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/199456 曾探...
摘要:微信應(yīng)用號(hào)小程序資源匯總。每天不定期整理和收集微信小程序相關(guān)資源,方便查閱和學(xué)習(xí),歡迎大家提交新的資源,完善和補(bǔ)充。 wechat-weapp-resource 微信應(yīng)用號(hào)(小程序)資源匯總。 每天不定期整理和收集微信小程序相關(guān)資源,方便查閱和學(xué)習(xí),歡迎大家提交新的資源,完善和補(bǔ)充。 showImg(https://segmentfault.com/img/remote/1460000...
閱讀 2765·2023-04-25 14:15
閱讀 2708·2021-11-04 16:11
閱讀 3399·2021-10-14 09:42
閱讀 448·2019-08-30 15:52
閱讀 2830·2019-08-30 14:03
閱讀 3550·2019-08-30 13:00
閱讀 2117·2019-08-26 11:40
閱讀 3312·2019-08-26 10:25