2048游戏实现 d2

格子/小格子的CSS设定

#grid-container{
    width: 460px;
    height: 460px;
    padding: 20px;
    
    margin: 50px auto;
    background-color: #bbada0;

    border-radius: 10px;
    position: relative;
}

grid-cell{
    width: 100px;
    height: 100px;
    border-radius: 6px;
    background-color: #ccc0b3;

    position: absolute;
}
number-cell {
    border-radius: 6px;
    font-family: Arial;
    font-weight: bold;
    font-size: 60px;
    line-height: 100px;
    position: absolute;
}

视图:在这里插入图片描述
主逻辑 main2048.js

function init(){
    for(var i = 0 ;i < 4;i++){
        for(var j = 0;j < 4;j++){
            var gridCell = $("#grid-cell-"+i+"-"+j);
            gridCell.css('top',getPosTop(i,j));
            gridCell.css('left',getPosLeft(i,j);
        }
    }
}

计算位置

function getPosTop(i, j) {
    return 20 + i * 120;
}

function getPosLeft(i, j) {
    return 20 + j * 120;
}


function getNumberBackgroundColor(number) {
    switch (number) {
        case 2:
            return '#eee4da';
            break;
        case 4:
            return '#ede0c8';
            break;
        case 8:
            return '#f2b179';
            break;
        case 16:
            return '#f59563';
            break;
        case 32:
            return '#f67c5f';
            break;
        case 64:
            return '#f65e3b';
            break;
        case 128:
            return '#edcf72';
            break;
        case 256:
            return '#edcc1';
            break;
        case 512:
            return '#9c0';
            break;
        case 1024:
            return '#33b5e5';
            break;
        case 2048:
            return '#09c';
            break;
        case 4096:
            return '#a6c';
            break;
        case 8192:
            return '#93c';
            break;
    }
}

function getNumberColor(number) {
    if (number <= 4)
        return '#776a6';
    return 'white';
}

给方块赋值,JS对单双引号没有区分。


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

updateBoardView();

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 theNumberCell = $('#number-cell-' + i + '-' + j);
        }
        if (board[i][
            [j]
        ] == 0) {
        theNumberCell.css('width', '0px');
        theNumberCell.css('height', '0px');
        theNumberCell.css('top', getPosTop(i, j) + 50);
        theNumberCell.css('left', getPosLeft(i, j) + 50);
    } else {
        theNumberCell.css('width', '100px');
        theNumberCell.css('height', '100px');
        theNumberCell.css('top', 'getPosTop(i,j)' + 50);
        theNumberCell.css('left', 'getPosLeft(i,j)' + 50);
        theNumberCell.css('background-color', getNumberBackgroundColor(board[i][j]));
        theNumberCell.css('color', getNumberColor(board[i][j]));
        theNumberCell.text(board[i][j]);

    }
}

生成随机数,判断是否为空

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

生成新数字,位置


function generateOneNumber() {
    if (nospace(board)) {
        return false;
    } else {
        return true;
    }

    var randx = parseInt(Math.floor(Math.random() * 4));
    var randx = parseInt(Math.floor(Math.random() * 4));

    while (true) {
        if (board[ranx][randy] == 0);
        break;
        randx = parseInt(Math.floor(Math.random() * 4));
        randx = parseInt(Math.floor(Math.random() * 4));
    }

    var randomNumber = Math.random() < 0.5 ? 2 : 4;

    board[randx][randy] = randomNumber;
    showNumberWithAnimation(randx, randy, randomNumber);

    return true;

}

展示动画:

function showNumberWithAnimation(i, j, randNumber) {

    var numberCell = $('#number-cell-' + i + "-" + j);

    numberCell.css('background-color', getNumberBackgroundColor(randNumber));
    numberCell.css('color', getNumberColor(randNumber));
    numberCell.text(randNumber);

    numberCell.animate({
        width: "100px",
        height: "100px",
        top: getPosTop(i, j),
        left: getPosLeft(i, j)
    }, 50);
}

使用Jquery判断玩家按键(基于玩家响应的游戏进程)


$(document).keydown(function(event) {
    switch (event.keyCode) {
        case 37:
            if (moveLeft()) {
                generateOneNumber();
                isgameover();
            }
            break;
        case 38:
            if (moveUp()) {
                generateOneNumber();
                isgameover();
            }
            break;
        case 39:
            if (moveRight()) {
                generateOneNumber();
                isgameover();
            }
            break;
        case 40:
            if (MoveDown()) {
                generateOneNumber();
                isgameover();
            }

        default:
            break;
    }
    break;
});
for (var i = 0; i < 4; i++)
        for (var j = 0; j < 4; j++) {
            if (board[i][j] != 0) {
                for (var k = 0; k < j; k++) {
                    if (board[i][k] == 0 && noBlockHorizontal(i, k, j, board)) {
                        board[i][k] = board[i][j];
                        board[i][j] = 0;
                        continue;
                    } else if (board[i][k] == board[i][j] && noBlockHorizontal(i, k, j, board)) {
                        //move
                        showMoveAnimation(i, j, i, k);
                        board[i][k] += board[i][j];
                        board[i][j] = 0;
                        continue;
                        //add

                    }
                }
            }
        }

    return true;
}

移动函数:

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;
}


在这里插入图片描述
进行一次判断是否是空block

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

更新一下动画:

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

最后的游戏结束:

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

function gameover() {
    alert('i love you');
}

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

Score部分

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值