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