2048小游戏,代码奉上!!!界面有点丑,但代码绝对没问题!

***版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Shan_Cb/article/details/83350856 ***

在里插入图片描述

网页代码:

<!DOCTYPE html>
<html>
  <head>
    <title>Game2048.html</title>
	
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
	<script src="js/jquery-1.11.0.min.js"></script>
	<script src="js/game-main.js"></script>
	<style type="text/css">
	.class-div-w{
		width: 400px;
		height: 400px;
		position:absolute;
		left:35%;
		top:15%;
		background:url(img/bg.png);
		background-size: cover;
	} 
	.class-img-ele{
		width: 90px;
		height: 90px;
		background: #ccaaff;
		margin: 5px;
	}
	.titlediv{
		width:200px;
		text-align:center;
		background-color:white;
	}
	#g2048{
		background-image: linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%);
	}
	</style>
  </head>
  
  <body id="g2048">
	<div id="titlediv">
		<h1>GAME&nbsp;:&nbsp;2048</h1>
		<h3 id="score">SCORE&nbsp;:&nbsp;0</h3>
	</div>
  	<div class="class-div-w">
		<img class="class-img-ele" style="position:absolute;left:0px;top:0px" id="i11"/>
		<img class="class-img-ele" style="position:absolute;left:100px;top:0px" id="i12"/>
		<img class="class-img-ele" style="position:absolute;left:200px;top:0px" id="i13"/>	
		<img class="class-img-ele" style="position:absolute;left:300px;top:0px" id="i14"/>	
		
		<br>
		<img class="class-img-ele" style="position:absolute;left:0px;top:100px" id="i21"/>
		<img class="class-img-ele" style="position:absolute;left:100px;top:100px" id="i22"/>
		<img class="class-img-ele" style="position:absolute;left:200px;top:100px" id="i23"/>
		<img class="class-img-ele" style="position:absolute;left:300px;top:100px" id="i24"/>

		<br>
		<img class="class-img-ele" style="position:absolute;left:0px;top:200px" id="i31"/>
		<img class="class-img-ele" style="position:absolute;left:100px;top:200px" id="i32"/>
		<img class="class-img-ele" style="position:absolute;left:200px;top:200px" id="i33"/>
		<img class="class-img-ele" style="position:absolute;left:300px;top:200px" id="i34"/>
		
		<br>
		<img class="class-img-ele" style="position:absolute;left:0px;top:300px" id="i41"/>
		<img class="class-img-ele" style="position:absolute;left:100px;top:300px" id="i42"/>
		<img class="class-img-ele" style="position:absolute;left:200px;top:300px" id="i43"/>
		<img class="class-img-ele" style="position:absolute;left:300px;top:300px" id="i44"/>	
	</div>
  </body>
</html>

JavaScript代码:game-main.js

var gamescore=0;
var gamesum=0;
$(function(){
	var imgs=[[11,12,13,14],[21,22,23,24],[31,32,33,34],[41,42,43,44]];
	var n=[[ 0, 0, 0, 0 ],[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ]];
	var m=0;
	//游戏开始的时候生成两个数字(2/4中随机)
	while(m<2){
		var x=Math.floor(Math.random()*4);
		var y=Math.floor(Math.random()*4);
		if(n[x][y]==0) {
			var rnum=Math.floor(Math.random()*20);
			n[x][y] = rnum < 1 ? 4 : 2;
			$("#i"+imgs[x][y]).attr("src","img/i"+n[x][y]+".png");
			m++;
		}
	}
	var isend=false;
	$("#g2048").keydown(function(){
		/*设置ismove开关,用来判断是否进行了移动,
		如果没有移动,就不生成新的数字,如果移动了,
		就调用随机数方法,在空白处生成新的数字*/
		var ismove;
		/*获取用户的按键,如果按的是方向键,就执行
		响应的移动操作*/
		var keyid=event.keyCode;
		if(keyid==38){
			ismove=up(imgs, n);
		}
		else if(keyid==40){
			ismove=down(imgs, n);
		}
		else if(keyid==37){
			ismove=left(imgs, n);
		}
		else if(keyid==39){
			ismove=right(imgs, n);
		}
		/*该变量记录用户的分数*/
		gamescore+=gamesum;
		/*该变量记录每次移动获得的分数*/
		gamesum=0;
		/*将总分数显示到页面上*/
		$("#score").html("SCORE&nbsp;:&nbsp;"+gamescore);
		/*判断游戏结束的入口,如果没有移动就进入游戏结束的判断中*/
		if(ismove==false){
			/*游戏结束的判断:调用fun_end(数组),方法
			判断依据:如果4X4方格上没有空余的位置,
			且每个相邻的数字间的数字均不相等,
			且当前方格中不存在2048的值,显示游戏结束*/
			isend=fun_end(n);
			/*返回值为-1,证明游戏结束*/
			if(isend==-1){
				if(confirm("游戏结束,是否开始下一局")){
					location.reload();
				}
			/*返回值为2,证明游戏胜利*/
			}else if(isend==2){
				if(confirm("恭喜你,游戏胜利")){
					location.reload();
				}
			}
			return;
		}
		/*调用随机数方法,在方格的空白处生成2或4的随机数*/
		setRandom(imgs,n);
	});
});

function up(imgs,n){
	var ismove=false;
	for (var i = 0; i < n.length; i++) {
		//执行相同数字相加的操作
		//isnot0用来记录已经读取到的最后一个不为0的值的位置,同时记录数据读取的位置
		var isnot0=0;
		for (var j = 0; j < n.length; j++) {
			//判断当前读到的数字是否为0,如果是0,就跳出本次循环,进入下一次循环
			if(n[j][i]==0){
				continue;
			}else{
				/*如果isnot0的位置的值与当前读取到的值相等,且isnot0和j不相等,
				执行相加操作,并将当前读取到的下标中的值置为0,同时将判断
				是否移动的开关设置为true*/
				if(n[j][i] == n[isnot0][i] && j!=isnot0){
					n[j][i]=0;
					gamesum+=n[isnot0][i];
					n[isnot0][i]*=2;
					ismove=true;
				}
				/*将isnot0的记录的位置设置为当前读取的值在数组中的下标*/
				isnot0=j;
			}
		}
		//将数字的位置移动
		//记录当前数组该列中的值为0的下标
		var is0=0;
		for (var j = 0; j < n.length; j++) {
			//
			if(n[j][i]==0){
				//设置图片
				$("#i"+imgs[j][i]).attr("src","img/i0.png");
				continue;
			}else{
				/*如果is0记录的值与当前读取数组的下标的值相等或者两者记录的均不为0,就设置相应的图片,
				并将is0记录的位置+1*/
				if(is0==j || (n[j][i]!=0 && n[is0][i]!=0)){
					$("#i"+imgs[is0][i]).attr("src","img/i"+n[is0][i]+".png");
					is0++;
					continue;
				}
				//图片移动动画效果
				$("#i"+imgs[j][i]).css("z-index",10);
				$("#i"+imgs[j][i]).animate({top:"-="+((j-is0)*100)+""},80);
				$("#i"+imgs[is0][i]).animate({top:"+="+((j-is0)*100)+""},0);
				$("#i"+imgs[j][i]).attr("src","img/i"+n[j][i]+".png");
				$("#i"+imgs[is0][i]).attr("src","img/i0.png");
				$("#i"+imgs[is0][i]).css("z-index",1);
				var imgval=imgs[j][i];
				imgs[j][i]=imgs[is0][i];
				imgs[is0][i]=imgval;

				n[is0][i]=n[j][i];
				n[j][i]=0;
				is0++;
				ismove=true;
			}
		}
	}
	return ismove;
}
function down(imgs,n){
	var ismove=false;
	for (var i = 0; i < n.length; i++) {
		//执行相同数字相加的操作
		var isnot0=n.length-1;
		for (var j = n.length-1; j >= 0; j--) {
			if(n[j][i]==0){
				continue;
			}else{
				if(n[j][i] == n[isnot0][i] && j!=isnot0){
					n[j][i]=0;
					gamesum+=n[isnot0][i];
					n[isnot0][i]*=2;
					ismove=true;
				}
				isnot0=j;
			}
		}
		//将数字的位置移动
		var is0=n.length-1;
		for (var j = n.length-1; j >= 0; j--) {
			if(n[j][i]==0){
				$("#i"+imgs[j][i]).attr("src","img/i0.png");
				continue;
			}else{
				if(is0==j || (n[j][i]!=0 && n[is0][i]!=0)){
					$("#i"+imgs[is0][i]).attr("src","img/i"+n[is0][i]+".png");
					is0--;
					continue;
				}
				$("#i"+imgs[j][i]).css("z-index",10);
				$("#i"+imgs[j][i]).animate({top:"-="+((j-is0)*100)+""},80);
				$("#i"+imgs[is0][i]).animate({top:"+="+((j-is0)*100)+""},0);
				$("#i"+imgs[j][i]).attr("src","img/i"+n[j][i]+".png");
				$("#i"+imgs[is0][i]).attr("src","img/i0.png");
				$("#i"+imgs[is0][i]).css("z-index",1);
				var imgval=imgs[j][i];
				imgs[j][i]=imgs[is0][i];
				imgs[is0][i]=imgval;

				n[is0][i]=n[j][i];
				n[j][i]=0;
				is0--;
				ismove=true;
			}
		}
	}
	return ismove;
}
function left(imgs,n){
	var ismove=false;
	for (var i = 0; i < n.length; i++) {
		//执行相同数字相加的操作
		var isnot0=0;
		for (var j = 0; j < n.length; j++) {
			if(n[i][j]==0){
				continue;
			}else{
				if(n[i][j] == n[i][isnot0] && j!=isnot0){
					n[i][j]=0;
					gamesum+=n[i][isnot0];
					n[i][isnot0]*=2;
					ismove=true;
				}
				isnot0=j;
			}
		}
		//将数字的位置移动
		var is0=0;
		for (var j = 0; j < n.length; j++) {
			if(n[i][j]==0){
				$("#i"+imgs[i][j]).attr("src","img/i0.png");
				continue;
			}else{
				if(is0==j || (n[i][j]!=0 && n[i][is0]!=0)){
					$("#i"+imgs[i][is0]).attr("src","img/i"+n[i][is0]+".png");
					is0++;
					continue;
				}
				$("#i"+imgs[j][i]).css("z-index",10);
				$("#i"+imgs[i][j]).animate({left:"-="+((j-is0)*100)+""},80);
				$("#i"+imgs[i][is0]).animate({left:"+="+((j-is0)*100)+""},0);
				$("#i"+imgs[i][j]).attr("src","img/i"+n[i][j]+".png");
				$("#i"+imgs[i][is0]).attr("src","img/i0.png");
				$("#i"+imgs[i][is0]).css("z-index",1);
				var imgval=imgs[i][j];
				imgs[i][j]=imgs[i][is0];
				imgs[i][is0]=imgval;

				n[i][is0]=n[i][j];
				n[i][j]=0;
				is0++;
				ismove=true;
			}
		}
	}
	return ismove;
}
function right(imgs,n){
	var ismove=false;
	for (var i = 0; i < n.length; i++) {
		//执行相同数字相加的操作
		var isnot0=n.length-1;
		for (var j = n.length-1; j >= 0; j--) {
			if(n[i][j]==0){
				continue;
			}else{
				if(n[i][j] == n[i][isnot0] && j!=isnot0){
					n[i][j]=0;
					gamesum+=n[i][isnot0];
					n[i][isnot0]*=2;
					ismove=true;
				}
				isnot0=j;
			}
		}
		//将数字的位置移动
		var is0=n.length-1;
		for (var j = n.length-1; j >= 0; j--) {
			if(n[i][j]==0){
				$("#i"+imgs[i][j]).attr("src","img/i0.png");
				continue;
			}else{
				if(is0==j || (n[i][j]!=0 && n[i][is0]!=0)){
					$("#i"+imgs[i][is0]).attr("src","img/i"+n[i][is0]+".png");
					is0--;
					continue;
				}
				$("#i"+imgs[j][i]).css("z-index",10);
				$("#i"+imgs[i][j]).animate({left:"-="+((j-is0)*100)+""},80);
				$("#i"+imgs[i][is0]).animate({left:"+="+((j-is0)*100)+""},0);
				$("#i"+imgs[i][j]).attr("src","img/i"+n[i][j]+".png");
				$("#i"+imgs[i][is0]).attr("src","img/i0.png");
				$("#i"+imgs[i][is0]).css("z-index",1);
				var imgval=imgs[i][j];
				imgs[i][j]=imgs[i][is0];
				imgs[i][is0]=imgval;

				n[i][is0]=n[i][j];
				n[i][j]=0;
				is0--;
				ismove=true;
			}
		}
	}
	return ismove;
}

function setRandom(imgs,n){
	var m=0;
	var sum=0;
	while(m<1){
		var x=Math.floor(Math.random()*4);
		var y=Math.floor(Math.random()*4);
		if(n[x][y]==0){
			var rnum=Math.floor(Math.random()*20);
			n[x][y] = rnum < 1 ? 4 : 2;
			$("#i"+imgs[x][y]).attr("src","img/i"+n[x][y]+".png");
			m++;
		}
	}
}

function fun_end(n){
	var isfull=-1;
	for(var i=0;i<n.length;i++){
		for(var j=0;j<n.length;j++){
			if(n[i][j]==2048){
				return 2;
			}
			if(n[i][j]==0){
				isfull=0;
			}
		}
	}

	if(isfull==-1){
		for(var i=0;i<n.length-1;i++){
			for(var j=0;j<n.length-1;j++){
				if(n[i][j]==n[i+1][j] || n[i][j]==n[i][j+1]){
					return 0;
				}
				if((i==2 && n[i+1][j]==n[i+1][j+1]) || (j==2 && n[i][j+1]==n[i+1][j+1])){
					return 0;
				}
			}
		}
	}
	return isfull;
}

最后还使用了一个jquery的jquery-1.11.0.min.js包,读者可以自行百度一下!
写的代码备注很详细,希望读者能够理解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值