首页 > 代码库 > 网页版《2048游戏》教程 - 完成游戏逻辑

网页版《2048游戏》教程 - 完成游戏逻辑

1.     捕获键盘事件
《2048》游戏的操作主要是依靠键盘的上、下、左、右来完成,首先我们需要在game.js文件中捕获键盘响应的事件。

$(document).keydown(function (event) {
switch (event.keyCode) {
case 37://left
break;
case 38://up
break;
case 39://right
break;
case 40://down
break;
default :
break;
    }
});

键盘事件捕获到后,我们需要完成具体的游戏逻辑。首先,我们以向左移动为例,分析一下向左的事情逻辑内容。
首先,我们需要判断是否可以向左移动,这里我们使用if判断语句完成。

$(document).keydown(function (event) {
switch (event.keyCode) {
case 37://left
if (moveLeft()) {}
break;
case 38://up
break;
case 39://right
break;
case 40://down
break;
default :
break;
    }
});

如果可以的话,我们需要做两件事情:一件是生成两个新的随机数字,这个逻辑我们使用之前编写的generateOneNumber()方法完成;一件是判断当移动之后游戏是否结束,这个逻辑我们编写isgameover()方法完成。

$(document).keydown(function (event) {
switch (event.keyCode) {
case 37://left
if (moveLeft()) {
               generateOneNumber();
               isgameover();
            }
break;
case 38://up
break;
case 39://right
break;
case 40://down
break;
default :
break;
    }
});

2.     完成移动逻辑
下面我们以向左移动为例,来讲解具体的移动逻辑内容,完成moveLeft()方法逻辑。首先,我们需要判断是否可以向左移动,我们使用canMoveLeft()方法来完成。

function moveLeft() {
if (!canMoveLeft(board)) {
return false;
    }
return true;
}

如果可以向左移动的话,第一步,遍历数字格,判断除第一列外有哪些数字格的值是不为0的。

function moveLeft() {
if (!canMoveLeft(board)) {
return false;
    }
//moveLeft
for (var i = 0; i < 4; i++) {
for (var j = 1; j < 4; j++) {
if (board[i][j] != 0) {
            }
        }
    }
return true;
}

第二步,遍历当前值不为0的数字格左边数字格。

function moveLeft() {
if (!canMoveLeft(board)) {
return false;
    }
//moveLeft
for (var i = 0; i < 4; i++) {
for (var j = 1; j < 4; j++) {
if (board[i][j] != 0) {
for ( var k = 0; k < j; k++) {
                }
            }
        }
    }
return true;
}

第三步,向左移动逻辑还要分成两种情况,一种是当前值不为0的数字格左边的数字格必须值为0并且中间的数字格必须值也为0,一种是当前值不为0的数字格与左边的数字格值相等并且中间的数字格必须值也为0。

//判断当前值不为 0的数字格左边的数字格必须值为 0并且中间的数字格必须值也为 0
if (board[i][k] == 0 && noBlokHorizontalCol(i, k, j, board)) {
continue;
}
//判断当前值不为 0的数字格与左边的数字格值相等并且中间的数字格必须值也为 0
else if (board[i][k] == board[i][j] && noBlokHorizontalCol(i, k, j, board)) {
continue;
}

如果是当前值不为0的数字格左边的数字格必须值为0并且中间的数字格必须值也为0,具体逻辑如下:

//move
showMoveAnimation(i, j, i, k);
board[i][k] = board[i][j];
board[i][j] = 0;

如果是当前值不为0的数字格与左边的数字格值相等并且中间的数字格必须值也为0,具体逻辑如下:

//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);

当完成向左移动逻辑之后,我们需要重新初始化数字格布局。

updateBoardView();

3.     游戏基础逻辑
在完成移动逻辑代码时,我们使用了canMoveLeft()方法来判断是否可以向左移动。我们将此方法定义在suppot.js文件中。

function canMoveLeft(board) {
for (var i = 0; i < 4; i++) {
for (var j = 1; j < 4; j++) {
if (board[i][j] != 0) {
if (board[i][j - 1] == 0 || board[i][j - 1] == board[i][j]) {return true; }
            }
        }
    }
return false;
}

在完成移动逻辑代码时,我们使用了noBlokHorizontalCol()方法来判断当前数字格左边的数字格是否值为0。

function noBlokHorizontalCol(row, col1, col2, board) {
for (var i = col1 + 1; i < col2; i++) {
if (board[row][i] != 0) {
return false;
        }
    }
return true;
}

4.     游戏动画逻辑
在完成移动逻辑代码时,我们使用了showMoveAnimation()方法来实现数字格移动的动画逻辑,此方法我们定义在animation.js文件中。

function showMoveAnimation(fromx, fromy, tox, toy) {
var numberCell = $("#number-cell-" + fromx + "-" + fromy);
    numberCell.animate({
        top: getPosTop(tox, toy),
        left: getPosLeft(tox, toy)
    }, 200);
}