JS小游戏 贪食蛇v1.0

程序设计步骤

1、设计格子生成函数。这是一个通用的生成函数,可以自己输入行,列,单元格高度。每个单元格是一个div。结合CSS代码的调整可以生成各种大小和宽窄的地面。

2、生成一条蛇。采用一个数组表示蛇,每个元素是一个div,可以通过id值获取元素的行、列属性。

3、检测方向按键

4、设计判断下一步位置的函数。在这个函数中,首先判断有没有撞,如果没有撞则判断下一步的位置并且改变蛇的形状。这时候有两种情况,第一种是没有吃到食物,在蛇的数组前加入新元素,将蛇尾的元素删除;另一种情况是吃到了食物,这时候只添加新元素,还要生成新的食物。

5、通过setInterval调用上一步中的函数


程序代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<style type="text/css">
/*需要调整的内容有.inner的font-size,line-height*/
.inner {width:29px;height:29px;
	float:left;display:inline;
	font-size:20px;line-height:20px;text-align:center;font-weight:bold;color:#F00;
	border-top:1px solid black;
	border-left:1px solid black;
}

#outside{
	padding:0;
	float:left;
	border-right:1px solid black;
	border-bottom:1px solid black;
}
.clearFix:after{
	clear:both;
	display:block;
	visibility:hidden;
	height:0;
	content:"";
}
.clearFix{zoom:1;}
</style>
<script type="text/javascript">
var foodR = -1;//食物坐标
var foodC = -1;
var dir = 0;
window.onload = function(){
	var r = 15;//行数
	var c = 20;//列数
	var w = 18;//单元格宽度
	var cell = createCell(r,c,w);//创建格子,行,列,单元格宽度。这个格子是一个二维数组
	var snake = new Array();//创建蛇。这个蛇是一个一维数组
	for(var i=0;i<3;i++)//初始化蛇
	{
		snake[i] = cell[0][3-i];
		snake[i].innerText="*";
	}
	document.onkeydown = function()//检测当前方向按键
	{
		dir = changeDir(this);
	}
	generateFood(cell);//生成食物
	setInterval(function(){checkDir(cell,snake);},200);  //检测当前前进方向并前进。在setInterval中不能直接传入参数,需要采用function进行函数调用
}
function generateFood(cell)//生成食物
{	
	do{
		foodR = Math.floor(Math.random()*cell.length);//根据格子的总数量生成
		foodC = Math.floor(Math.random()*cell[0].length);
	}while(cell[foodR][foodC].innerText == "*")//食物不能和蛇重合
	cell[foodR][foodC].innerText = "○";//画出食物
}

function changeDir(e)//检测当前方向按键
{
	if(event.keyCode>=37&&event.keyCode<=40)//如何按键是方向键,返回按键码
		return event.keyCode;
}
function checkDir(cell,snake)//检测当前前进方向并前进
{
	if(dir>=37&&dir<=40)//初始化的时候,按下任意方向键开始运行
	{
		var nextNode = new Array(2);//下一步的坐标
		nextNode = getNext(dir,cell,snake);//获取下一步坐标
		if(nextNode[0]!=-1&&nextNode[1]!=-1&&nextNode[0]!=cell.length&&nextNode[1]!=cell[0].length&&cell[nextNode[0]][nextNode[1]].innerText!="*")
		//如果没有撞到边上,也没有撞到自己,继续前进.cell.length行数,cell[0].length列数
		{
			snake.unshift(cell[nextNode[0]][nextNode[1]]);//在最前面添加一截
			snake[0].innerText="*";
			if(nextNode[0]==foodR&&nextNode[1]==foodC)//如果吃到食物,生成新的食物
			{	generateFood(cell);}
			else
			{	snake.pop().innerText="";}//如果没吃到食物,将最后一截去掉
			for(var i = 0;i<snake.length;i++)//设置颜色
			{
				switch(i)
				{
					case 0:
						snake[i].style.color="#F00";
						break;
					case 1:
						snake[i].style.color="#F11";
						break;
					case 2:
						snake[i].style.color="#F22";
						break;
					case 3:
						snake[i].style.color="#F33";
						break;
					case 4:
						snake[i].style.color="#F44";
						break;
					default:
						snake[i].style.color="#F55";
						break;
				}
			}
		}
		else  //如果撞了,刷新页面
		{	alert("撞了");
			window.location.reload();
		}
	}
}
function getNext(dir,cell,snake)//获取下一步坐标
{
	var nextNode = new Array(2);
	nextNode[0] = getRow(snake[0]);//获取当前行
	nextNode[1] = getCol(snake[0]);//获取当前列
	switch(dir)//根据方向不同前进
	{
		case 37: //左
			nextNode[1]--;
			break;
		case 38: //上
			nextNode[0]--;
			break;
		case 39: //右
			nextNode[1]++;
			break;
		case 40:
			nextNode[0]++;
			break;
		default:
			break;
	}
	return (nextNode);//返回下一步的行和列
}
function createCell(row,col,wid)//创建格子。内部小格子显示左,上边框;外部大个子显示右,下边框
{
	//box.style.width = row*30+"px";
	
	var i = 0;
	var j = 0;
	var box = document.getElementById("outside");//设置外部格子宽高
	box.style.width = col*(wid+1)+"px";
	box.style.height = row*(wid+1)+"px";
	var cell = new Array();
	for(i=0;i<row;i++)//创建内部格子
	{
		cell[i] = new Array();
		for(j=0;j<col;j++)
		{
			//alert("in:r"+i+"c"+j);
			cell[i][j] = document.createElement("div");
			cell[i][j].style.width = wid+"px";//设置宽度
			cell[i][j].style.height = wid+"px";//设置高度
			cell[i][j].className = "inner";//设置class
			cell[i][j].name = "inner";
			cell[i][j].id = "r"+i+"c"+j;//设置id
			box.appendChild(cell[i][j]);//加入结点
		}
		
	}
	return cell;
}
function getRow(cell)//获得当前格子的行
{
	var r = String(cell.id.match(/r[0-9]*/));//截取id的r及数字部分
	var rID = r.substr(1);//截取r后面的数字
	return(rID);
}
function getCol(cell)//获得当前格子的列
{
	var c = cell.id.indexOf("c");//占到id中c的位置
	var cID = cell.id.substr(c+1);//截取c后面的数字
	return(cID);
}
</script>
</head>
<body>
<div id="outside" class="clearFix"></div>
<div id="mess"></div>
</body>
</html>


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值