這段時間看了視頻,用JavaScript實現2048小遊戲,都是一些基本語法和簡單邏輯javascript
下面分享一下整個2048遊戲代碼css
2048.htmlhtml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="2048.css">
</head>
<body>
<p>SCORE:<span id="score">0</span></p>
<div id="gridPanel">
<div id="c00" class="cell"></div>
<div id="c01" class="cell"></div>
<div id="c02" class="cell"></div>
<div id="c03" class="cell"></div>
<div id="c10" class="cell"></div>
<div id="c11" class="cell"></div>
<div id="c12" class="cell"></div>
<div id="c13" class="cell"></div>
<div id="c20" class="cell"></div>
<div id="c21" class="cell"></div>
<div id="c22" class="cell"></div>
<div id="c23" class="cell"></div>
<div id="c30" class="cell"></div>
<div id="c31" class="cell"></div>
<div id="c32" class="cell"></div>
<div id="c33" class="cell"></div>
</div>
<div id="gameOver">
<p>
GAME OVER!<br>
SCORE:<span id="final">0</span><br>
<a class="btn" href="javascript:game.start();">TRY AGAIN!</a>
</p>
</div>
<script src="2048.js"></script>
</body>
</html>
2048.css
#gridPanel{
width: 480px;
height: 480px;
margin: 0 auto;
position: relative;
background: #bbada0;
border-radius: 10px;
}
.cell{
width: 100px;
height: 100px;
border-radius: 6px;
background:#ccc0b3;
position: absolute;
font-size: 60px;
text-align: center;
color: #fff;
line-height: 100px;
}
[id^="c0"]{top:16px}
[id^="c1"]{top:132px}
[id^="c2"]{top:248px}
[id^="c3"]{top:364px}
[id$="0"]{left:16px}
[id$="1"]{left:132px}
[id$="2"]{left:248px}
[id$="3"]{left:364px}
.n2{background-color:#eee3da}
.n4{background-color:#ede0c8}
.n8{background-color:#f2b179}
.n16{background-color:#f59563}
.n32{background-color:#f67c5f}
.n64{background-color:#f65e3b}
.n128{background-color:#edcf72}
.n256{background-color:#edcc61}
.n512{background-color:#9c0}
.n1024{background-color:#33b5e5}
.n2048{background-color:#09c}
.n4096{background-color:#a6c}
.n8192{background-color:#93c}
.n2,.n4{color:#776e65}
.n1024,.n2048,.n4096,.n8192{font-size:40px}
p{
width: 480px;margin: 0 auto;
font-size: 40px; font-family: Arial;
font-weight: bold;
padding-top: 15px;
}
#gameOver{
display: none;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(55,55,55,.5);
}
#gameOver>p{
width: 300px;
height: 200px;
background: #FFFFFF;
position: absolute;
top: 50%;
left: 50%;
margin-top:-100px;
margin-left: -150px;
text-align: center;
line-height: 1.5em;
border-radius: 10px;
border:1px solid #edcf72;
}
#gameOver .btn{
padding: 10px;
color: #FFFFFF;
background: #9f8d77;
border-radius: 6px;
text-decoration: none;
}
2048.js
var game = { data: null, RN: 4, CN: 4,//保存遊戲二維數組,總行數,總列數 score: 0,//保存得分 state: 1,//保存遊戲狀態:1表示運行,0表示結束 RUNNING: 1,//專門表示運行狀態 GAMEOVER: 0,//專門表示遊戲結束狀態 //每一個屬性和方法之間必須用逗號隔開! //對象本身的方法要使用本身的屬性,必須this. start() {//啓動遊戲 this.state = this.RUNNING;//重置遊戲狀態爲運行中 this.score = 0;//分數清0 this.data = [];//新建空數組保存在data中 //r從0開始,到<RN結束 for (var r = 0; r < this.RN; r++) { //新建空數組保存到data中r行 this.data[r] = []; //c從0開始,到<CN結束 for (var c = 0; c < this.CN; c++) { //設置data中r行c列的值爲0 this.data[r][c] = 0; } }//(遍歷結束) this.randomNum(); this.randomNum(); this.updateView(); //事件:內容/設備狀態的改變 //事件處理函數:在事件發生時自動執行的操做 document.onkeydown = function (e) { //this->.前的document->game if (this.state == this.RUNNING) switch (e.keyCode) { case 37://左移 this.moveLeft(); break; case 38: //上移 this.moveUp(); break; case 39: //右移 this.moveRight(); break; case 40: //下移 this.moveDown(); break; } }.bind(this); }, move(callback) {//全部移動中相同的代碼 //爲data拍照,保存在before中 var before = String(this.data); callback.call(this); //爲data拍照,保存在after中 var after = String(this.data); if (before != after) {//若是發生了移動 this.randomNum();//隨機生成數 if (this.isGameOver())//若是遊戲結束 { this.state = this.GAMEOVER; }//修改遊戲狀態 this.updateView();//更新頁面 } }, moveLeft() { this.move(function () { //r從0開始,到<RN結束 for (var r = 0; r < this.RN; r++) { this.moveLeftInRow(r);//左移第r行 } }); }, isGameOver() {//判斷遊戲是否結束 //遍歷data for (var r = 0; r < this.RN; r++) { for (var c = 0; c < this.CN; c++) { //若是當前元素是0,返回false if (this.data[r][c] == 0) return false; //不然,若是c<CN-1且當前元素等於右側元素 else if (c < this.CN - 1 && (this.data[r][c] == this.data[r][c + 1])) { return false;//返回false } //不然,若是r<RN-1且當前元素等於下方元素 else if (r < this.RN - 1 && (this.data[r][c] == this.data[r + 1][c])) { return false;//返回false } } }//(遍歷結束) return true;//返回true }, moveLeftInRow(r) {//左移第r行 //c從0開始,到<CN-1結束,遍歷r行中每一個格 for (var c = 0; c < this.CN - 1; c++) { //找r行c列右側下一個不爲0的位置nextc var nextc = this.getNextInRow(r, c); //若是沒找到,就退出循環 if (nextc == -1) break; else {//不然 //若是c列的值是0 if (this.data[r][c] == 0) { //將nextc列的值賦值給c列 this.data[r][c] = this.data[r][nextc]; //將nextc列的值置爲0 this.data[r][nextc] = 0; c--;//c留在原地 } else if (this.data[r][c] == this.data[r][nextc]) { //不然 若是c列的值等於nextc列的值 //將c列的值*2 this.data[r][c] *= 2; this.score += this.data[r][c]; //將nextc列置爲0 this.data[r][nextc] = 0; } } } }, getNextInRow(r, c) {//找r行c列右側下一個不爲0的位置 //i從c+1開始,到<CN結束 for (var i = c + 1; i < this.CN; i++) { //若是i位置不是0,返回i if (this.data[r][i] != 0) return i; }//(遍歷結束) return -1; //返回-1 }, moveRight() { this.move(function () { //遍歷data中每一行 for (var r = 0; r < this.RN; r++) { this.moveRightInRow(r)//右移第r行 } }); }, moveRightInRow(r) {//右移第r行 //c從CN-1開始,到>0結束,反向遍歷r行中每一個格 for (var c = this.CN - 1; c > 0; c--) { //找r行c列左側前一個不爲0的位置prevc var prevc = this.getPrevInRow(r, c); //若是prevc爲-1,就退出循環 if (prevc == -1) { break; } else {//不然 //若是c列的值是0 if (this.data[r][c] == 0) { //將prevc列的值賦值給c列 this.data[r][c] = this.data[r][prevc]; //將prevc列的值置爲0 this.data[r][prevc] = 0; c++;//c留在原地 } else if (this.data[r][c] == this.data[r][prevc]) { //不然 若是c列的值等於prevc列的值 //將c列的值*2 this.data[r][c] *= 2; this.score += this.data[r][c]; //將prevc列置爲0 this.data[r][prevc] = 0; } } } }, getPrevInRow(r, c) {//查找r行c列左側前一個不爲0的位置 //i從c-1開始,到>=0結束,每次-1 for (var i = c - 1; i >= 0; i--) { //若是data中r行i列的值不爲0,就返回i if (this.data[r][i] != 0) return i; }//循環結束 //返回-1 return -1; }, moveUp() { this.move(function () { //遍歷data中每一列 for (var c = 0; c < this.CN; c++) { //調用moveUpInCol上移第c列 this.moveUpInCol(c); } }); }, moveUpInCol(c) { //r從0開始,到r<RN-1結束,r每次遞增1 for (var r = 0; r < this.RN - 1; r++) { //查找r行c列下方下一個不爲0的位置nextr var nextr = this.getNextInCol(r, c); //若是沒找到,就退出循環 if (nextr == -1) break; else//不然 //若是r位置c列的值爲0 if (this.data[r][c] == 0) { //將nextr位置c列的值賦值給r位置 this.data[r][c] = this.data[nextr][c]; //將nextr位置c列置爲0 this.data[nextr][c] = 0; r--;//r留在原地 } else if (this.data[r][c] == this.data[nextr][c]) {//不然,若是r位置c列的值等於nextr位置的值 //將r位置c列的值*2 this.data[r][c] *= 2; this.score += this.data[r][c]; //將nextr位置c列的值置爲0 this.data[nextr][c] = 0; } } }, getNextInCol(r, c) { //循環,到<RN結束,r每次遞增1 for (var i = r + 1; i < this.RN; i++) { //若是r位置c列不等於0, 就返回r if (this.data[i][c] != 0) return i; } //(遍歷結束) return -1;//返回-1 }, moveDown() { this.move(function () { //遍歷data中每一列 for (var c = 0; c < this.CN; c++) { //調用moveDownInCol下移第c列 this.moveDownInCol(c); } }); }, moveDownInCol(c) { //r從RN-1開始,到r>0結束,r每次遞減1 for (var r = this.RN - 1; r > 0; r--) { //查找r位置c列上方前一個不爲0的位置prevr var prevr = this.getPrevInCol(r, c); //若是沒找到,就退出循環 if (prevr == -1) break; else {//不然 //若是r位置c列的值爲0 if (this.data[r][c] == 0) { //將prevr位置c列的值賦值給r位置 this.data[r][c] = this.data[prevr][c]; //將prevr位置c列置爲0 this.data[prevr][c] = 0; r++;//r留在原地 } else if (this.data[r][c] == this.data[prevr][c]) {//不然,若是r位置c列的值等於prevr位置的值 //將r位置c列的值*2 this.data[r][c] *= 2; this.score += this.data[r][c]; //將prevr位置c列置爲0 this.data[prevr][c] = 0; } } } }, getPrevInCol(r, c) { //循環,r到>=0結束,每次遞減1 for (var i = r - 1; i >= 0; i--) { //若是r位置c列不等於0, 就返回r if (this.data[i][c] != 0) return i; }//(遍歷結束) return -1; //返回-1 }, updateView() {//將data中的數據更新到每一個div中 //遍歷二維數組 for (var r = 0; r < this.RN; r++) { for (var c = 0; c < this.CN; c++) { var n = this.data[r][c]; //找到id爲crc的div var div = document.getElementById("c" + r + c); if (n != 0) {//若是n不是0 div.innerHTML = n;//設置div的內容爲n //設置div的class爲cell n+n div.className = "cell n" + n; } else { div.innerHTML = "";//清楚div的內容 //恢復div的class爲cell div.className = "cell"; } } } //找到id爲score的span,設置其內容爲score屬性 document.getElementById("score") .innerHTML = this.score; //找到id爲gameOver的div var div = document.getElementById("gameOver"); //若是遊戲狀態爲GAMEOVER就設置div顯示 if (this.state == this.GAMEOVER) { div.style.display = "block"; //找到id爲final的span,設置其內容爲score document.getElementById("final") .innerHTML = this.score; } else {//不然就設置div隱藏 div.style.display = "none"; } }, randomNum() {//在一個隨機位置生成2或4 while (true) {//反覆: //在0~RN-1之間生成隨機數r var r = Math.floor(Math.random() * this.RN); //在0~CN-1之間生成隨機數c var c = Math.floor(Math.random() * this.CN); //若是data中r行c列的值爲0 if (this.data[r][c] == 0) { //將data中r行c列賦值爲: //隨機生成一個小數,若是<0.5,就取2,不然取4 this.data[r][c] = Math.random() < 0.5 ? 2 : 4; break; //退出循環 } } },}game.start();在功能上向左,向右,向上,向下基本一致