javascript实现2048⼩游戏
最近打算系统的学习⼀下javascript,想做点项⽬练⼿,就选择⽤javascript实现我⽐较喜欢玩的2048游戏,⼤体完成以后还是蛮有成就感的。(⽂末给出相关代码)
游戏相关截图:
主要实现的功能:
1.初始化时随机⽣成两个数字为2或4的格⼦
2.⽅块的移动和合并。根据移动后的值,改变⽅块的颜⾊和位置
3.判断在某个⽅向上是否可以移动。
4.在随机⽣成数字的时候判断16宫格中是否还有空间,有则⽣成下⼀块。
5.判输。需要满⾜条件 1.16宫格中没有空间⽣成新的格⼦。2.上下左右四个⽅向上⽆法移动同时满⾜两项条件则判输。
6.分数。任意两个格⼦合并后,新增分数为合并后格⼦的值。
7.⽐较重要的算法是判断每个格⼦移动到什么位置,应不应该合并。
使⽤的⽅法是:(以向左移动为例)先判断判断格⼦是否能够向左移动,如果可以,循环每⼀个格⼦。如果这个格⼦的值不为0,遍历格⼦左侧的元素,判断落脚的位置是否为空以及落脚位置的数字是否和本来的数字相等。如果落脚的位置为空 && 中间没有障碍物,更新样式,将落脚位置格⼦的值设
为移动格⼦的值,原格⼦值设为空。如果落脚位置的数字和本来的数字相等&& 中间没有障碍物,更新样式,将落脚位置格⼦的值设为移动格⼦值与落脚位置格⼦值相加后的值,原格⼦值设为空。
如果这样写的话有个问题是如果出现类似4 4 8 0  移动后会为16 0 0 0,我的解决办法是设定⼀个⼀样的4x4数组,每个格⼦初始值赋为0,相加过的格⼦赋值为1,合并的时候判断相应位置的数组值是否为0,若为0则合并,否则不合并,每次判断时每个格⼦值赋为0。
上⾯⼀堆话可能看着有点晕,下⾯我们具体来使⽤html/css/javascript实现2048
该项⽬的主要结构如下:
⾸先我们观察2048游戏的界⾯可以看到是有4X4的格⼦,我们很容易就想到⽤数组实现,不涉及功能,我们可以先把前端页⾯写出来,具体的细节我就不讲了,⼀看就懂的。
index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>⽹页版2048</title>
<link rel="stylesheet" type="text/css" href="css/index.css">
<script type="text/javascript"
src="libs.baidu/jquery/1.9.0/jquery.min.js"></script>
<script type="text/javascript"  src="js/support2048.js"></script>
<script type="text/javascript" src="js/showanimation2048.js"></script>
<script type="text/javascript" src="js/main2048.js"></script>
</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>
<div id="gameover">
GAME OVER
</div>
</body>
</html>
index.css
@CHARSET "UTF-8";
*{
padding: 0;
margin: 0;
}
header{
display:block;
margin:0 auto;
width:500px;
text-align:center;
}
header h1{
font-family:Arial, Helvetica, sans-serif;    font-size:60px;
font-weight:bold;
margin-top: 20px;
margin-bottom: 20px;
}
header #newgamebutton{
width:100px;
padding:10px;
background:#8f7a66;
font-family:Arial, Helvetica, sans-serif;    color:white;
border-radius:10px;
text-decoration:none;
}
header #newgamebutton:hover{
background:#9f8b77;
}
header p{
font-family:Arial, Helvetica, sans-serif;    font-size:25px;
margin:20px auto;
}
#grid-container{
width:460px;
height:460px;
padding:20px;
margin:40px auto;
background:#bbada0;
border-radius:10px;
position:relative;
}
.grid-cell{
width:100px;
height:100px;
border-radius:6px;
background:#ccc0b3;
position:absolute;
}
.number-cell{
width:100px;
height:100px;
border-radius:6px;
line-height:100px;
font:Arial, Helvetica, sans-serif;
font-size:50px;
font-weight:bold;
text-align: center;
position:absolute;
}
}
#gameover{
background-color:black;
color: white;
font-family:Arial, Helvetica, sans-serif;
font-size:60px;
position: absolute;
top:45%;
left:42%;
width:250px;
text-align:center;
display: none;
}
其中grid-cell是底部的⽆数字的⽩块,number-cell是后⾯移动的格⼦,gameover是游戏结束的提⽰,number-cell在后⾯初始化等操作中覆盖掉到grid-cell,gameover在游戏结束后显⽰。
写好了前端界⾯,主要的就是javascript的逻辑。
完成初始化的代码,⽣成随机数,确定样式等
var board = new Array();
var added = new Array();
var score = 0;
var top = 240;
$(document).ready(function(e){
newgame();
});
function newgame(){
//初始化棋盘格
init();
//在随机两个各⾃⽣成的数字
generateOneNumber();
generateOneNumber();
}
function init(){
score=0;
$("#gameover").css('display','none');
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));
}
}
for(var i = 0; i<4;i++){//初始化格⼦数组
board[i] = new Array();
for(var j = 0;j<4;j++){
board[i][j] = 0;
}
}
for(var i = 0; i<4;i++){//初始化判定合并的数组
added[i] = new Array();
for(var j = 0;j<4;j++){
added[i][j] = 0;
}
}
updateBoardView();//通知前端对board⼆位数组进⾏设定。
}
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 theNumberCell = $('#number-cell-'+i+'-'+j);
if(board[i][j] == 0){
theNumberCell.css('width','0px');
theNumberCell.css('height','0px');
theNumberCell.css('top',getPosTop(i,j));
theNumberCell.css('left',getPosLeft(i,j));
}else{
theNumberCell.css('width','100px');
theNumberCell.css('hegiht','100px');
theNumberCell.css('top',getPosTop(i,j));
theNumberCell.css('left',getPosLeft(i,j));
网页游戏小游戏//NumberCell覆盖
theNumberCell.css('background-color',getNumberBackgroundColor(board[i][j]));//返回背景⾊                theNumberCell.css('color',getNumberColor(board[i][j]));//返回前景⾊
<(board[i][j]);
}
}
}
}
function generateOneNumber(){//⽣成随机的格⼦
if (nospace(board))
return false;
//随机⼀个位置
var randx = parseInt(Math.floor(Math.random()*4));
var randy = parseInt(Math.floor(Math.random()*4));
while(true){
if (board[randx][randy] == 0)
break;
randx = parseInt(Math.floor(Math.random()*4));
randy = parseInt(Math.floor(Math.random()*4));
}
//随机⼀个数字
var randNumber = Math.random()<0.5 ? 2 : 4;
//在随机位置显⽰随机数字
board[randx][randy] = randNumber;
showNumberWithAnimation(randx,randy,randNumber);
return true;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。