JS的2048小游戏

本文分享了一个使用JavaScript实现的2048小游戏的代码,包括设置颜色、初始化地图、生成随机数字、计算分数、判断游戏结束和赢局条件以及上下左右移动和合并的函数。代码详细解释了每个功能的实现方法。
摘要由CSDN通过智能技术生成

最近写了一个2048的小游戏,分享一下给大家。
以下是js的代码,完整代码链接:https://github.com/2048

//定义数字2-4096共计12种背景颜色
let colors = new Array("#FFDE00", "#FFAB00", "#FF7800", "#FF2500", "#FF0048", '#F700FF', "#5900FF", "#0033FF",
	"#00A1FF", "#00FF6B", "#76FF00", "#EDFF00");

//设置游戏地图的根标签id
let root = "map";
//方块的初始颜色
let bgForInit = "#886C64";
//得分
let score = 0;

/**
 * 根据数值设置方块的颜色和内容
 *
 */
function setColor(){
    for (let i = 0; i < colors.length; i++) {
        colors[i] = {
            "color": colors[i],
            "value": Math.pow(2, i + 1)
        };
    }
    // console.log(colors);
}
// setColor()
/**
 * 设置方块的初始状态,即所有方块为空
 */
function setBlockState() {
    let maps = document.querySelectorAll(".map>div>div");
    for (let i = 0; i < 4; i++) {
        for (let j = 0; j < 4; j++) {
            maps[i * 4 + j].innerHTML = "";
            maps[i * 4 + j].style.backgroundColor = bgForInit;
            maps[i * 4 + j].setAttribute("state", 0);
        }
    }
}
// setBlockState()


/**
 * 地图中随机生成2或4,生成随机数求余,利用结果对应位置和数字
 */
function randomBlock() {
    let maps = document.querySelectorAll(".map>div>div");
    let random = Math.floor(Math.random() * 16);
    let random2 = Math.floor(Math.random() * 2);
    if (maps[random].innerHTML == "") {
        if (random2 == 0) {
            maps[random].innerHTML = 2;
            maps[random].style.backgroundColor = colors[0].color;
        }
        else {
            maps[random].innerHTML = 4;
            maps[random].style.backgroundColor = colors[1].color;
        }
    }
    else {
        randomBlock();
    }
}
// randomBlock()

/**
 * 计算分数,把所有方块的值相加,显示在分数标签中
 */
function countScore() {
    let maps = document.querySelectorAll(".map>div>div");
    for (let i = 0; i < maps.length; i++) {
        score += (Number)(maps[i].innerHTML);
    }
    document.querySelector(".realScore").innerHTML = score;
    // console.log(score)
}
// countScore();

/**
 * 游戏结束判断(无空闲方块且相邻无合并可能)
 */
function isGameOver() {
    let maps = document.querySelectorAll(".map>div>div");
    //这里的意思是判断每一个方块是否为空
    for (let i = 0; i < maps.length; i++) {
        if (maps[i].innerHTML == "") {
            return false;
        }
    }
    //这里的意思是判断每一行的每一个方块的右边和下面的方块是否相等
    for (let i = 0; i < maps.length; i++) {
        //i % 4 != 3的意思是判断最后一列的方块不用判断右边的方块
        if (i % 4 != 3) {
            //maps[i].innerHTML == maps[i + 1].innerHTML的意思是判断每一个方块的右边的方块是否相等
            if (maps[i].innerHTML == maps[i + 1].innerHTML) {
                return false;
            }
        }
        //i < 12的意思是判断最后一行的方块不用判断下面的方块
        if (i < 12) {
            //maps[i].innerHTML == maps[i + 4].innerHTML的意思是判断每一个方块的下面的方块是否相等
            if (maps[i].innerHTML == maps[i + 4].innerHTML) {
                return false;
            }
        }
    }
    return true;
}

/**
 * 上下左右四个方向的移动
 */
function moveUp() {
    let maps = document.querySelectorAll(".map>div>div");
    // console.log(maps)
    for (let i = 0; i < 4; i++) {
        for (let j = 0; j < 4; j++) {
            // console.log(maps[i * 4 + j].innerHTML)
            if (maps[i * 4 + j].innerHTML == "") {
                for (let k = i + 1; k < 4; k++) {
                    if (maps[k * 4 + j].innerHTML != "") {
                        maps[i * 4 + j].innerHTML = maps[k * 4 + j].innerHTML;
                        maps[i * 4 + j].style.backgroundColor = maps[k * 4 + j].style.backgroundColor;
                        maps[k * 4 + j].innerHTML = "";
                        maps[k * 4 + j].style.backgroundColor = bgForInit;
                        break;
                    }
                }
            }
        }
    }
}
// moveUp()
function moveDown() {
    let maps = document.querySelectorAll(".map>div>div");
    for (let i = 3; i >= 0; i--) {
        for (let j = 0; j < 4; j++) {
            if (maps[i * 4 + j].innerHTML == "") {
                for (let k = i - 1; k >= 0; k--) {
                    if (maps[k * 4 + j].innerHTML != "") {
                        maps[i * 4 + j].innerHTML = maps[k * 4 + j].innerHTML;
                        maps[i * 4 + j].style.backgroundColor = maps[k * 4 + j].style.backgroundColor;
                        maps[k * 4 + j].innerHTML = "";
                        maps[k * 4 + j].style.backgroundColor = bgForInit;
                        break;
                    }
                }
            }
        }
    }
}
// moveDown()
function moveLeft() {
    let maps = document.querySelectorAll(".map>div>div");
    for (let i = 0; i < 4; i++) {
        for (let j = 0; j < 4; j++) {
            if (maps[i * 4 + j].innerHTML == "") {
                for (let k = j + 1; k < 4; k++) {
                    if (maps[i * 4 + k].innerHTML != "") {
                        maps[i * 4 + j].innerHTML = maps[i * 4 + k].innerHTML;
                        maps[i * 4 + j].style.backgroundColor = maps[i * 4 + k].style.backgroundColor;
                        maps[i * 4 + k].innerHTML = "";
                        maps[i * 4 + k].style.backgroundColor = bgForInit;
                        break;
                    }
                }
            }
        }
    }
}
// moveLeft()
function moveRight() {
    let maps = document.querySelectorAll(".map>div>div");
    for (let i = 0; i < 4; i++) {
        for (let j = 3; j >= 0; j--) {
            if (maps[i * 4 + j].innerHTML == "") {
                for (let k = j - 1; k >= 0; k--) {
                    if (maps[i * 4 + k].innerHTML != "") {
                        maps[i * 4 + j].innerHTML = maps[i * 4 + k].innerHTML;
                        maps[i * 4 + j].style.backgroundColor = maps[i * 4 + k].style.backgroundColor;
                        maps[i * 4 + k].innerHTML = "";
                        maps[i * 4 + k].style.backgroundColor = bgForInit;
                        break;
                    }
                }
            }
        }
    }
}
// moveRight()

/**
 * 设置方块的背景颜色
 */
function setBgColor() {
    let maps = document.querySelectorAll(".map>div>div");
    for (let i = 0; i < maps.length; i++) {
        switch (maps[i].innerHTML) {
            case "":
                maps[i].style.backgroundColor = bgForInit;
                break;
            case "2":
                maps[i].style.backgroundColor = "#FFDE00";
                break;
            case "4":
                maps[i].style.backgroundColor = "#FFAB00";
                break;
            case "8":
                maps[i].style.backgroundColor = "#FF7800";
                break;
            case "16":
                maps[i].style.backgroundColor = "#FF2500";
                break;
            case "32":
                maps[i].style.backgroundColor = "#FF0048";
                break;
            case "64":
                maps[i].style.backgroundColor = "#F700FF";
                break;
            case "128":
                maps[i].style.backgroundColor = "#5900FF";
                break;
            case "256":
                maps[i].style.backgroundColor = "#0033FF";
                break;
            case "512":
                maps[i].style.backgroundColor = "#00A1FF";
                break;
            case "1024":
                maps[i].style.backgroundColor = "#33b5e5";
                break;
            case "2048":
                maps[i].style.backgroundColor = "#00FF6B";
                break;
            case "4096":
                maps[i].style.backgroundColor = "#76FF00";
                break;
        }
    }
}

/**
 * 上下左右四个方向的合并
 */
function mergeUp() {
    let maps = document.querySelectorAll(".map>div>div");
    for (let i = 0; i < 4; i++) {
        for (let j = 0; j < 4; j++) {
            if (maps[i * 4 + j].innerHTML != "") {
                for (let k = i + 1; k < 4; k++) {
                    if (maps[k * 4 + j].innerHTML != "") {
                        if (maps[i * 4 + j].innerHTML == maps[k * 4 + j].innerHTML) {
                            maps[i * 4 + j].innerHTML = parseInt(maps[i * 4 + j].innerHTML) * 2;
                            maps[k * 4 + j].innerHTML = "";
                            setBgColor();
                        }
                        break;
                    }
                }
            }
        }
    }
}
// mergeUp()
function mergeDown() {
    let maps = document.querySelectorAll(".map>div>div");
    for (let i = 3; i >= 0; i--) {
        for (let j = 0; j < 4; j++) {
            if (maps[i * 4 + j].innerHTML != "") {
                for (let k = i - 1; k >= 0; k--) {
                    if (maps[k * 4 + j].innerHTML != "") {
                        if (maps[i * 4 + j].innerHTML == maps[k * 4 + j].innerHTML) {
                            maps[i * 4 + j].innerHTML = parseInt(maps[i * 4 + j].innerHTML) * 2;
                            maps[k * 4 + j].innerHTML = "";
                            setBgColor();
                        }
                        break;
                    }
                }
            }
        }
    }
}
// mergeDown()
function mergeLeft() {
    let maps = document.querySelectorAll(".map>div>div");
    //遍历每一个格子
    for (let i = 0; i < 4; i++) {
        for (let j = 0; j < 4; j++) {
            //如果当前格子不为空
            if (maps[i * 4 + j].innerHTML != "") {
                //遍历当前格子右边的格子
                for (let k = j + 1; k < 4; k++) {
                    //如果右边的格子不为空
                    if (maps[i * 4 + k].innerHTML != "") {
                        //如果当前格子和右边的格子相等
                        if (maps[i * 4 + j].innerHTML == maps[i * 4 + k].innerHTML) {
                            //合并
                            maps[i * 4 + j].innerHTML = parseInt(maps[i * 4 + j].innerHTML) * 2;
                            maps[i * 4 + k].innerHTML = "";
                            setBgColor();
                        }
                        break;
                    }
                }
            }
        }
    }
}
// mergeLeft()
function mergeRight() {
    let maps = document.querySelectorAll(".map>div>div");
    //遍历每一个格子
    for (let i = 0; i < 4; i++) {
        for (let j = 3; j >= 0; j--) {
            //如果当前格子不为空
            if (maps[i * 4 + j].innerHTML != "") {
                //遍历当前格子左边的格子
                for (let k = j - 1; k >= 0; k--) {
                    //如果左边的格子不为空
                    if (maps[i * 4 + k].innerHTML != "") {
                        //如果当前格子和左边的格子的值相等
                        if (maps[i * 4 + j].innerHTML == maps[i * 4 + k].innerHTML) {
                            //将当前格子的值*2
                            maps[i * 4 + j].innerHTML = parseInt(maps[i * 4 + j].innerHTML) * 2;
                            //将左边的格子的值置为空
                            maps[i * 4 + k].innerHTML = "";
                            setBgColor();
                        }
                        break;
                    }
                }
            }
        }
    }
}
// mergeRight()


/**
 * 游戏初始化
 */
function init() {
    setBlockState();
    setColor();
    randomBlock();
    countScore();
}

/**
 * 赢得游戏
 */
function isWin() {
    let maps = document.querySelectorAll(".map>div>div");
    for (let i = 0; i < maps.length; i++) {
        if (maps[i].innerHTML == 2048) {
            return true;
        }
    }
    return false;
}


/**
 * 开始游戏(游戏初始化,关联移动事件
 */
let flag = true;
function GameBegin() {
    if(flag) {
        flag = false;
        document.querySelector(".beginButton").innerHTML = "重新开始";
        init();
        document.onkeydown = function (e) {
            switch (e.keyCode) {
                case 37:
                    moveLeft();
                    mergeLeft();
                    break;
                case 38:
                    moveUp();
                    mergeUp();
                    break;
                case 39:
                    moveRight();
                    mergeRight();
                    break;
                case 40:
                    moveDown();
                    mergeDown();
                    break;
            }
            randomBlock();
            countScore();
            if (isGameOver()) {
                alert("游戏结束");
                window.location.reload();
            }
            if (isWin()) {
                alert("恭喜你,你赢了");
                window.location.reload();
            }
        }
    }
    else{
        if (isGameOver()) {
            alert("游戏结束");
            window.location.reload();
        }
        if (isWin()) {
            alert("恭喜你,你赢了");
            window.location.reload();
        }
        else{
            confirm("游戏是否重新开始?");
            if (confirm)
            {
                window.location.reload();
            }
        }
    }
}

运行截图:
在这里插入图片描述
在这里插入图片描述

接受各位大佬的指教

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JavaScript2048小游戏的实现是通过使用JavaScript编写代码来创建一个2048游戏的网页应用程序。该游戏的核心逻辑是通过将相同数字的方块合并来达到2048的目标。在实现过程中,需要使用HTML和CSS来创建游戏的界面,并使用JavaScript来处理游戏的逻辑和交互。具体实现过程需要涉及到数组操作、事件监听、动画效果等技术。 ### 回答2: 2048游戏是一款数字类益智小游戏,玩法非常简单,就是将相同数字的方块进行合并直到得到数字2048。实现这个游戏可以使用几乎所有编程语言,因为其界面相对简单,逻辑也比较简单。其中,用JavaScript实现2048游戏也很简单。 JavaScript是一种弱类型的脚本语言,由于其在浏览器中实现,当前web应用程序和移动应用程序开发已经离不开JavaScript了。可以通过JavaScript DOM编程来容易地操纵HTML文档的内容,属性和样式,并且更加灵活自由地控制页面的交互和效果。 HTML5的canvas提供了非常方便的绘图功能,可以很容易地在web页面中绘制图形和游戏效果。我们可以使用canvas元素把游戏的界面绘制出来,并通过JavaScript代码来实现游戏的逻辑。我们可以通过监听键盘事件来控制方块的移动,并且配合进行相应的位置合并。 游戏中,我们需要有一个数据模型,来控制图形块的生成、移动和合并操作。因为游戏是一个可操作的实体,所以使用JavaScript中的面向对象编程,把游戏做成一个对象,可以更好地管理游戏的数据和状态。在游戏对象中,我们可以定义方法,包括渲染页面、绑定事件和状态更新等。 最后,我们可以把这个游戏发布在web服务器上,也可以打包成Hybrid App发布在各种移动应用商店中,玩家可以通过浏览器或者安装在手机中的游戏来体验这个有趣的小游戏。 ### 回答3: JavaScript2048是一款智力益智类小游戏,玩法简单,玩家需要将数字方块合并组成2048这个数字方块。下面将详细介绍JavaScript2048的实现过程。 1.界面设计:通过HTML和CSS来完成游戏的界面设计。使用div标签来创建游戏面板,使用CSS进行样式设置,添加游戏背景图案和数字方块样式。 2.生成随机数字:使用JavaScript随机生成2或4的数字方块,将其按照一定规则添加到游戏面板上。 3.移动合并数字方块:通过监听键盘事件,根据不同的按键进行数字方块的移动和合并。当数字方块移动时,需要判断当前位置是否为空,且左侧是否有相同数字,如果为空或是相邻数字相同,就将其合并。 4.判定游戏结束:当游戏中没有空位置,也没有可以合并的相邻数字时即判定游戏结束。 5.添加游戏功能:增加游戏分数统计,最高分数记录,撤销上一次操作等游戏功能。 总之,JavaScript2048小游戏的实现离不开HTML、CSS和JavaScript语言,需要对前端基础知识有一定的了解。要完成一个完整的游戏还需要思维逻辑和综合能力,需要不断尝试和优化,才能得到一个优秀的JavaScript2048小游戏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值