谈谈2048小游戏怎么用HTML+CSS+JS实现它

我们在做2048游戏之前先搞清楚游戏的思路在去完成建议先玩玩游戏在去想怎么做

HTML+CSS部分没啥好说的 直接上图;


<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>2048</title>
        <link rel="stylesheet" href="css/2048.css" />   
    </head>
    <body>
        <div class="container">
            <div class="container-head">
              SCORE:<span style="color: red;" id="SCORE1" >0</span>
            </div>
            <div class="mian">
        <div class="grid-container">
            <div class="grid-row">
            <div class="grid-cell "     id="n00"></div>
            <div class="grid-cell "     id="n01"></div>
            <div class="grid-cell "     id="n02"></div>
            <div class="grid-cell "     id="n03"></div>
            </div>
            <div class="grid-row">
            <div class="grid-cell"     id="n10"></div>
            <div class="grid-cell"     id="n11"></div>
            <div class="grid-cell"     id="n12"></div>
            <div class="grid-cell" id="n13"></div>
            </div>
            <div class="grid-row" >
            <div class="grid-cell"     id="n20"></div>
            <div class="grid-cell"     id="n21"></div>
            <div class="grid-cell"     id="n22"></div>
            <div class="grid-cell" id="n23"></div>
            </div>
            <div class="grid-row">
            <div class="grid-cell"     id="n30"></div>
            <div class="grid-cell"     id="n31"></div>
            <div class="grid-cell"     id="n32"></div>
            <div class="grid-cell" id="n33"></div>
            </div>
        </div>   
            </div>
            <div  class="gameend" id="Gameover">
                <div class="Gameover" >
                     <p >GAME OVER!!!</p>
                     <p>SCORE:<span  style="color:red" id="SCORE2"></span></p>
                      <a style="display: inline-block;" href="">try again</a>
                </div>
            </div>
        </div>
    </body>
```
//下面是CSS部分
*{
padding: 0px;
margin: 0px;
list-style: none;
}
.container{
width: 550px;
height: 550px;
margin: 50px auto;
}
.container-head{
font-family:arial;
font-size: 40px;
text-indent: 23px;
}
.mian{
width: 500px;
height: 500px;
margin: auto;
background: #bbada0;
position: relative;
border-radius: 10px;
}
.grid-container{
width: 470px;
height: 470px;
position: absolute;
padding: 15px 15px 15px 25px;
}
.grid-row{
width: 470px;
height: 106.28px;
margin-bottom: 15px
}
.grid-cell{
width: 100.25px;
height: 106.25px;
margin-right: 15px;
float: left;
border-radius: 3px;
background: #ccc0b3;
font-size: 55px;
line-height: 106.25px;
text-align: center;
}
.n2{
background-color:#eee3da;
color:#776e65;
}
.n4{
background-color:#ede0c8;
color:#776e65;
}
.n8{
background-color:#f2b179
}
.n16{
background-color:#f59563
}
.n32{
background-color:#f67c5f
}
.n64{
background-color:#f65e3b
}
.n128{
background-color:#edcf72
}
.n256{
background-color:#edcc61
}
.n512{
background-color:#9c0
}
.n1024{
background-color:#33b5e5;
font-size:40px;
}
.n2048{
background-color:#09c;
font-size:40px;
}
.n4096{
background-color:#a6c;
font-size:40px;
}
.gameend{
display:none;
width: 500px;
height: 500px;
z-index: 999;
position: absolute;
top: 45px;
background: rgba(50,50,50,0.5);
left: 32%;
}
.Gameover{
width: 400px;
height: 200px;
position: absolute;
background: white;
border-radius: 5px;
top: 50%;
left: 10%;
font-size: 35px;
text-align: center;
line-height: 60px;
font-family: arial;
}
.Gameover>a{
border-radius: 5px;
background: #9F8D77;
text-decoration: none;
color: white;
}
剩下的是JS部分
<script type="text/javascript">
var game ={
data:[],//添加一个属性,存储游戏数据
score:0,//添加一个分数属性
gameover:0,//添加一个游戏结束的状态
gamerunning:1,//添加一个游戏运行时状态:
startus:1,//表示的是当前游戏的状态,时时刻刻检测该状态,如果这个状态等于1,表示可以继续,如果等于0,结束
start:function(){ //添加游戏开始的方法
this.startus = this.gamerunning;
this.score = 0;
this.data=[];
for(var r = 0; r < 4; r++){
this.data[r] = [];
for(var c = 0; c < 4; c++){
this.data[r][c] = 0;
}
}
this.randomNum();
this.randomNum();
this.dataView();
console.log(this.data);
},
randomNum:function(){ //生成一个随机数的方法
for(var i =0; i <1; i--){
var r = Math.floor(Math.random() * 4);
var c = Math.floor(Math.random() * 4);
if(this.data[r][c] == 0){
var num=Math.random() > 0.5?2:4;
this.data[r][c] = num;
break; //退出死循环
}
}
},
dataView:function(){ //将数据显示到页面
for(var r = 0; r < 4; r++){
for(var c = 0; c < 4; c++){
var div =document.getElementById("n" + r + c);
if(this.data[r][c] ==0){
div.innerHTML="";
div.className = "grid-cell";
}else{
div.innerHTML=this.data[r][c];
div.className = "grid-cell n" + this.data[r][c]
}
}
}
document.getElementById("SCORE1").innerHTML=this.score;
if(this.startus == this.gameover){ //如果游戏处于结束的阶段了,更新视图
document.getElementById("SCORE2").innerHTML=this.score; //找到结束时的分数ID,更新分数
document.getElementById("Gameover").style.display="block";
}else{
document.getElementById("Gameover").style.display="none";
}
},
isgameover:function(){ // 判断游戏是否结束的方法
// 那,游戏结束需要满足哪些条件呢?
// 1.格子全部都不为0的时候 && 相邻的位置不能有相同的
// 给函数增加一个返回值,如果false表示还可以继续,ture表示游戏结束
for(var r = 0; r < 4; r++){
for(var c =0; c < 4; c++){
if(this.data[r][c] ==0){ //如果有等于零的情况,则游戏继续
return false;
}if(c<3){
if(this.data[r][c] ==this.data[r][c+1]){ //检测同一行之间是否有相同
return false
}
}
if(r<3){
if(this.data[r][c] == this.data[r+1][c]){ //检测同一列之间是否有相同
return false;
}
}
}
}
return true;
},
//左移动开始
moveleft:function(){ //给移动之前的数组“拍个照” 因为数组之间不能直接比较(地址问题),所以这里需要先将其转化为字符串,然后才能用于比较
var befoer = String(this.data);
console.log(this.data);
console.log(befoer);
for(var r = 0; r<4; r++){
this.moveLeftInRow(r);
}
var after = String(this.data);//给移动之后的数组“拍个照”
console.log(after);
if(befoer != after){
this.randomNum();
if(this.isgameover()){
this.startus = this.gameover;
}
this.dataView();
}
},
moveLeftInRow:function(r){
for(var c=0; c<3;c++){
var nextc =this.getNextInRow(r,c); //找数字,并依据不同的情况返回值
if(nextc != -1){ //在位置game.data[r][i]上找到了元素
if(this.data[r][c] == 0){
this.data[r][c] =this.data[r][nextc];
this.data[r][nextc] = 0;
}else if(this.data[r][c] ==this.data[r][nextc]){
this.data[r][c] *=2;
this.data[r][nextc] =0;
this.score += this.data[r][c];
}
}else{
break;
}
}
},
getNextInRow:function(r,c){ //找位置的函数
for(var i =c+1; i < 4; i++){ //从当前位置的下一个元素开始去找,所以是 c+1(当前位置为c,下一个为c+1)
if(this.data[r][i] !=0){ //如果不等于0,则表明位置上存在一个元素
return i; //找到了就把这个位置直接返回出来
}
}
return -1; //如果没有找到,随意取一个标识符返回回来:表示没有找到
}, //左移动结束
//右移动开始
moveRight:function(){
var befoer = String(this.data);
console.log(this.data);
console.log(befoer);
for(var r = 0; r<4; r++){
this.moveRightInRow(r);
}
var after = String(this.data);//给移动之后的数组“拍个照”
console.log(after);
if(befoer != after){
this.randomNum();
if(this.isgameover()){
this.startus = this.gameover;
}
this.dataView();
}
},
moveRightInRow:function(r){
for(var c = 3; c > 0;c--){
var nextc =this.moveRightNextRows(r,c); //找数字,并依据不同的情况返回值
if(nextc != -1){ //在位置game.data[r][i]上找到了元素
if(this.data[r][c] == 0){
this.data[r][c] =this.data[r][nextc];
this.data[r][nextc] = 0;
c++;// 这一步,重点理解: 当位置替代发生了改变之后,下一次的比较则从下一位开始比较,需要让它回到原点的位置重新从头开始比较
}else if(this.data[r][c] ==this.data[r][nextc]){
this.data[r][c] *=2;
this.data[r][nextc] =0;
this.score += this.data[r][c];
}
}else{
break;
}
}
},
moveRightNextRows:function(r,c){ //找位置的函数
for(var j =c-1; j>=0; j--){ //因为从c开始,所以下一位是从 c-1 开始找
if(this.data[r][j] !=0){
return j;
}
}
return -1;
}, //右移动结束
//向上移动
moveUP:function(){
var befoer = String(this.data);
console.log(befoer);
for(var c = 0; c<4; c++){
this.moveUpInRow(c);
}
var after = String(this.data);//如果两次拍照不相等,就发生了移动
if(befoer != after){
this.randomNum();
if(this.isgameover()){
this.startus = this.gameover;
}
this.dataView();
}
},
moveUpInRow:function(c){
for(var r = 0; r<4;r++){
var nextc =this.moveUPNextRows(r,c); //找数字,并依据不同的情况返回值
if(nextc != -1){ //在位置game.data[r][i]上找到了元素
if(this.data[r][c] == 0){
this.data[r][c] =this.data[nextc][c];
this.data[nextc][c] = 0;
r--; //从原地开始,继续往后
}else if(this.data[r][c] ==this.data[nextc][c]){
this.data[r][c] *=2;
this.score +=this.data[r][c];
this.data[nextc][c]=0;
}
}else{
break;
}
}
},
moveUPNextRows:function(r,c){ //找位置的函数
for(var j =r+1; j <4; j++){ //如果不为0,表示找到,就返回i,i对应的格子的几个位置
if(this.data[j][c] !=0){
return j;
}
}
return -1;
},
//向下移动
moveDown:function(){
var befoer = String(this.data);
console.log(this.data);
console.log(befoer);
for(var c = 0; c<4; c++){
this.moveDownInRow(c);
}
var after = String(this.data);//给移动之后的数组“拍个照”
console.log(after);
if(befoer != after){
this.randomNum();
if(this.isgameover()){
this.startus = this.gameover;
}
this.dataView();
}
},
moveDownInRow:function(c){
for(var r = 3; r >=0;r--){
var nextr =this.moveDownNextRows(r,c); //找数字,并依据不同的情况返回值
if(nextr != -1){ //在位置game.data[r][i]上找到了元素
if(this.data[r][c] == 0){
this.data[r][c] = this.data[nextr][c];
this.data[nextr][c] = 0;
r++;// 这一步,重点理解: 当位置替代发生了改变之后,下一次的比较则从下一位开始比较,需要让它回到原点的位置重新从头开始比较
}else if(this.data[r][c] ==this.data[nextr][c]){
this.data[r][c] *=2;
this.score += this.data[r][c];
this.data[nextr][c]=0;
}
}else{
break;
}
}
},
moveDownNextRows:function(r,c){ //找位置的函数
for(var j =r-1; j>=0; j--){ //因为从r开始,所以下一位是从 r-1 开始找
if(this.data[j][c] !=0){
return j;
}
}
return -1;
},
//向下移动结束
}
game.start();
document.onkeydown = function(event){
var event = event || e || arguments[0];
if(event.keyCode == 37){
game.moveleft();
} else if(event.keyCode ==39){
game.moveRight();
}else if(event.keyCode ==38){
game.moveUP();
}else if(event.keyCode ==40){
game.moveDown();
}
}
// addEventListener 
document.addEventListener("touchstart",function(event){
event = event || window.event;
console.log("按下");
console.log(event);
startX =event.touches[0].pageX; //获取开始位置的横坐标
startY =event.touches[0].pageY //获取开始位置的纵坐标;
});
document.addEventListener("touchend",function(event){
console.log("抬起");
console.log(event);
EndX = event.changedTouches[0].pageX; //获取结束位置的横坐标
EndY = event.changedTouches[0].pageY; //获取结束位置的横坐标
var aX =EndX - startX; //获取移动后的距离半段移动到方向
var aY =EndY - startY;
var absX =Math.abs(aX) > Math.abs(aY);
var absY =Math.abs(aY) > Math.abs(aX);
//如果aX的值大于0,并且X的绝对值大于Y的说明左移动
if( aX<0 && absX){
console.log("左移动");
game.moveleft();
} else if(aX >0 && absX){
console.log("右移动");
game.moveRight();
} else if(aY<0 && absY ){
console.log("向上移动");
game.moveUP();
}else if(aY >0 && absY){
console.log("向下移动");
game.moveDown();
}
})
</script>

你可能感兴趣的:(javascript)