2048小游戏

在学习完了闭包原型链之后就开始进行2048小游戏的制作

游戏代码思想

这个小游戏要通过控制键盘上的上下左右键 来实现界面上的数字挪动和相加,整体分为三部分,html、css和js,其主要是通过js来实现功能

HTML部分

要注意在html页面插入链接时 尽量把css链接放在头部,js链接放在尾部

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>2048</title>
	//插入的css文件
	<link rel="stylesheet" type="text/css" href="2048css.css">
</head>
<body>
	<div id="outer">
	//头部存放分数,分数的数字后面要用js控制所以给一个id
		<div class="heater">
			<span>SCORE:</span>
			<span class="score01" id="score01">0</span>
		</div>
		//2048中的16个格子
		<div class="main">
			<div class="cell" id="c00"></div>
			<div class="cell" id="c01"></div>
			<div class="cell" id="c02"></div>
			<div class="cell" id="c03"></div>

			<div class="cell" id="c10"></div>
			<div class="cell" id="c11"></div>
			<div class="cell" id="c12"></div>
			<div class="cell" id="c13"></div>

			<div class="cell" id="c20"></div>
			<div class="cell" id="c21"></div>
			<div class="cell" id="c22"></div>
			<div class="cell" id="c23"></div>

			<div class="cell" id="c30"></div>
			<div class="cell" id="c31"></div>
			<div class="cell" id="c32"></div>
			<div class="cell" id="c33"></div>
		</div>
		//游戏结束之后的遮蔽层
		<div class="gameover" id="gameover">
			<p>
				GAME OVER!!<br/>
				SCORE:<span class="score02" id="score02">0</span><br/>
				<a href="javascript:game.start()" class="replay">重新开始</a>
			</p>
		</div>
	</div>
	<script src="2048.js"></script>
</body>
</html>

上面遮蔽层的作用是使用户不能再操作页面了,只能选择遮蔽层上面的操作

css部分

#outer{
	width: 700px;
	height:800px;
	padding-top: 425px;
	margin:auto;
	border-radius: 10px;
	font-size: 60px;
	font-weight: bold;
	margin-top: 100px;
	font-family: Arial;
	
}
.heater{
	width: 500px;
	height: 70px;
	line-height: 70px;
	padding-top: 50px;
}
.score01{
	color: red;
	
}
.main{
	width: 700px;
	height: 700px;
	background-color: #bbada0;
	border-radius: 10px;
}
.cell{
	width: 150px;
	height: 150px;
	background-color: #ccc0b3;
	float:left;
	margin: 20px 0 0 20px;
	border-radius: 10px;
	line-height: 150px;
	font-size: 60px;
	text-align: center;
}
/*遮蔽层的样式*/
.gameover{
	display: none;
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	background-color: rgba(55,55,55,0.4);
}
.gameover>p{
	width: 400px;
	height: 200px;
	position: absolute;
	top: 50%;
	left: 50%;
	text-align: center;
	line-height: 60px;
	/*因为p的中心是按照框的左上角所以要再减去框的一半*/
	margin-left: -200px;
	margin-top: -100px;
	border-radius: 10px;
	background-color: #fff;
	font-size: 30px;
}
.gameover>p>a{
	display: inline-block;
	width: 150px;
	height: 50px;
	background-color: #9f8d77;
	color: #fff;
	text-decoration: none;
	line-height: 50px;
}
/*每个数字的方块的样式*/
.n2{
	background-color:#eee3da;
	color:#776e65;
}
.n4{
  	background-color:#ede0c8;
  	color:#776e65;
}
.n8{
  	background-color:#f2b179;
  	color: #fff;
}
.n16{
  	background-color:#f59563;
  	color: #fff;
}
.n32{
  	background-color:#f67c5f;
  	color: #fff;
}
.n64{
  	background-color:#f65e3b;
  	color: #fff;
}
.n128{
  	background-color:#edcf72;
  	color: #fff;
}
.n256{
  	background-color:#edcc61;
  	color: #fff;
}
.n512{
  	background-color:#9c0;
  	color: #fff;
}
.n1024{
  	background-color:#33b5e5;
  	font-size:40px;
  	color: #fff;
}
.n2048{
  	background-color:#09c;
  	font-size:40px;
  	color: #fff;
}
.n4069{
  	background-color:#a6c;
  	font-size:40px;
  	color: #fff;
}
.n8192{
  	background-color:#93c;
  	font-size:40px;
  	color: #fff;
}

JS部分

因为这个项目本来就是靠js来运作的,所以我们首先要创建游戏对象,然后通过属性 方法来完成。我们首先先把游戏开始和游戏结束方法写出来。游戏开始要先随机生成两个随机格子的2和4,并把它显示在页面上。游戏结束则是判断所有的格子已经满了,并没有格子可以给随机生成的了,则会出现遮蔽层并显示游戏结束。

var game = {
	data: [],
	score:0,
	gamerunning:1,
	gameover:0,
	status:1,
	//开始的方法
	start:function(){
		this.status = this.gamerunning;
		this.score = 0;
		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.view();
		console.log(this.data)
	},
	//生成随机数的方法
	randomNum:function(){
		//设定一个死循环 让它一直生成两个随机数,直到满足if的条件则跳出
		for(;;){
			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.25?2:4;//2跟4的比例是4:1
				this.data[r][c] = num;
				break;
			}
		}
	},
	//页面显示的方法
	view:function(){
	//通过循环行和列动态获取每个格子
		for(var r=0;r<4;r++){
			for(var c=0;c<4;c++){
				var div = document.getElementById("c" + r+c);
				if(this.data[r][c] == 0){
					div.innerHTML = "";
					div.className = "cell";
				}else{
					div.innerHTML = this.data[r][c];
					div.className = "cell n" + this.data[r][c];
				}
				document.getElementById("score01").innerHTML = this.score;
				//游戏结束时页面的显示
				if(this.status == this.gameover){
					document.getElementById("score02").innerHTML = this.score;
					document.getElementById("gameover").style.display = "block";
				}else{
					document.getElementById("gameover").style.display = "none"
				}
			}
		}
	},
	//游戏结束的方法
	isgameover:function(){
	//循环行和列判断是否还有空的格子
		for(var r = 0;r<4;r++){
			for(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 before = String(this.data);
		for(var r = 0;r<4;r++){
			this.moveLeftInRow(r);
		}
		// 保存移动后的状态
		var after = String(this.data)
		if(before != after){
			this.randomNum();
			if(this.isgameover()){
				this.status = this.gameover;
			}
			this.view();
		}
	},
	moveLeftInRow:function(r){
		for(var c=0;c<3;c++){
			var nextc = this.getNextInRow(r,c);
			if(nextc != -1){
				if(this.data[r][c] == 0){
				//将不为空的数据与前面为空的数据交换
					this.data[r][c] = this.data[r][nextc];
					//交换完成后赋值为0
					this.data[r][nextc] = 0;
					c--;
					//如果前面的数据等于后面的数据,则相加,并将后面的数据赋值为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++){
			if(this.data[r][i] != 0){
				return i;
			}
		}
		return -1;
	},

上面就是控制左移的方法,同理就可以写出右移和上下移动,就不在这里展示了,下面就是怎么控制键盘上的方向键来移动方块

document.onkeydown = function(event){
	var event = event || e || arguments[0];
	if(event.keyCode == 37){
		game.moveLeft();
	}
	if (event.keyCode == 39) {
		game.moveRight();
	}
	if (event.keyCode == 38) {
		game.moveUp();
	}
	if (event.keyCode == 40) {
		game.moveDown();
	}
}

键盘上的方向键有他固定的keyCode码,添加一个键盘事件,把每个键盘要执行的方法写进去就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值