JS写的贪吃蛇

         昨晚睡前突然想用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
& nbsp;下:S & nbsp;左:A & nbsp;右:D & nbsp; </ 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文件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值