纯JQ实现贪吃蛇

这次的实现还是使用table实现,移动蛇头还是纯色,那块想美化加四张图片添加url引用就行了,ok说说思路
最开始做的时候,
这次的实现还是使用table实现,移动蛇头还是纯色,那块想美化加四张图片添加url引用就行了,ok说说思路,
1: 初始化使用一个二维数组记录组成snake的所有td下标,然后默认向右移动,我这个默认是从左上角开始的
2: snake的移动还是使用interval,这个最好实现,设置500毫秒刷新一次就行了,
加分肉块(暂时先这么叫吧)直接使用一个生成随机数的方法,每次吃上就再次调用生成
3: snake的具体移动问题,规划到这块才发现这是最大的问题,开始想的是记录组成蛇身的每个表格td,然后在下次更新时候对所有下标做一个对应的操作,脑子里随便想了一幅心电图样子的爬行轨迹图,简直太复杂了.换个思路看能不能有简便的处理方式.
首先观察一下snake的特点,由于我是使用表格实现的,所以每次定时器刷新,snake的头部都会在对应方向增加一个格子,暂时先不用管方向问题,只要记得头部会增加一个格子,于此对应的是,尾部会减少一个格子,这样的话,看起来只要在interval里面每次加减头部就行了.然而还有一个问题,如果遇到加分肉块怎么处理——遇到加分块继续直走就说明这个加分块的下标就是snake所生成的头部,这样的话,尾部不做减少操作,头部继续增加,蛇身变长.此时刚才”吃”掉的加分块已经变成组成蛇身数组的一部分了,毫不影响后面的逻辑,
4: 方向,使用keydown捕捉四个方向键,然后对snake的头部生成下标做操作:
左:行不变,列减小,只适用于上下移动,向右移动,此按键不生效
上:行减小,列不变,只适用于左右自动,向下移动此按键不生效
右:行不变,列增加,…
下:行增加,列不变,…
5: "死亡"判定,暂设定为只能在表格内移动,不能左出右进或者右出坐进,所以新生成的行和列必须小于行数(方形表格),碰到蛇身也会死,这个直接使用生成头部下标和和组成蛇身的数组去遍历对比,有相等的就over清除interval
好了所有都准备妥当搬砖!
贴两张最终图
初始化
在这里插入图片描述
GameOver
在这里插入图片描述
14*14的看着挺有模有样的,8 *8的太猥琐了,ok贴码

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<link rel="stylesheet" href="../bootstrap-3.3.7/dist/css/bootstrap.min.css" />
	<script type="text/javascript" src="../js/jquery.min.js"></script>

	<body>
		<table id="tab" class="table table-bordered table-hover" style="width: 50%;">
			<tbody id="tb">
			</tbody>
		</table>
		<button id="reloadTb" class="btn btn-primary btn-block" style="width: 20%;">重置棋盘	</button>
	</body>
	<script type="text/javascript">
		var countRow = 8;//表格的行和列
		var direction = 3;//初始移动方向标识
		var hang = 0;
		var lie = 2;//初始snake头部下标
		var hangFlag = 0; //0,不变,1,增加,2,减小
		var lieFlag = 1;
		var score = 0;//分数
		let randomHang, randomLie;//随机数
		var a = [
			[0, 0],
			[0, 1],
			[0, 2]
		];
		//重置表格
		$("#reloadTb").click(function() {
			$("#tb").empty();
			createTable();
		})
		
		//初始化创建一个表格
		$(function() {
			createTable();
		})

        //500毫秒移动一次
		var interval = setInterval(function() {
			moveSnake();
		}, 500);

		function moveSnake() {
			var trArr = $("#tb").children();
			switch(hangFlag) { //判断按键
				case 0:
					hang;
					break;
				case 1:
					hang++;
					break;
				case 2:
					hang--;
				default:
					break;
			}
			switch(lieFlag) { //判断按键
				case 0:
					lie;
					break;
				case 1:
					lie++;
					break;
				case 2:
					lie--;
				default:
					break;
			}
			var newArr = [hang, lie];
			var flag = (hang < countRow) && (hang >= 0) &&
				(lie < countRow) && (lie >= 0);
			if(!flag) {
				clearInterval(interval);
				console.log("游戏结束");
				alert("总分 : " + score + " 分");
				return;
			}
			//撞到身体也停止
			var flag = false;
			for(let i = 0; i < a.length; i++) {
				if((hang == a[i][0]) && (lie == a[i][1])) {
					console.log("游戏结束");
					alert("总分 : " + score + " 分");
					clearInterval(interval);
					break;
				}
			}
			//头部增加
			trArr.eq(newArr[0]).find("td").eq(newArr[1]).css("background-color", "black"); //一直加
			a.push(newArr);
			//console.log(hang + "  " + lie + "  随机  " + randomHang + "   " + randomLie);
			if((hang == randomHang) && (lie == randomLie)) { //吃上了加分
				score++;
				createRamdom(trArr); //继续创建
			} else {//没吃上减少尾部
				trArr.eq(a[0][0]).find("td").eq(a[0][1]).css("background-color", "#FDF5E6");
				a.splice(0, 1);
			}
		}

		var createTable = function() {
			for(let i = 0; i < countRow; i++) {
				let tr = $("<tr></tr>");
				for(var j = 0; j < countRow; j++) {
					let td = $("<td style='background-color: #FDF5E6;'></td>");
					td.css("height", "40px");
					td.css("width", "40px");
					tr.append(td);
				}
				$("#tb").append(tr);
			}
			var trArr = $("#tb").children();
			//初始化创建蛇身部位
			for(var i = 0; i < a.length; i++) {
				var td = trArr.eq(a[i][0]).find("td").eq(a[i][1]);
				td.css("background-color", "black");
			}
			createRamdom(trArr); //创建随机加分块
		}

		var createRamdom = function(trArr) { //生成数在表格内
			let flag = true;
			//生成原则是不能在蛇身上,目前使用颜色所判断,这样可能效率有点低,后期再修正
			while(flag) {
				var tempHang = Math.round(Math.random() * (countRow - 1));
				var tempLie = Math.round(Math.random() * (countRow - 1));
				var color = trArr.eq(tempHang).find("td").eq(tempLie).css("background-color");
				if(color != "black") {
					randomHang = tempHang;
					randomLie = tempLie;
					trArr.eq(randomHang).find("td").eq(randomLie).css("background-color", "black");
					flag = false;
				}
			}
		}

		$(document).keydown(function(event) {
			var keyNum = event.which; //获取键值
			switch(keyNum) { //判断按键
				case 37: //右行不能左拐
					if(direction != 3) {
						hangFlag = 0;
						lieFlag = 2;
						direction = 1;
					}
					break;
				case 38: //下行不能上拐
					if(direction != 4) {
						hangFlag = 2;
						lieFlag = 0;
						direction = 2;
					}
					break;
				case 39: //右行不能左拐
					if(direction != 1) {
						hangFlag = 0;
						lieFlag = 1;
						direction = 3;
					}
					break;
				case 40: //下行不能上拐
					if(direction != 2) {
						hangFlag = 1;
						lieFlag = 0;
						direction = 4;
					}
					break;
				default:
					break;
			}
		});
	</script>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值