昨晚睡前突然想用JS写一个贪吃蛇的程序。下午没什么事,于是就动笔了。不够熟练,花了两小时,更惭愧的是还有点问题,就是从吃第二个食物开始蛇的长度就不会增加了。整条蛇是一个对象数组,测试时发现数组的长度是正确的,只是保存的坐标有误,然未能想到怎么修正。
过了一天,晚上重新拿出来看,突然想到了是哪的问题。现将代码分享如下:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>贪吃蛇</title>
<style>
.tb

...{
font-size:9px;
}
</style>
</head>

<body>
<table border="0" bgcolor="#CEE0F9" cellpadding="0" cellspacing="1" align="center" class="tb">
<%
response.Write("<tr><td></td>")
for i=10 to 34
response.Write("<td height='10px' width='10px' bgcolor='white' align='center'>"&i&"</td>"&chr(13))
next
for i=10 to 34
response.Write("<tr><td height='10px' width='10px' bgcolor='white' align='center'>"&i&"</td>"&chr(13))
for j=10 to 34
response.Write("<td height='10px' width='10px' bgcolor='white' id='bg"&i&j&"'></td>"&chr(13))
next
response.Write("</tr>"&chr(13))
next
%>
<tr><td align="center" colspan="25" style="font-size:12px;" valign="middle">请选择难度:<select name="level" onChange="setlevel();"><option value="400">一般</option><option value="250">中等</option><option value="150">疯狂</option></select>
上:W 下:S 左:A 右:D </td></tr>
<tr><td colspan="25" align="center"><input type="button" value="开始" onClick="javascript:play();" name="playnow"></td></tr>
</table>
<div id="test" style="font-size:12px;"></div>
</body>
<script language="javascript">
var Time=350,sco=100,FlagTemp="";

function snakecell(fx,fy) //定义蛇的结点

...{
var snakecell = new Object();
snakecell.cellx = fx; //结点的横坐标
snakecell.celly = fy; //结点的纵坐标
return snakecell;
}
var score = 0; //得分
var Snake = new Array();
var MoveFlag = ""; //定义行走方向,为空表示不行走

function createpoint() //随机生成小于25大于9的整数

...{
var suc=false;
while(!suc)

...{
var number = Math.floor(Math.random()*35);
if(number>9)
suc=true;
}
return number;
}
function checkfood(foodx,foody) //检测食物是否与snake的位置重叠并且坐标有效

...{
if(foodx<10||foodx>34||foody<10||foody>34) //如果超出边界
return false;
else

...{
for(var i=0;i<Snake.length;i++)

...{
if(foodx==Snake[i].cellx&&foody==Snake[i].celly) //如果坐标值与某个元素的坐标值一致
return false;
}
return true;
}
}
function createfood() //随机生成食物,以蓝色显示

...{
var i=-1;
var j=-1;
while(!checkfood(i,j))

...{
i=createpoint();
j=createpoint();
}
document.getElementById("bg"+i+j).style.backgroundColor="blue";
}
function createsnakehead() //创建蛇

...{
Snake[0]=snakecell();
Snake[0].cellx=createpoint();
Snake[0].celly=createpoint();
showsnake();
}
function ManageSnake() //控制这条蛇

...{
if(MoveFlag=="") //如果标志为空表示暂停
return;
if(MoveFlag=="up") //向上移

...{
if(Snake[0].cellx==10)
MoveSnake(34,Snake[0].celly%35);
else
MoveSnake((Snake[0].cellx-1)%35,Snake[0].celly%35);
}
if(MoveFlag=="down")

...{
if(Snake[0].cellx==34)
MoveSnake(10,Snake[0].celly%35);
else
MoveSnake((Snake[0].cellx+1)%35,Snake[0].celly%35);
}
if(MoveFlag=="left")

...{
if(Snake[0].celly==10)
MoveSnake((Snake[0].cellx)%35,34);
else
MoveSnake((Snake[0].cellx)%35,(Snake[0].celly-1)%35);
}
if(MoveFlag=="right")

...{
if(Snake[0].celly==34)
MoveSnake((Snake[0].cellx)%35,10);
else
MoveSnake((Snake[0].cellx)%35,(Snake[0].celly+1)%35);
}
showsnake();
}
function MoveSnake(hx,hy) //移动这条蛇

...{
var headx=hx;
var heady=hy;
// alert(headx+" "+heady);
var endx=Snake[Snake.length-1].cellx;
var endy=Snake[Snake.length-1].celly;
if(document.getElementById("bg"+headx+heady).style.backgroundColor=="blue") //如果是食物

...{
for(var step=Snake.length-1;step>0;step--) //从第二个蛇结点起把前一结点的x,y坐标赋给自身

...{
Snake[step].cellx=Snake[step-1].cellx;
Snake[step].celly=Snake[step-1].celly;
}
Snake[0].cellx=headx; //将蛇头位置探前一步
Snake[0].celly=heady;
Snake[Snake.length]=snakecell(endx,endy); //增加一个蛇结点,位于尾部
createfood(); //创建一个食物
score=score+sco; //加单位分数
}
else

...{
if(document.getElementById("bg"+headx+heady).style.backgroundColor=="red") //如果是蛇的某一部位

...{
MoveFlag=""; //停止前进
document.all.level.disabled="";
// document.all.playnow.value="重来";
alert("你的得分是"+score);
return;
}
else

...{
for(var step=Snake.length-1;step>0;step--) //从最后一个蛇结点起把前一结点的x,y坐标赋给自身

...{
Snake[step].cellx=Snake[step-1].cellx;
Snake[step].celly=Snake[step-1].celly;
}
Snake[0].cellx=headx; //将蛇头位置探前一步
Snake[0].celly=heady;
}
}
document.getElementById("bg"+endx+endy).style.backgroundColor="white"; //恢复蛇尾处颜色
}
function showsnake() //显示这条蛇

...{
for(i=0;i<Snake.length;i++)
document.getElementById("bg"+Snake[i].cellx+Snake[i].celly).style.backgroundColor="red";
}
function document.onkeydown() //捕获按的哪个键

...{
if( event.keyCode=='87' ) //按下W键
MoveFlag="up";
if( event.keyCode=='65' ) //按下A键
MoveFlag="left";
if( event.keyCode=='83' ) //按下S键
MoveFlag="down";
if( event.keyCode=='68' ) //按下D键
MoveFlag="right";
if(event.keyCode=='27') //按下ESC

...{
MoveFlag="";
document.all.playnow.value="开始";
}
}
function setlevel()

...{
Time=document.all.level.options[document.all.level.selectedIndex].value;
sco==450-Time;
}
function play()

...{
document.all.level.disabled="disabled";

if(document.all.playnow.value=="暂停")...{
FlagTemp=MoveFlag;
MoveFlag="";
document.all.playnow.value="开始";
}

else...{
MoveFlag=FlagTemp;
document.all.playnow.value="暂停";
}
if(document.all.playnow.value=="重来")
window.refresh;
setInterval("ManageSnake()",Time); //开始
}
createfood(); //初始化一个食物
createsnakehead(); //初始化一个蛇头
</script>
</html>

使用时请保存为.asp文件。