欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

html+css+js适合前端小白的实战全解(超详细)——2048小游戏(一)

程序员文章站 2022-04-15 23:42:05
前几天看了慕课里的制作2048小游戏课程->>> 指路:https://www.imooc.com/learn/76这个游戏适合我这种前端入门的小白作为第一个游戏项目,做完还挺有成就感、虽然是跟着视频做,但是还是经常出错做完以后收获挺大,但是还有一些不太理解。现在开始复盘,把每一步都认真归纳总结希望能通过一步一步理解透彻里面的原理,分享出来也希望能帮到你该游戏需要有HTML、CSS、JS和JQ基础边做边思考每一步的来由2048小游戏(一)......

 

前几天看了慕课里的制作2048小游戏课程->>> 指路:https://www.imooc.com/learn/76

这个游戏适合我这种前端入门的小白作为第一个游戏项目,做完还挺有成就感、

虽然是跟着视频做,但是还是经常出错

做完以后收获挺大,但是还有一些不太理解。现在开始复盘,把每一步都认真归纳总结

希望能通过一步一步理解透彻里面的原理,分享出来也希望能帮到你

 

该游戏需要有HTML、CSS、JS和JQ基础

 边做边思考每一步的来由

 

2048小游戏(一)

开始做这个游戏之前请先弄懂整个游戏架构,弄懂游戏架构之前,一定要先玩几盘

2048在线小游戏指路:https://newdoku.com/zh/2048.php

玩法我就不多说了,自己体会

html+css+js适合前端小白的实战全解(超详细)——2048小游戏(一)

 

MVC分别表示:

M:Model 数据层,是存储游戏的数据的

V:View 视图层,是用户操作的页面

C:control 控制层,根据用户在视图层输入的指令,调取数据层的信息,进而产生响应操作

程序无论复杂与否,都能分成这三个层次。

 

游戏的UI界面:由HTML/CSS去控制

游戏的逻辑:由JS/JQ来控制

 

弄清之后我们正式开始我们的2048小游戏编程之旅~

 

1.1 创建引入css文件和js文件

做这个游戏,我们需要创建3个js文件,1个css文件,1个html文件

2048.html

2048.css

main2048.js

support2048.js

showanimation2048.js

 

还需要引入一个jQury文件,你也可以使用一个在线的

<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript" src="jquery-3.4.1.min.js"></script>
<script type="text/javascript" src="main2048.js"></script>
<script type="text/javascript" src="showanimation2048.js"></script>
<script type="text/javascript" src="support2048.js"></script>
<link rel="stylesheet" type="text/css" href="2048.css">

在【2048.html】一共需要引入5个文件

 

需要控制的经常会改变的数,我们把他们定义在js里,因为 js可以操作一切html和css元素

在【main2048.js】中,我们需要先定义一个数组Array,用来存储游戏盘上的16个格子,定义score来存储分数

  1. var board = new Array();  
  2. var score = 0;  

 

1.2 UI设计

html+css+js适合前端小白的实战全解(超详细)——2048小游戏(一)

先大致想好界面设计

这个界面分成两个部分,headercontainer

header里有标题h1,newgame按钮a,点击会跳到函数newgame(); 这个函数后面再定义

p标签存放成绩,因为数值会变,里面放置span标签控制score的变化

  1. <header>  
  2.         <h1>2048</h1>  
  3.         <a href="javascript:newgame();" id="newgamebutton">New Game</a>  
  4.         <p>score<span id="score">0</span></p>  
  5. </header>  

 

给header部分附上样式,先整体,后局部

  1. body{  
  2.     font-family: Arial;  }  
  3.   
  4. header{  
  5.     display: block;  
  6.     margin: 0 auto;  
  7.     width: 500px;  
  8.     text-align: center;  }  
  9.   
  10. header h1{  
  11.     font-size: 60px;  
  12.     font-weight: bold;  }  
  13.   
  14. header #newgamebutton{  
  15.     display: block;  
  16.     margin: 20px auto;  
  17.     width: 100px;  
  18.     padding: 10px;  
  19.     background-color: #8f7a66;  
  20.     color: #fff;  
  21.     border-radius: 10px;  
  22.     text-decoration: none;  }  
  23.   
  24. header #newgamebutton:hover{  
  25.     background-color: #9f8b77;  }  
  26.   
  27. header p{  
  28.     font-size: 25px;  
  29.     margin: 20px auto;  }  

 

再来布局container部分,取名“grid-container”

棋盘上有16个格子,每个格子样式一样,可以用类别来控制样式,统一取名class="grid-cell"但每个格子效果不一样,都要取一个id,便于给他们定位

于是采用 grid-cell-i-j 形式命名

 

  1. <div id="grid-container">  
  2.     <div class="grid-cell" id="grid-cell-0-0"></div>  
  3.     <div class="grid-cell" id="grid-cell-0-1"></div>  
  4.     <div class="grid-cell" id="grid-cell-0-2"></div>  
  5.     <div class="grid-cell" id="grid-cell-0-3"></div>  
  6.   
  7.     <div class="grid-cell" id="grid-cell-1-0"></div>  
  8.     <div class="grid-cell" id="grid-cell-1-1"></div>  
  9.     <div class="grid-cell" id="grid-cell-1-2"></div>  
  10.     <div class="grid-cell" id="grid-cell-1-3"></div>  
  11.   
  12.     <div class="grid-cell" id="grid-cell-2-0"></div>  
  13.     <div class="grid-cell" id="grid-cell-2-1"></div>  
  14.     <div class="grid-cell" id="grid-cell-2-2"></div>  
  15.     <div class="grid-cell" id="grid-cell-233"></div>  
  16.   
  17.     <div class="grid-cell" id="grid-cell-3-0"></div>  
  18.     <div class="grid-cell" id="grid-cell-3-1"></div>  
  19.     <div class="grid-cell" id="grid-cell-3-2"></div>  
  20.     <div class="grid-cell" id="grid-cell-3-3"></div>  
  21. </div>  

 

1.3 构建页面元素

 

html+css+js适合前端小白的实战全解(超详细)——2048小游戏(一)

棋盘宽高都为500px,每个格子100px,留有20px的padding

 

先给棋盘和格子做UI样式
最后16个小格子的位置各不相同,采用定位,故棋盘grid-container需要相对定位relative

  1. #grid-container{  
  2.     width: 460px;  
  3.     height: 460px;  
  4.     padding: 20px;  
  5.     margin: 50px auto;  
  6.     background-color: #bbada0;  
  7.     border-radius: 10px;  
  8.     position: relative;  }  
  9.   
  10. .grid-cell{  
  11.     width: 100px;  
  12.     height: 100px;  
  13.     border-radius: 6px;  
  14.     background: #ccc0b3;  
  15.     position: absolute;  }  

 

2.1 游戏逻辑

具体每个小格子的位置,需要用js来控制

在【main2048.js】中设计当整个程序加载完毕后,运行的主函数

对于整个游戏来说,主函数只做一件事情,就是开始一个新游戏

开始一个新游戏,需要

1. 初始化棋盘

2. 在随机两个格子里生成2或4

之前a标签开始新游戏定义的函数就是newgame()

newgame()里,我们先定义一个初始化棋盘的内函数init()

 

2.11  init函数

我们用init()来初始化棋盘格

  1. function init() {   
  2.    for(var i = 0; i < 4; i++)  
  3.        for(var j = 0; j < 4; j++)  
  4.          {
  5.            var gridCell = $("#grid-cell-"+i+"-"+j);     //因为前面我们定义了grid-cell-i-j
  6.            gridCell.css('top', getPosTop(i,j));  
  7.            gridCell.css('left', getPosLeft(i,j));  
  8.          }
  9.   }  

 

2.12 定义getPosTop(i,j)和getPosLeft(i,j)函数

这个函数是为了获得每个小格子的top值和left值

使用两个getPosTop和getPosLeft,传入i和j计算出小格子的top和left值。

因为最上面的一个格子,top=20px ( padding=20px )

第二个格子,top:20+20+100 = 20 +120

第三个:20+2*(20+100)  

所以 top = 20 + i*120 ,与j无关

同理,left = 20 + j*120,与i无关

html+css+js适合前端小白的实战全解(超详细)——2048小游戏(一)

定义getPosTop(i,j)和getPosLeft(I,j),放在【support2048.js】里​​

 

  1. function getPosTop(i,j){  
  2.     return 20 + 120*i;  }  
  3.  
  4. function getPosLeft(i,j){  
  5.     return 20 + 120*j;  }  

 

此时,运行一下html,可以出现这个界面

html+css+js适合前端小白的实战全解(超详细)——2048小游戏(一)

 

像我第一次照着视频边敲边学的时候,对着敲的代码也能敲错

敲错了十分奔溃,不知道自己哪里出错了,金刚眼都难发现

此时附上这一小节的完整的代码,节约一些无助找自己答案哪里出错的时间

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>2048</title>
    <script type="text/javascript" src="jquery-3.4.1.min.js"></script>
    <script type="text/javascript" src="main2048.js"></script>
    <script type="text/javascript" src="showanimation2048.js"></script>
    <script type="text/javascript" src="support2048.js"></script>
    <link rel="stylesheet" type="text/css" href="2048.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>

 

css:

body{
    font-family: Arial;
}

header{
    display: block;
    margin: 0 auto;
    width: 500px;
    text-align: center;
}

header h1{
    font-size: 60px;
    font-weight: bold;
}

header #newgamebutton{
    display: block;
    margin: 20px auto;

    width: 100px;
    padding: 10px 10px;
    background-color: #8f7a66;
    color: #fff;

    border-radius: 10px;
    text-decoration: none;
}

header #newgamebutton:hover{
    background-color: #9f8b77;
}

header p{
    font-size: 25px;
    margin: 20px auto;
}


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

    margin: 50px auto;
    background-color: #bbada0;

    border-radius: 10px;
    position: relative;
    left: 0;
    top:0;
}

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

    position: absolute;
}

 

main2048.js

var board = new Array();
var score = 0;

$(document).ready(function() { 
    newgame();
 });

function newgame() { 

    // 1.初始化棋盘
    init();

    // 2.随机两个格子生成数字

  }

function init() { 
    for(var i = 0; i < 4; i++)
        for(var j = 0; j < 4; j++)
        {
            var gridCell = $("#grid-cell-"+i+"-"+j);
            gridCell.css('top', getPosTop(i,j));
            gridCell.css('left', getPosLeft(i,j));
        }
   }

 

support2048.js

function getPosTop(i,j){
    return 20 + i*120;
}
function getPosLeft(i,j){
    return 20 + j*120;
}

 

这一小节先到这里,本人也是小白一枚,有一些解释不清楚的地方,欢迎大家指正,谢谢~~

本文地址:https://blog.csdn.net/weixin_41306215/article/details/107594489