JS写的贪吃蛇

本文分享了一个使用JavaScript编写的贪吃蛇游戏源代码。作者通过两个小时的努力完成了基本功能,但在游戏中遇到一些问题,即从吃第二个食物开始蛇身不再增长。文章详细展示了游戏的实现代码,包括蛇的移动逻辑、食物生成以及得分计算等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         昨晚睡前突然想用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文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值