基于网页版的2048游戏

前段时间有个很火的游戏叫2048,刚好趁着暑假想练习前端,顺带就把它作为练习项目做成Web Applications

该游戏基于HTML5+JS+CSS

文件结构:

index.html  游戏界面展示

index.css  主界面的CSS样式,16方格采用绝对布局的方式

main.js   游戏的主要逻辑

show.js   游戏的一些动画效果

support.js  底层支撑

jquery.js

页面做了响应式布局,游戏效果如下:

  

代码如下:

index.hml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="viewport" content="width=device-width,height=device-height,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>New Game 2048</title>
<script type="text/javascript" src="jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="show.js"></script>
<script type="text/javascript" src="support.js"></script>
<script type="text/javascript" src="main.js"></script>
<link type="text/css" rel="stylesheet" href="index.css" />
</head>
<body>
    <header>
        <h1>2048</h1>
        <a href="javascript:newGame();" id="newGameButton">New Game</a>
        <p>Score:<span id="score">0</span></p>
    </header>

    <div id="grid-container">
        <div class="grid-cell" id="grid-cell-0-0"></div>
        <div class="grid-cell" id="grid-cell-0-1"></div>
        <div class="grid-cell" id="grid-cell-0-2"></div>
        <div class="grid-cell" id="grid-cell-0-3"></div>

        <div class="grid-cell" id="grid-cell-1-0"></div>
        <div class="grid-cell" id="grid-cell-1-1"></div>
        <div class="grid-cell" id="grid-cell-1-2"></div>
        <div class="grid-cell" id="grid-cell-1-3"></div>

        <div class="grid-cell" id="grid-cell-2-0"></div>
        <div class="grid-cell" id="grid-cell-2-1"></div>
        <div class="grid-cell" id="grid-cell-2-2"></div>
        <div class="grid-cell" id="grid-cell-2-3"></div>

        <div class="grid-cell" id="grid-cell-3-0"></div>
        <div class="grid-cell" id="grid-cell-3-1"></div>
        <div class="grid-cell" id="grid-cell-3-2"></div>
        <div class="grid-cell" id="grid-cell-3-3"></div>

    </div>

</body>
</html>

index.css

@charset "utf-8";
/* CSS Document */
header{
    display:block;
    margin:0 auto;
    width:100%;
    text-align:center;
}

header h1{
    font-family:Arial, Helvetica, sans-serif;
    font-size:40px;
    font-weight:bold;
}

header #newGameButton{
    display:block;
    margin:20px auto;
    padding:10px 10px;
    width:100px;
    background-color:#930;
    font-family:Arial, Helvetica, sans-serif;
    color:#FFF;
    border-radius:10px;
    text-decoration:none;
}

header #newGameButton:hover{
    background-color:#963;
}

header p{
    font-family:Arial, Helvetica, sans-serif;
    font-size:25px;
    margin:10px auto;
}

#grid-container{
    width:460px;
    height:460px;
    padding:20px;

    margin:10px auto;
    background-color:#930;
    border-radius:10px;
    position:relative;
}

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

    position:absolute;
}

.number-cell{
    font-family:Arial, Helvetica, sans-serif;
    border-radius:6px;
    font-size:60px;
    line-height:100px;
    font-weight:bold;
    text-align:center;
    position:absolute;
}
    

main.js

// JavaScript Document
var board=new Array();
var score=0;

sx=0;
sy=0;
ex=0;
ey=0;

$(document).ready(function(e) {
    newGame();
});

function newGame(){
        //初始化游戏
        forMobile();
        init();
        //随机生成2个数
        getOneNumber();
        getOneNumber();

    }

function init(){
    for(var i=0;i<4;i++){//遍历div
        for(var j=0;j<4;j++){
            var gridCell=$("#grid-cell-"+i+"-"+j);
            gridCell.css("top",getTop(i,j));
            gridCell.css("left",getLeft(i,j));
            }
        }
        //board一维转二维
        for(var i=0;i<4;i++){
            board[i]=new Array();
            for(var j=0;j<4;j++){
                board[i][j]=0;
                }
            }
        updateBoardView();
        score=0;
    }

function forMobile(){

     if( documentWidth > 500 ){
        gridContainerWidth = 500;
        cellSpace = 20;
        cellSideLength = 100;
    }

    $(‘#grid-container‘).css(‘width‘,gridContainerWidth - 2*cellSpace);
    $(‘#grid-container‘).css(‘height‘,gridContainerWidth - 2*cellSpace);
    $(‘#grid-container‘).css(‘padding‘, cellSpace);
    $(‘#grid-container‘).css(‘border-radius‘,0.02*gridContainerWidth);

    $(‘.grid-cell‘).css(‘width‘,cellSideLength);
    $(‘.grid-cell‘).css(‘height‘,cellSideLength);
    $(‘.grid-cell‘).css(‘border-radius‘,0.02*cellSideLength);
}

function getOneNumber(){//noSpace没空间返回true
        if(noSpace(board)){
            return false;
            }else{
                // 随机一个位置
                var x=parseInt(Math.floor(Math.random()*4));
                var y=parseInt(Math.floor(Math.random()*4));

                var flag=0;
                while(flag<40){
                    if(board[x][y]==0)break;
                    var x=parseInt(Math.floor(Math.random()*4));
                    var y=parseInt(Math.floor(Math.random()*4));
                    flag++;
                    }

                if(flag==40){
                    for(var i=0;i<4;i++){
                        for(var j=0;j<4;j++){
                            if(board[i][j]==0){
                                x=i;
                                y=j;
                                }
                            }
                        }
                    }

                //随机生成一个数(2or4)
                var number=Math.random()<0.5?2:4;

                //在随机的位置显示生成的随机数
                board[x][y]=number;
                showNumber(x,y,number);
                return true;

            }
    }

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);
            //若数字为0则不显示
            if(board[i][j]==0){
                numberCell.css("width","0px");
                numberCell.css("height","0px");
                numberCell.css(‘top‘,getTop(i,j) + cellSideLength/2 );
                numberCell.css(‘left‘,getLeft(i,j) + cellSideLength/2 );
                }else{
                    numberCell.css(‘width‘,cellSideLength);
                    numberCell.css(‘height‘,cellSideLength);
                    numberCell.css("top",getTop(i,j));
                    numberCell.css("left",getLeft(i,j));
                    //填充div的背景颜色和前景颜色
                    numberCell.css("background-color",getNumberBackgroundColor(board[i][j]));
                    numberCell.css("color",getNumberColor(board[i][j]));
                    numberCell.text(board[i][j]);
                }
            }
        }
            $(‘.number-cell‘).css(‘line-height‘,cellSideLength+‘px‘);
               $(‘.number-cell‘).css(‘font-size‘,0.6*cellSideLength+‘px‘);
    }

function isOver(){
    if(noSpace(board)&&noMove(board)){
        //alert(111);
        gameOver();
        }
    }

function gameOver(){
    alert("游戏结束!");
    }

//监听键盘事件
$(document).keydown(function(event){

    switch(event.keyCode){

        case 37://left
            if(moveLeft()){
                event.preventDefault();
                setTimeout("getOneNumber()",200);
                isOver();
            }
            break;

        case 38://up
            if(moveUp()){
                event.preventDefault();
                setTimeout("getOneNumber()",200);
                isOver();
            }
            break;

        case 39://right
            if(moveRight()){
                event.preventDefault();
                setTimeout("getOneNumber()",200);
                isOver();
                }
            break;

        case 40://down
            if(moveDown()){
                //alert(1);
                event.preventDefault();
                setTimeout("getOneNumber()",200);
                isOver();
            }
            break;

        default:
            break;

        }

    });

document.addEventListener(‘touchstart‘,function(event){//回调函数,返回信息存在event
    sx=event.touches[0].pageX;
    sy=event.touches[0].pageY;

    });

document.addEventListener(‘touchend‘,function(event){
    ex=event.changedTouches[0].pageX;
    ey=event.changedTouches[0].pageY;

    dx=ex-sx;
    dy=ey-sy;

    if(Math.abs(dx)<documentWidth*0.3&&Math.abs(dy)<documentWidth*0.3)return;// 防误触碰

    if(Math.abs(dx)>=Math.abs(dy)){
        //x
        if(dx>0){
            //右
            if(moveRight()){
                setTimeout("getOneNumber()",200);
                isOver();
            }
            }else{
                //左
            if(moveLeft()){
                setTimeout("getOneNumber()",200);
                isOver();
            }
                }
        }else{
            //y
            if(dy>0){
                //下
            if(moveDown()){
                setTimeout("getOneNumber()",200);
                isOver();
            }
                }else{
                    //上
                if(moveUp()){
                    setTimeout("getOneNumber()",200);
                    isOver();
            }
                    }
            }
    });

document.addEventListener(‘touchmove‘,function(event){
    event.preventDefault();//安卓4.0以上会有触碰bug
    });

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

         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++){
                         if(board[i][k]==0&&noBlockH(i,k,j,board)){
                                 //move
                                showMoveAnimation(i,j,i,k);
                                board[i][k]=board[i][j];
                                board[i][j]=0;
                                continue;
                             }else if(board[i][k]==board[i][j]&&noBlockH(i,k,j,board)){
                                     showMoveAnimation( i , j , i , k );
                                    //叠加
                                    board[i][k]+=board[i][j];
                                    board[i][j]=0;

                                    score+=board[i][k];
                                    updateScore(score);
                                    continue;
                             }
                         }
                     }
                 }
             }
        setTimeout("updateBoardView()",200);
        return true;
    }

function moveRight(){
    if(!canMoveRight(board))return false;

    for(var i=0;i<4;i++){
        for(var j=2;j>=0;j--){//除最右列以外,遍历所有
            for(var k=3;k>j;k--){
                if(board[i][k]==0&&noBlockH(i,k,j,board)){
                        showMoveAnimation( i , j , i , k );
                        board[i][k]=board[i][j];
                        board[i][j]=0;
                        continue;
                    }else if(board[i][k]==board[i][j]&&noBlockH(i,k,j,board)){
                            showMoveAnimation( i , j , i , k );
                            board[i][k]+=board[i][j];
                            board[i][j]=0;

                            score+=board[i][k];
                            updateScore(score);
                            continue;
                        }
                }
            }
        }
        setTimeout("updateBoardView()",200);
        return true;
    }

function moveUp(){
    if(!canMoveUp(board))return false;

    //能移动,怎么移
    for(var j=0;j<4;j++){
        for(var i=1;i<4;i++){
            for(var k=0;k<i;k++){
                if(board[k][j]==0&&noBlockV(j,k,i,board)){
                        showMoveAnimation( i , j , k , j );
                        board[k][j]=board[i][j];
                        board[i][j]=0;
                        continue;
                    }else if(board[k][j]==board[i][j]&&noBlockV(j,k,i,board)){
                        showMoveAnimation( i , j , k , j );
                        board[k][j]+=board[i][j];
                        board[i][j]=0

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

                    }
                }
            }
        }
            setTimeout("updateBoardView()",200);
            return true;
    }

function moveDown(){
    //先判断是否能移动
    if(!canMoveDown(board))return false;

    for(var j=0;j<4;j++){
        for(var i=2;i>=0;i--){
            for(var k=3;k>i;k--){
                 if( board[k][j] == 0 && noBlockV( j , i , k , board ) ){
                        showMoveAnimation( i , j , k , j );
                        board[k][j] = board[i][j];
                        board[i][j] = 0;
                        continue;
                    }else if( board[k][j] == board[i][j] && noBlockV( j , i , k , board ) ){
                        showMoveAnimation( i , j , k , j );
                        board[k][j]+= board[i][j];
                        board[i][j] = 0;

                        score+=board[i][k];
                        updateScore(score);
                        continue;
                    }

                }
        }
    }
     setTimeout("updateBoardView()",200);
     return true;
}

show.js

// JavaScript Document
function showNumber(x,y,number){
    var numberCell=$("#number-cell-"+x+"-"+y);
    //填充文字的颜色
    numberCell.css(‘background-color‘,getNumberBackgroundColor(number));
    numberCell.css(‘color‘,getNumberColor(number));
    numberCell.text(number);

    numberCell.animate({
        width:cellSideLength+"px",
        height:cellSideLength+"px",
        top:getTop(x,y),
        left:getLeft(x,y)
        },60)
    }

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

}

function updateScore(score){
    $("#score").html(score+‘‘);

    }

support.js

// JavaScript Document

documentWidth = window.screen.availWidth;
gridContainerWidth = 0.92 * documentWidth;
cellSideLength = 0.18 * documentWidth;
cellSpace = 0.04*documentWidth;

function getTop(i,j){
     return cellSpace + i*( cellSpace + cellSideLength );
    }

function getLeft(i,j){
    return cellSpace + j*( cellSpace + cellSideLength );
    }

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 "#edcc61";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;
    }

    return "black";
}

function getNumberColor( number ){
    if( number <= 4 )
        return "#776e65";

    return "white";
}

function noBlockH(row,k,j,board){//row行,从k列到j列
        for(var i=k+1;i<j;i++){
            if(board[row][i]!=0){
                return false;
                }
            }
            return true;
    }

function noBlockV(col,row1,row2,board){//j列,从k行到i行
    for(var i=row1+1;i<row2;i++){
            if(board[i][col]!=0){
                return false;
                }
            }
            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;
    }

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

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

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

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

function noSpace(board){//没空间,是返回true,否返回false
    for( var i = 0 ; i < 4 ; i ++ ){
        for( var j = 0 ; j < 4 ; j ++ ){
            if(board[i][j]==0){
                return false;
                }
            }
        }
        //循环终止于return 不能放在上面的if判断语句
        return true;
    }
    

基于网页版的2048游戏

时间: 2024-08-05 23:40:34

基于网页版的2048游戏的相关文章

网页版《2048游戏》教程 - 构建页面

1.     游戏标题 <2048>游戏的标题包含游戏名称.开始新游戏的按钮和游戏分数等三项内容. 创建游戏页面index.html: <!DOCTYPE html> <html > <head > < meta charset= "UTF-8"> < title>2048</title > < link rel= "stylesheet" type ="text/c

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

3.1.     初始化棋盘格 我们在main.js文件中,创建newgame()方法用于开始新的游戏.而开始新游戏需要完成两件事情,一是初始化棋盘格,一是在随机两个格子生成两个数字. $(function () { newgame(); }); function newgame() { // 初始化棋盘格 init(); // 在随机两个格子生成数字 generateOneNumber(); generateOneNumber(); } 我们通过编写init()方法来完成棋盘格的初始化工作.棋

网页版《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; } }); 键盘事

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

1.     GameOver部分 下面我们来分析游戏是如何结束的.一种情况是棋盘格中没有空的格子了,一种情况是棋盘格中没有可以移动的格子了. 首先,完成isgameover()方法的逻辑. function isgameover() { if (nospace(board) && nomove(board)) { gameover(); } } 其次,完成棋盘格中没有空的格子. function nospace(board) { for (var i = 0; i < 4; i++

21款网页版html5小游戏源码

html5魅族创意的贪食蛇游戏源码下载 html5网页版打砖块小游戏源码下载 html5 3D立体魔方小游戏源码下载 html5网页版飞机躲避游戏源码下载 html5三国人物连连看游戏源码下载 js html5 2048数字游戏源码_2048网页版源码下载 html5盲打高手打飞字游戏下载_网页版英文打飞字游戏源码下载 jQuery flappy bird电脑版小游戏源码下载 网页版html5 3d俄罗斯方块游戏源码下载 jQuery html5迷宫游戏源码下载 html5网页游戏仿flappy

基于MFC对话框的2048游戏

在之前一篇<简单数字拼板游戏学习>基础上修改,地址:http://www.cnblogs.com/fwst/p/3706483.html 运行效果: (4 X 4) (7 X 7) (1)已完成 2048 游戏基本功能,需要解决的几个关键问题是 a. 首先是数据结构.先定义矩形类,然后定义矩形类对象的二维数组,长度由宏定义,可修改,即可自定义成N*N的游戏.这样游戏就是由N*N个矩形对象组成. b. 然后是游戏逻辑处理,也是最重要的一部分.方向键的响应.键盘上下左右四个方向键的逻辑一样,代码部

jQuery网页版五子棋小游戏源码下载

体验效果:http://hovertree.com/texiao/game/4/ 网页五子棋源代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>jquery五子棋游戏 -</title> <script type="

cocos2dx-html5 实现网页版flappy bird游戏

我也是第一次使用cocos2d_html5,对js和html5也不熟,看引擎自带的例子和引擎源码,边学边做,如果使用过cocos2d-x的话,完成这个游戏还是十分简单的.游戏体验地址: http://zhoujianghai.github.io/games/flappybird/ 1. 首先去cocos2d-x官网下载Cocos2d-html5-v2.2.2(目前最新版本)压缩包 2. 下载安装WampServer(http://www.wampserver.com/en/),后期在浏览器运行程

简单的JavaScript实现2048游戏

实现一个网页版的2048游戏,过程参考了慕课网2048游戏的教程, 具体代码如下: html结构: <body> <div class="header"> <h2>2048</h2> <a href="javascript:newGame()" id="newGameBtn">New Game</a> <p>Score:<span id="scor