2048游戏制作(个人修改版)

需要运用Jquery,响应式2048.

CSS代码:

header{
        display: block;
        margin: 0 auto;
        width: 100%;
        text-align: center;
    }
    header h1{
        font-family: Arial;
        font-size: 40px;
        font-weight: bold;
        margin: 10px auto;
    }
    header #newButtom{
        display: block;
        margin: 20px auto;
        width: 100px;
        background-color: #8f7a66;
        padding: 10px 10px;
        font-family: Arial;
        color: white;
        border-radius: 10px;
        text-decoration: none;

}
    header #newButtom:hover{
        background-color:#9f8b77;
    }
    header p{
        font-family: Arial;
        font-size: 30px;
        margin: 10px auto;
    }
    #gril_container{width: 460px;
        height: 460px;
        padding: 20px;
        margin: 20px auto;
        background-color: #bbada0;
        border-radius: 10px;
        position: relative;
    }
    .gril_cell{
        width: 100px;
        height: 100px;
        border-radius: 6px;
        background-color: #ccc0b3;
        position: absolute;
    }
    .number_cell{
        font-family: Arial;
        font-weight: bold;
        font-size: 60px;
        line-height: 100px;
        text-align: center;
        position: absolute;
    }

HTML代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>2048游戏制作</title>
    <meta name="viewport"
    content="
    width=device-width,
    height=device-height,
    initial-scale=1.0,
    minimum-scale=1.0,
    maximum-scale=1.0,
    user-scalable=no">

</head>
<body>
<header>
    <h1>King</h1>
    <a href="javascript:newgame()" id="newButtom">New Game</a>
    <p>score:<span id="score">0</span></p>
</header>
<div id="gril_container">
    <div class="gril_cell" id="gril_cell_0_0"></div>
    <div class="gril_cell" id="gril_cell_0_1"></div>
    <div class="gril_cell" id="gril_cell_0_2"></div>
    <div class="gril_cell" id="gril_cell_0_3"></div>
    <div class="gril_cell" id="gril_cell_1_0"></div>
    <div class="gril_cell" id="gril_cell_1_1"></div>
    <div class="gril_cell" id="gril_cell_1_2"></div>
    <div class="gril_cell" id="gril_cell_1_3"></div>
    <div class="gril_cell" id="gril_cell_2_0"></div>
    <div class="gril_cell" id="gril_cell_2_1"></div>
    <div class="gril_cell" id="gril_cell_2_2"></div>
    <div class="gril_cell" id="gril_cell_2_3"></div>
    <div class="gril_cell" id="gril_cell_3_0"></div>
    <div class="gril_cell" id="gril_cell_3_1"></div>
    <div class="gril_cell" id="gril_cell_3_2"></div>
    <div class="gril_cell" id="gril_cell_3_3"></div>
</div>

Jquery代码:

var board=new Array();
        var score=0;
        var hansConfilcte=new Array();
        var privates=new Object();
        var startX=0;
        var startY=0;
        var endX=0;
        var endY=0;
        $(document).ready(function($) {
            perpareForMobil();
            newgame();
        });
        function perpareForMobil(){
            if(documentWidth>500){
                grildContainWidth=500;
                cellSpace=20;
                cellSideLength=100;
            }
            $(‘#gril_container‘).css(‘width‘,grildContainWidth-2*cellSpace);
            $(‘#gril_container‘).css(‘height‘,grildContainWidth-2*cellSpace);
            $(‘#gril_container‘).css(‘padding‘,cellSpace);
            $(‘#gril_container‘).css(‘border-radius‘,0.02*grildContainWidth);
            $(‘.gril_cell‘).css(‘width‘,cellSideLength);
            $(‘.gril_cell‘).css(‘height‘,cellSideLength);
            $(‘.gril_cell‘).css(‘border-radius‘,0.02*cellSideLength);
        }
        function newgame(){
            //初始化棋盘格
            init();
            //随机生成两个格子的数字,用2或者4
            gernarateOneNumber();
            gernarateOneNumber();
            
        }
        function gernarateOneNumber(){
            if(nospace(board)){
                return false;
            }
            var times=0;
            //随机一个位置
            var randx=parseInt(Math.floor(Math.random()*4));
            var randy=parseInt(Math.floor(Math.random()*4));
            while(times<50){
                if(board[randx][randy]==0){
                    break;
                }
                randx=parseInt(Math.floor(Math.random()*4));
                randy=parseInt(Math.floor(Math.random()*4));
                times++;
            }
            if(times==50){
                for(var i=0;i<4;i++){
                    for(var j=0;j<4;j++){
                        if(board[i][j]==0){
                            randx=i;
                            randy=j;
                        }
                    }
                }
            }
            //随机一个数字
            var randNumber=Math.random() <0.5 ? 2 : 4;
            //在随机位置显示随机数字
            board[randx][randy]=randNumber;
            showNumberwithAnimation(randx,randy,randNumber);
            return true;
        }
        //PC端键盘
        $(document).keydown(function(event) {
            switch(event.keyCode){
                //left
                case 37 :
                event.preventDefault();
                if(moveLeft()){
                    setTimeout("gernarateOneNumber()",210);
                    setTimeout("isGameOver(board)",300);
                }
                 break;
                 //top
                case 38 :
                event.preventDefault();
                if(moveTop()){
                    setTimeout("gernarateOneNumber()",210);
                    setTimeout("isGameOver(board)",300);
                }
                 break;
                 //right
                case 39 :
                event.preventDefault();
                if(moveRight()){
                    setTimeout("gernarateOneNumber()",210);
                    setTimeout("isGameOver(board)",300);
                }
                 break;
                 //down
                case 40 :
                event.preventDefault();
                if(moveDown()){
                    setTimeout("gernarateOneNumber()",210);
                    setTimeout("isGameOver(board)",300);
                }
                 break;
                default:
                 break;
            }
        });
        //移动端触摸
        document.addEventListener(‘touchstart‘,function(event){
            startX=event.touches[0].pageX;
            startY=event.touches[0].pageY;
        })
        document.addEventListener("touchmove",function(event){
            event.preventDefault();
        })
        document.addEventListener(‘touchend‘,function(event){
            endX=event.changedTouches[0].pageX;
            endY=event.changedTouches[0].pageY;
            var deltaX=startX-endX;
            var deltaY=startY-endY;
            //x
            if(Math.abs(deltaX)<0.3*documentWidth&&Math.abs(deltaY)<0.3*documentWidth){
                return;
            }
            if(Math.abs(deltaX)>=Math.abs(deltaY)){
                //向右滑动
                if(deltaX<0){
                    if(moveRight()){
                    setTimeout("gernarateOneNumber()",210);
                    setTimeout("isGameOver(board)",300);
                    }
                }
                //向左滑动
                else{
                     if(moveLeft()){
                    setTimeout("gernarateOneNumber()",210);
                    setTimeout("isGameOver(board)",300);
                }
                }
            }
            //y
            else{
                //向下滑动
                if(deltaY<0){
                    if(moveDown()){
                    setTimeout("gernarateOneNumber()",210);
                    setTimeout("isGameOver(board)",300);
                }
                }
                //向上滑动
                else{
                    if(moveTop()){
                    setTimeout("gernarateOneNumber()",210);
                    setTimeout("isGameOver(board)",300);
                }
                }
            }
        })
        //左移操作
        function moveLeft(){
            if(!canLeft(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&&noBlockHorizontal(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]&&noBlockHorizontal(i,k,j,board)&&!hansConfilcte[i][k]){
                                showmoveAnimation(i,j,i,k);
                                board[i][k]+=board[i][j];
                                board[i][j]=0;
                                score+=board[i][k];
                                updateScore(score);
                                hansConfilcte[i][k]=true;
                                continue;
                            }
                        }
                    }
                }
            }
            setTimeout("updataBoardView()",200);
            return true;
        }
        //上移操作
        function moveTop(){
            if(!canTop(board)){
                return false;
            }
            for(var i=1;i<4;i++){
                for(var j=0;j<4;j++){
                    if(board[i][j]!=0){
                        for(var k=0;k<i;k++){
                            if(board[k][j]==0&&noBlockHorital(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]&&noBlockHorital(j,k,i,board)&&!hansConfilcte[k][j]){
                                showmoveAnimation(i,j,k,j);
                                board[k][j]+=board[i][j];
                                board[i][j]=0;
                                score+=board[k][j];
                                updateScore(score);
                                hansConfilcte[k][j]=true;
                                continue;
                            }
                        }
                    }
                }
            }
            setTimeout("updataBoardView()",200);
            return true;
        }
        //右移操作
        function moveRight(){
            if(!canRight(board)){
                return false;
            }
            for(var i=0;i<4;i++){
                for(var j=2;j>-1;j--){
                    if(board[i][j]!=0){
                        for(var k=3;k>j;k--){
                            if(board[i][k]==0&&noBlockHorizontal(i,j,k,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]&&noBlockHorizontal(i,j,k,board)&&!hansConfilcte[i][k]){
                                showmoveAnimation(i,j,i,k);
                                board[i][k]+=board[i][j];
                                board[i][j]=0;
                                score+=board[i][k];
                                updateScore(score);
                                hansConfilcte[i][k]=true;
                                continue;
                            }
                        }
                    }
                }
            }
            setTimeout("updataBoardView()",200);
            return true;
        }
        //下移操作
        function moveDown(){
            if(!canDown(board)){
                return false;
            }
            for(var i=2;i>-1;i--){
                for(var j=0;j<4;j++){
                    if(board[i][j]!=0){
                        for(var k=3;k>i;k--){
                            if(board[k][j]==0&&noBlockHorital(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]&&noBlockHorital(j,i,k,board)&&!hansConfilcte[k][j]){
                                showmoveAnimation(i,j,k,j);
                                board[k][j]+=board[i][j];
                                board[i][j]=0;
                                score+=board[k][j];
                                updateScore(score);
                                hansConfilcte[k][j]=true;
                                continue;
                            }
                        }
                    }
                }
            }
            setTimeout("updataBoardView()",200);
            return true;
        }
        //判断是否可左移
        function canLeft(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]==board[i][j-1]){
                            return true;
                        }
                    }
                }
            }
            return false;
        }
        //判断是否可上移
        function canTop(board){
            for(var i=1;i<4;i++){
                for(var j=0;j<4;j++){
                    if(board[i][j]!=0){
                        if(board[i-1][j]==0||board[i][j]==board[i-1][j]){
                            return true;
                        }
                    }
                }
            }
            return false;
        }
        //判断是否可右移
        function canRight(board){
            for(var i=0;i<4;i++){
                for(var j=2;j>-1;j--){
                    if(board[i][j]!=0){
                        if(board[i][j+1]==0||board[i][j]==board[i][j+1]){
                            return true;
                        }
                    }
                }
            }
            return false;
        }
        //判断是否可下移
        function canDown(board){

for(var i=2;i>-1;i--){
                for(var j=0;j<4;j++){
                    if(board[i][j]!=0){
                        if(board[i+1][j]==0||board[i][j]==board[i+1][j]){
                            return true;
                        }
                    }
                }
            }
            return false;
        }
        //判断左右移动是否有障碍
        function noBlockHorizontal(row,col1,col2,board){
            for(var i=col1+1;i<col2;i++){
                if(board[row][i]!=0){
                    return false;
                }
            }
            return true;
        }
        //判断上下移动是否有障碍
        function noBlockHorital(row,col1,col2,board){
            for(var i=col1+1;i<col2;i++){
                if(board[i][row]!=0){
                    return false;
                }
            }
            return true;
        }
        //判断游戏是否结束
        function isGameOver(board){
            if(nospace(board)&&nomove(board)){
                gameover();
            }
        }
        function gameover(){
            alert("GameOver!!!!");
        }
        //移动动画
        function showmoveAnimation(fx,fy,tx,ty){
            var numberCell=$("#number_cell_"+fx+"_"+fy);
            numberCell.animate({top: getPosTop(tx,ty), left: getPosLeft(tx,ty)}, 200);
        }
        //判断是否能继续移动
        function nomove(board){
            if(canDown(board)||canRight(board)||canLeft(board)||canTop(board)){
                return false;
            }
            return true;
        }
        //生成随机数字的动画函数
        function showNumberwithAnimation(i,j,randNumber){
            var numberCell=$(‘#number_cell_‘+i+"_"+j);
            numberCell.css("background-color",getBoardBackColor(randNumber));
            numberCell.css("color",getBoardColor(randNumber));
            numberCell.text(privates["x"+randNumber]);
            numberCell.animate({width: cellSideLength, height: cellSideLength,top:getPosTop(i,j),left:getPosLeft(i,j)}, 50)
        }
        //判断是否还有空间
        function nospace(board){
            for(var i=0;i<4;i++){
                for(var j=0;j<4;j++){
                    if(board[i][j]==0){
                        return false;
                    }
                }
            }
            return true;
        }
        function init(){
         privates={
            x2:"兵",
            x4:"炮",
            x8:"車",
            x16:"马",
            x32:"象",
            x64:"士",
            x128:"将",
            x256:"帅",
            x512:"王",
            x1024:"皇",
            x2048:"帝",
        }
            for(var i=0;i<4;i++){
                for(var j=0;j<4;j++){
                    var grilcell=$("#gril_cell_"+i+"_"+j);
                    grilcell.css("top",getPosTop(i,j));
                    grilcell.css("left",getPosLeft(i,j));
                }
            }
            for(var i=0;i<4;i++){
                board[i]=new Array();
                hansConfilcte[i]=new Array();
                for(var j=0;j<4;j++){
                    board[i][j]=0;
                    hansConfilcte[i][j]=false;
                }
            }

updataBoardView();
            score=0;
        }
        //加分函数
        function updateScore(score){
            $(‘#score‘).text(score);
        }
        function updataBoardView(){
            $(".number_cell").remove();
            for(var i=0;i<4;i++){
                for(var j=0;j<4;j++){
                    $("#gril_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","0");
                        theNumberCell.css("height","0");
                        theNumberCell.css("top",getPosTop(i,j)+(cellSideLength/2));
                        theNumberCell.css("left",getPosLeft(i,j)+(cellSideLength/2));
                    }
                    else{
                        theNumberCell.css("width",cellSideLength);
                        theNumberCell.css("height",cellSideLength);
                        theNumberCell.css("top",getPosTop(i,j));
                        theNumberCell.css("left",getPosLeft(i,j));
                        theNumberCell.css("background-color",getBoardBackColor(board[i][j]));
                        theNumberCell.css("color",getBoardColor(board[i][j]));
                        theNumberCell.text(privates["x"+board[i][j]]);
                    }
                    hansConfilcte[i][j]=false;
                }
            }
            $(‘.number_cell‘).css(‘line-height‘,cellSideLength+"px");
            $(‘.number_cell‘).css(‘font-size‘,0.6*cellSideLength+"px");
        }
        function getBoardBackColor(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 "#f67e5f";break;
                case 64 :return "#edcf72";break;
                case 128 :return "#edcc61";break;
                case 256 :return "#9c0";break;
                case 512 :return "#33b5e5";break;
                case 1024 :return "#09c";break;
                case 2048 :return "#93c";break;
            }
            return "black";
        }
        function getBoardColor(number){
            if(number<=4){
                return "#776e65";
            }
            else{
                return "white";
            }
        }
        documentWidth=window.screen.availWidth;
        grildContainWidth=documentWidth*0.92;
        cellSideLength=0.18*documentWidth;
        cellSpace=0.04*documentWidth;
        function getPosTop(i,j){
            return cellSpace+(cellSpace+cellSideLength)*i;
        }
        function getPosLeft(i,j){
            return cellSpace+(cellSpace+cellSideLength)*j;
        }

时间: 2024-11-03 05:29:19

2048游戏制作(个人修改版)的相关文章

Web版2048游戏制作

写在前面 工作之余参与了<慕课网2048游戏制作>的学习视频,视频断断续续看完了,游戏也制作成功了.因为其他的事情也没来的及总结,一拖时间也就过去了,整理磁盘的时候发现了2048源码,思考一下还是将之push到github上了(后面贴出),也顺便写篇总结,回顾一下,同时也谢谢liuyubobobo老师的授课. 不过源码在手,不运行下玩玩,怎么说的过去呢,哈哈!下面是游戏截图. 大图是PC端运行的效果,小图则是在iphone5s上的运行效果(Chrome浏览器debug,具体如何做参考文章:ht

用javascript制作2048游戏的思路(原创若 转载请附上本链接)

一.项目已上传至github,地址:https://github.com/forjuan/2048game 二.学习了javascript基础后,想要捣鼓点东西做,做了一个自己以前很爱玩的2048游戏.经过初期的思路设计手工画了设计思路图.手工图有空在用图画出来. 实现2048的功能:1.核心:上下左右移动. 2.游戏开始,游戏结束. 3.外观实现. 4.积分(暂时没实现) 把问题分解:1.首要难点移动,将移动进行分解,分为上下左右移动: 2.用什么记录位置,怎样记录每个方块的值,边界,相同值相

简易2D横版RPG游戏制作

Unity学习笔记1 简易2D横版RPG游戏制作 http://m.blog.csdn.net/article/details?id=24601905

Android 2048游戏开发

根据教程写的简单的2048游戏. 极客学院教程地址:http://www.jikexueyuan.com/course/43.html 我的源代码地址:https://github.com/myCodingTrip/2048Game 项目有3个类. Card extends FrameLayout{ private int num; private TextView label; public Card(Context context) public int getNum() public vo

游戏制作流程【转】

作为创意产业最具发展潜力的行业——游戏行业,它的发展俨然超过所有人的预想.国家政策大力扶持,游戏市场发展势头迅猛,网游收入规模超越传统三大娱乐产业:电影票房.电视娱乐节目和音像制品. 与此同时,国内网游制作水准也在不断提升,<完美世界>.<梦幻西游>等众多高水平网游逐渐夺回被国外网游占据的市场份额.国产网游的逐步成熟,中国网 游市场的前景一片大好,让很多喜欢游戏的人都想进入游戏行业,但对大多数人来说这一领域还是陌生.空白的.这些高水准的网游是如何制作出来的?怎么才能成 为一名优秀的

2048游戏C语言代码

听说2048游戏实现起来很easy! 所以今天就试了试!确实不太难,要想编的很成功,也不是太容易!有很多细节需要考虑! 下面是我自己设计的代码,估计里面会漏洞百出!希望路过大神能指点一二! #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #define WIN 256 // 可以修改决定游戏输赢的值 // 矩阵数组 int num[4][4]={0,0,0,0,0

用javascript实现一个2048游戏

早就想自己写一个2048游戏了,昨晚闲着没事,终于写了一个如下图,按方向键开始玩吧.如果觉得操作不方便,请直接打开链接玩吧:http://gujianbo.1kapp.com/2048/2048.html 附上源代码链接:https://github.com/gujianbo/js2048 个人博客地址:http://gujianbo.1kapp.com/ 新浪微博:http://weibo.com/gujianbobo 欢迎读者交流讨论并提出宝贵意见. 用javascript实现一个2048游

2048游戏回顾一:使用SurfaceView创建游戏启动动画

SurfaceView有个很大的好处,就是可以在子线程中绘制UI,其他的View只能在主线程中更新UI,这或多或少给编程增加了些不便.而SurfaceVIew在子线程中可以绘制UI的特性,再加上其可以直接从内存或者DMA等硬件接口取得图像数据,这使得它适合2d游戏的开发. SurfaceView使用步骤 SurfaceView的使用比较简单,可以总结为如下几个步骤: 1.继承SurfaceView并实现 SurfaceHolder.Callback方法 譬如: public class Star

程序设计C语言二级考试教程 Java基础视频教程 安卓软件开发教程 Unity3D游戏制作入门教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut