Javascript-小游戏2048 超详细教学说明

Javascript-小游戏2048 超详细教学说明


前言

最近在学前端,趁热找几个小游戏练练手。
2048游戏规则不再过多描述,这里主要用到了html,css,JavaScript相关知识.
代码来源:https://blog.csdn.net/bs775926015/article/details/115447514


一、游戏页面布局

在这里插入图片描述
每一个方块就是一个div标签,由于div标签属于块级元素,其默认是垂直排列。想要达到中间的效果。这17个div标签需要有一个父类最为背景框,其余16个子元素在内部排序。这里使用了弹性布局,相比于浮动来说,更加快捷方便。而button属于行内块元素,通过让其转为块级元素实现以上排列。

补充:浮动布局主要用于解决多个块元素共存于一行的问题。虽然浮动可以解决多个块元素共存一行的问题,但是也会有不好的影响。如脱标

html主要代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="c2048.css">
</head>
<body>
    <div id="box">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>
    <button id="rebutton" onclick="restart()">重新开始 </button>
    <script src="j2048.js"></script> 
</body>
</html>

css代码如下:

    #box{
    
       
    width: 500px;
    height: 500px;
    background-color: #BBADA0;
    border-radius: 0.5em;
    margin: 50px auto;
    margin-bottom: 20px;
    display: flex;
    justify-content: space-evenly;
    flex-wrap: wrap;  
}
/* 后代选择器 */
#box div{
    
    
    width: 100px;
    height: 100px;
    background-color: #CDC1B4;
    border: 1px solid transparent;
    border-radius: 10px;
    margin-top: 10px;
    font-size: 50px;
    font-weight: bold;
    text-align: center;
    line-height: 100px;
}
#rebutton{
    
    
    width: 70px;
    height: 30px;
    background-color: hsl(64, 60%, 52%);
    display: block;
    border: 1px solid transparent;
    border-radius: 10px;
    margin: auto;
}

二、游戏实现

数字的显示和变换主要是利用了元素的innerHTML来实现获取对象内容 或 向对象插入内容的功能;
首先:创建 4*4 数组,用于存放16个子div元素,

var divs= document.querySelectorAll("#box>div");
var arr = [[],[],[],[]];
var num=0;
for(var i = 0;i <arr.length;i++){
    
    
    for(var j = 0;j <arr.length;j++){
    
    
        arr[i][j] = divs[num];
        num++;
    }
}

后续的操作主要就是对这个数组内的div元素进行修改

// 在4*4的随机位置产生数字2或4 ,出现比率是1:4
function rand(){
    
    
    var x=Math.floor(Math.random()*4);
    var y=Math.floor(Math.random()*4);
    if(arr[x][y].innerHTML == ""){
    
    
        arr[x][y].innerHTML = Math.random() > 0.2 ? 2 : 4;  
    }else{
    
    
        rand();
    }
}
//判断是否游戏结束函数:(1)、数组数组是否已满 (2)相邻元素是否相同
function end(){
    
    
    var bool=true;
    for(var i = 0;i <arr.length;i++){
    
    
        for(var j = 0;j <arr.length;j++){
    
    
            if(arr[i][j].innerHTML == "" ){
    
    
            bool = false;
            }
        }
    }
    if(bool){
    
    
       cheak();
    }else{
    
    
        rand();
    }
}
function cheak(){
    
    
    var bool = true;
    for(var i = 0;i < arr.length-1 ;i++){
    
    
        for(var j = 0;j< arr.length-1;j++){
    
    
            if(arr[i][j].innerHTML == arr[i][j+1].innerHTML || arr[i][j].innerHTML == arr[i+1][j].innerHTML || arr[i+1][j].innerHTML == arr[i+1][j+1].innerHTML || arr[i][j+1].innerHTML == arr[i+1][j+1].innerHTML  ){
    
    
                bool = false;
            }
        }
    }
    if(bool){
    
    
        alert("游戏结束!")
    }
}
//游戏重新开始的函数
function restart(){
    
    
    for(var i = 0;i <arr.length;i++){
    
    
        for(var j = 0;j <arr.length;j++){
    
    
            arr[i][j].innerHTML = ""; 
        }
    }
    bgcolor();
    rand();
    rand();
}
//设置背景颜色
function bgcolor(){
    
    
    for(var i = 0;i <arr.length;i++){
    
    
        for(var j = 0;j <arr.length;j++){
    
      
          switch(arr[i][j].innerHTML){
    
    
            case '2': arr[i][j].style.backgroundColor = "#EEE4DA" ;break;
            case '4': arr[i][j].style.backgroundColor = "#EDE0C8" ;break;
            case '8': arr[i][j].style.backgroundColor = "#F2B179" ;break;
            case '16': arr[i][j].style.backgroundColor = "#F59563" ;break;
            case '32': arr[i][j].style.backgroundColor = "#F67C5F" ;break;
            case '64': arr[i][j].style.backgroundColor = "#F65E3B" ;break;
            case '128': arr[i][j].style.backgroundColor = "#EDCF72" ;break;
            case '256': arr[i][j].style.backgroundColor = "#EDCC61" ;break;
            case '512': arr[i][j].style.backgroundColor = "#EDC850" ;break;
            case '1024': arr[i][j].style.backgroundColor = "yellowgreen" ;break;
            case '2048': arr[i][j].style.backgroundColor = "perple" ;break;
            default:  arr[i][j].style.backgroundColor = "#CDC1B4" ;break;     
          }
        }
    }
}


//上下左右按下执行的函数
         
function downright(){
    
    
    for(var i = 0;i <4;i++){
    
    
        for(var j = 0;j <4;j++){
    
    
            if( j<3&&arr[i][j].innerHTML !=""&& arr[i][j+1].innerHTML==""){
    
    
                arr[i][j+1].innerHTML = arr[i][j].innerHTML;
                arr[i][j].innerHTML="";
                downright();
            }else if(j<3&&arr[i][j].innerHTML !=""&& arr[i][j].innerHTML == arr[i][j+1].innerHTML){
    
    
                arr[i][j+1].innerHTML *=2;
                arr[i][j].innerHTML ="";
            } 
        
        }
    }
}

function downleft(){
    
    
    for(var i = 0;i <4;i++){
    
    
        for(var j = 0;j <4;j++){
    
    
            if( j>0&&arr[i][j].innerHTML !=""&& arr[i][j-1].innerHTML==""){
    
    
                arr[i][j-1].innerHTML = arr[i][j].innerHTML;
                arr[i][j].innerHTML="";
                downleft();
            }else if(j>0&&arr[i][j].innerHTML !=""&& arr[i][j].innerHTML == arr[i][j-1].innerHTML){
    
    
                arr[i][j-1].innerHTML *=2;
                arr[i][j].innerHTML ="";
            } 
        
        }
    }
}

function downfoot(){
    
    
    for(var i = 0;i <4;i++){
    
    
        for(var j = 0;j <4;j++){
    
    
            if( i<3&&arr[i][j].innerHTML !=""&& arr[i+1][j].innerHTML==""){
    
    
                arr[i+1][j].innerHTML = arr[i][j].innerHTML;
                arr[i][j].innerHTML="";
                downfoot();
            }else if(i<3&&arr[i][j].innerHTML !=""&& arr[i][j].innerHTML == arr[i+1][j].innerHTML){
    
    
                arr[i+1][j].innerHTML *=2;
                arr[i][j].innerHTML ="";
            } 
        
        }
    }
}

function downup(){
    
    
    for(var i = 0;i <4;i++){
    
    
        for(var j = 0;j <4;j++){
    
    
            if( i>0&&arr[i][j].innerHTML !=""&& arr[i-1][j].innerHTML==""){
    
    
                arr[i-1][j].innerHTML = arr[i][j].innerHTML;
                arr[i][j].innerHTML="";
                downup();
            }else if(i>0&&arr[i][j].innerHTML !=""&& arr[i][j].innerHTML == arr[i-1][j].innerHTML){
    
    
                arr[i-1][j].innerHTML *=2;
                arr[i][j].innerHTML ="";
            } 
        
        }
    }
}

游戏开始流程:

//游戏开始产生2个随机数
rand();
rand();
bgcolor();
//上下左右的监听事件
window.onkeydown = function(e){
    
     
    switch(e.keyCode){
    
    
        case 37 :  end(); downleft();bgcolor();     break;//左
        case 38 :  end(); downup();bgcolor();     break;//上
        case 39 :  end(); downright();bgcolor();     break;//右
        case 40 :  end(); downfoot(); bgcolor();     break;//下
    } 
}

猜你喜欢

转载自blog.csdn.net/qq_41045128/article/details/125315532
今日推荐