首页 > 代码库 > 网页版《2048游戏》教程 - 游戏优化

网页版《2048游戏》教程 - 游戏优化

1.     GameOver部分
下面我们来分析游戏是如何结束的。一种情况是棋盘格中没有空的格子了,一种情况是棋盘格中没有可以移动的格子了。
首先,完成isgameover()方法的逻辑。

function isgameover() {
if (nospace(board) && nomove(board)) {
        gameover();
    }
}

其次,完成棋盘格中没有空的格子。

function nospace(board) {
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 4; j++) {
if (board[i][j] == 0) {
return false;
            }
        }
    }
return true;
}

再次,完成棋盘格中没有可以移动的格子。

function nomove(board) {
if (canMoveDown(board) ||
canMoveLeft(board) ||
canMoveRight(board) ||
canMoveUp(board)) {
return false;
    }
return true;
}

最后,完成游戏结束的逻辑。

function gameover() {
    alert("gameover!" );
}

2.     加入Score
下面,我们增加游戏分数。首先,我们需要在main.js文件定义board变量后,定义score变量来表示游戏分数。
在移动数字格时,如果两个数字格的值相等的话,我们就需要更新游戏分数(游戏分数为两个数字格的数字值相加)。我们以向左移动为例,下面的代码就是增加对应的游戏分数:

//add score
score += board[i][k];
updateScore(score);

在完成移动逻辑代码时,我们使用了updateScore()方法来实现游戏分数值的更新动画逻辑,此方法我们同样定义在animation.js文件中。

function updateScore(score) {
    $("#score" ).text(score);
}

5.3.     让游戏和原版一致
到此,我们的《2048》游戏中,还有一个bug。就是当一行的4个格子的值为2、2、4、8的时候,如果向左移动,原版游戏的结果为4、4、8,而我们现在的游戏为16。导致这个问题的原因是2和2合并后为4,4又和第三个格子中的4进行合并为8,8再和第四个格子里的8进行合并。而原版游戏中,只能合并一次。所以,我们还需要加以控制。
首先,我们在main.js文件中,同样定义一个二维数组hasConflicted。

var hasConflicted = new Array();

其次,我们在init()方法中,将hasConflicted数组定义为二维数组,并初始化为false。

function init() {
for (var i = 0; i < 4; i++) {
        board[i] = new Array();
        hasConflicted[i] = new Array();
for (var j = 0; j < 4; j++) {
            board[i][j] = 0;
            hasConflicted[i][j] = false;
        }
    }
}

其三,我们需要在初始化数字格updateBoardView()方法中,将每一个数字格的hasConflicted的值设置为false。

function updateBoardView() {
    $(".number-cell" ).remove();
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 4; j++) {
            $("#grid-container").append( "<div class='number-cell' id='number-cell-" + i + "-" + j + "'></div>");
var numberCell = $( "#number-cell-" + i + "-" + j);
if (board[i][j] == 0) {
            } else {
            }
            hasConflicted[i][j] = false;
        }
    }
}

其四,当我们真正移动数字格,如果两个数字格的值相等时,我们需要增加当前格子是否合并后的判断。

else if (board[i][k] == board[i][j] && noBlokHorizontalCol(i, k, j, board)&&!hasConflicted[i][k])

如果当前两个数字格合并之后,需要将hasConflicted值设置为true,表示当前这个数字格不能再合并。

else if (board[i][k] == board[i][j] && noBlokHorizontalCol(i, k, j, board)&&!hasConflicted[i][k]) {
//move
showMoveAnimation(i, j, i, k);
//add
board[i][k] += board[i][j];
board[i][j] = 0;
//add score
score += board[i][k];
updateScore(score);
hasConflicted[i][k] = true;
continue ;
}

5.4.     优化GameOver
之前的GameOver,我们只是弹出提示框。效果上并不很好。现在,我们来优化一下GameOver部分,让游戏结束变得更漂亮一些。
首先,我们来修改一下gameover()方法。

function gameover() {
    $("#grid-container").append( "<div id='gameover' class='gameover'><p>本次得分 </p><span>"+score+"</span><a href='javascript:restartgame();' id='restartgamebutton'>Restart</a></div>");
var gameover = $( "#gameover");
    gameover.css("width", "500px");
    gameover.css("height", "500px");
    gameover.css("background-color", "rgba(0, 0, 0, 0.5)");
}

然后,我们来设置一下游戏结束提示的样式。

.gameover{
display: block ;
margin: 0 auto;
width: 500px ;
text-align: center ;
vertical-align: middle ;
position: absolute ;
}
.gameover p {
font-family: Arial ;
font-size: 50px ;
color: white ;
margin: 20px auto;
margin-top: 150px ;
}
.gameover span {
font-family: Arial ;
font-size: 50px ;
color: white ;
margin: 20px auto;
}
#restartgamebutton {
display: block ;
margin: 20px auto;
width: 180px ;
padding: 10px 10px;
background-color: #8f7a66 ;
font-family: Arial ;
font-size: 30px ;
color: white ;
border-radius: 10px ;
text-decoration: none ;
}
#restartgamebutton:hover {
background-color: #9f8b77 ;
}

其次,我们来完成restartgame()方法的逻辑。

function restartgame(){
    $("#gameover").remove();
    updateScore(0);
    newgame();
}