javascript版的贪食蛇

http://myinfo95.class.netbig.com/snake.htm
这个程序也是本人在2000年五月时写的。
许多结构和我写俄罗斯方块时差不多。只要用ie就可以玩了
<html>
<head>
<title>贪食蛇(lint)</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
<!--
td { font-family: "宋体"; font-size: 11pt}
body { font-family: "宋体"; font-size: 11pt}
select { font-family: "宋体"; font-size:11pt}
A {text-decoration: none; color: #ffffff; font-family: "宋体"; font-size: 11pt}
A:hover {text-decoration: underline; color: #FF0000; font-family: "宋体"; font-size: 11pt}
-->
</style>
<Script language="javascript">
var M=15,N=60;
var worm,direction=0,n=1,fruit,origin_direction=0;
var i=0,j=0,k=0;
var img;
var stop=0;
var score=0,high_score=0;
var next_x,next_y;
//img=new Array(12);
fruit=new Array(2);
var back_img,head_up,head_down,head_left,head_right;
var turn_up_right,turn_left_down,turn_up_left,turn_right_down,turn_left_up,turn_down_right,turn_down_left,turn_right_up;
var body_left,body_right,body_down,body_up;
var snake_fruit;
var progress=0,fruit_num=1,arrayspeed,speed=500,line=0;
var bigarray,go_step=0;
bigarray=new Array(M*M);
/*for(i=0;i<M*M;i++)
bigarray=new Array(2);
*/
arrayspeed=new Array(500,450,400,350,300,200,150,100,50);
//定义背景
back_img=new Image();

//定义果子
snake_fruit=new Image();

//定义拐角图象
turn_up_right=new Image();
turn_left_down=new Image();
turn_up_left=new Image();
turn_right_down=new Image();
turn_left_up=new Image();
turn_down_right=new Image();
turn_down_left=new Image();
turn_right_up=new Image();

head_up=new Image();
head_down=new Image();
head_left=new Image();
head_right=new Image();

//定义身体走向
body_left=new Image();
body_right=new Image();
body_up=new Image();
body_down=new Image();

snake_fruit.src="images/snake11.jpg";
back_img.src="images/snake10.jpg";
turn_up_right.src=turn_left_down.src="images/snake9.jpg";
turn_up_left.src=turn_right_down.src="images/snake8.jpg";
turn_left_up.src=turn_down_right.src="images/snake6.jpg";
turn_down_left.src=turn_right_up.src="images/snake7.jpg";

//定义头向图


head_up.src="images/snake0.jpg";
head_down.src="images/snake1.jpg";
head_left.src="images/snake2.jpg";
head_right.src="images/snake3.jpg";


body_left.src=body_right.src="images/snake5.jpg";
body_down.src=body_up.src="images/snake4.jpg";
/*
for(i=0;i<=(M-1)/2;i++)
{
 if(go_step==0)
  {for(j=i;j<=M-2-i;j++)
   {bigarray[k][0]=i;
   bigarray[k][1]=j;
k++;
  }
  go_step=1;
  }
 if(go_step==1)
  {
  for(j=i;j<=M-2-i;j++)
   {
   bigarray[k][0]=M-1-i;
   bigarray[k][1]=j;
   k++;
   }
  go_step=2;
  }
 if(go_step==2)
 {
  for(j=M-2-i;j>0;j--)
   {
   bigarray[k][0]=j;
   bigarray[k][1]=M-1-i;
   k++;
   }
   go_step=3;
 }
 if(go_step==3)
 {
  for(j=M-2-i;j>0;j--)
   {
   bigarray[k][0]=i;
   bigarray[k][1]=j;
   k++;
   }
   go_step=0;
 }
}
*/
//定义虫子坐标
worm=new Array(N);
for(i=0;i<N;i++)
worm[i]=new Array(0,0);

//产生一个果子
function bring_fruit()
{
 var i,j;
 do{
 i=Math.floor(Math.random()*15);
 j=Math.floor(Math.random()*15);
 }
 while (touch_self(i,j));
 fruit[0]=i;
 fruit[1]=j;
 eval("document.box.box"+i+"_"+j+".src=snake_fruit.src");
}

//产生一个头
function head()
{
 var i,j;
 i=Math.floor(Math.random()*15);
 j=Math.floor(Math.random()*15);
 n=1;
 worm[0][0]=i;
 worm[0][1]=j;
 eval("document.box.box"+i+"_"+j+".src=head_up.src");
}

//方向
function documentkeydown()
{
 if((event.keyCode==80)&&(document.game_set.pause_button.disabled==false))
   pause_game();
 else if((event.keyCode==82)&&(document.game_set.restart_button.disabled==false))
  end(); 
  else if(event.keyCode==81)
   parent.window.close();
  else if((event.keyCode==83)&&(document.game_set.start_button.disabled==false))
  start_game(); 
 if(stop==1)
  return;  
 else
 {
  document.game_set.start_button.disabled=true;
  document.game_set.pause_button.disabled=false;
  document.game_set.restart_button.disabled=true;
  document.game_set.pause_button.value="暂停";
 }
 if(event.keyCode==38)
  direction='up';
 else if(event.keyCode==40)
  direction='down';
 else if(event.keyCode==37)
  direction='left';
 else if(event.keyCode==39)
  direction='right';
 
 

 step(); 
}

function if_back()
{
 if((origin_direction=='right')&&(direction=='left')||(origin_direction=='left')&&(direction=='right')||(origin_direction=='down')&&(direction=='up')||(origin_direction=='up')&&(direction=='down'))
  return true;
 else
  return false;   
}

//走一步
function step()
{
if(n>1)
  {if(worm[0][0]>worm[1][0])
    {origin_direction='down';}
   else if(worm[0][0]<worm[1][0])
    {origin_direction='up';}
   else if(worm[0][1]>worm[1][1])
    {origin_direction='right';}
   else if(worm[0][1]<worm[1][1])
    {origin_direction='left';}
  }  
else
  origin_direction=0; 
 if(stop)
  return;
 if(if_back())
  {direction=origin_direction;
  return;
  }
 else
  if(direction!=0)
  {
   if(direction=='up')
  {
   next_x=worm[0][0]-1;
   next_y=worm[0][1];
  }
 else if(direction=='down')
  {
   next_x=worm[0][0]+1;
   next_y=worm[0][1];
  }
 else if(direction=='left')
  {
   next_x=worm[0][0];
   next_y=worm[0][1]-1;
  }
 else if(direction=='right')
  { 
   next_x=worm[0][0];
   next_y=worm[0][1]+1;
  }

   if(die())
    {
     end();
     return;
    }
   else
    {
     if(next_x==fruit[0]&&next_y==fruit[1])
      {
       
       for(i=n;i>0;i--)
        {
         worm[i][0]=worm[i-1][0];
         worm[i][1]=worm[i-1][1];
        }
        worm[0][0]=next_x;
        worm[0][1]=next_y;
        eval("document.box.box"+next_x+"_"+next_y+".src=head_"+direction+".src");
        n++;        
        if((n==2)||(origin_direction==direction))
          eval("document.box.box"+worm[1][0]+"_"+worm[1][1]+".src=body_"+direction+".src");               
        else
         eval("document.box.box"+worm[1][0]+"_"+worm[1][1]+".src=turn_"+origin_direction+"_"+direction+".src");               
        
        score+=100;
        bring_fruit(); 
      }
      else
      {
       modi_img();            
      }
    } 
  }
 // stop=0;
}

//判断是否碰到自己
function touch_self(a,b)
{
 var i;
 for(i=0;i<n;i++)
  if((worm[i][0]==a)&&(worm[i][1]==b))
   return true;
 return false; 
 
}

//判断是否死亡
function die()
{
   if(next_x<0||(next_x==M)||next_y<0||(next_y==M)||touch_self(next_x,next_y))
    return true;
   else
    return false;
}

//结束
function end()
{
 var i,j,user_name="";
 alert("YOU DIE!GAME OVER!SCORE:"+score+" "+stop);
 if(score>high_score)
  {high_score=score;
   user_name=window.prompt("恭喜你获得了最高分,请输入你的名字:","");
  }  
 my_high_score.innerHTML="最高分:"+high_score+"<br>记录保持者:"+user_name;
 stop=1;
 direction=0;
 line=0;
 n=1;
 clear_line(1); 
}

function clear_line(fill)
{
 var i;
 if(fill==1)
  {
   if(line<=M-1)
    {
     for(i=0;i<M;i++)
      {
      eval("document.box.box"+line+"_"+i+".src=snake_fruit.src");
      }      
      line++; 
     window.setTimeout("clear_line(1)",10);
    }
    else
     {
      line=M-1;
      window.setTimeout("clear_line(0)",10);
     }
  }
 else
  {
    if(line>=0)
    {
     for(i=0;i<M;i++)
     eval("document.box.box"+line+"_"+i+".src=back_img.src");
     line--; 
     window.setTimeout("clear_line(0)",10);
    }
    else
    {
     speed=arrayspeed[document.game_set.game_speed.options[document.game_set.game_speed.selectedIndex].value];
     fruit_num=document.game_set.fruit_num.options[document.game_set.fruit_num.selectedIndex].value;
     score=0;
  document.game_set.start_button.disabled=true;
 document.game_set.pause_button.disabled=false;
 document.game_set.restart_button.disabled=true;
 document.game_set.pause_button.value="暂停";
  document.game_set.restart_button.blur();
  document.game_set.restart_button.blur();
  stop=0;
  direction=0;
  bring_fruit();
  head();
  start_game();
  //auto_step();
   //return;
    }
   
  }
}


//修改蛇的图象
function modi_img()
{
 var i;
 eval("document.box.box"+next_x+"_"+next_y+".src=head_"+direction+".src");               
 if(n==1)
  eval("document.box.box"+worm[0][0]+"_"+worm[0][1]+".src=back_img.src");               
 else if((n==2)||(origin_direction==direction))
   {eval("document.box.box"+worm[0][0]+"_"+worm[0][1]+".src=body_"+direction+".src");               
   eval("document.box.box"+worm[n-1][0]+"_"+worm[n-1][1]+".src=back_img.src");               
   
   }
 else
   {
   eval("document.box.box"+worm[0][0]+"_"+worm[0][1]+".src=turn_"+origin_direction+"_"+direction+".src");                 
   eval("document.box.box"+worm[n-1][0]+"_"+worm[n-1][1]+".src=back_img.src");               
   }
  
 for(i=n-1;i>0;i--) 
  {worm[i][0]=worm[i-1][0];
   worm[i][1]=worm[i-1][1];
  }
 worm[0][0]=next_x;
 worm[0][1]=next_y; 
}

function auto_step()
{
 if(!stop)
 {step();
  if(direction!=0)
  score+=1;
  show_score();
  if(worm[0][0]==0&&direction=='up'||(worm[0][0]==M-1)&&direction=='down'||worm[0][1]==0&&direction=='up'||(worm[0][1]==M-1)&&direction=='down')
   window.setTimeout("auto_step()",speed+200);
  else
   window.setTimeout("auto_step()",speed+200); 
 }  
}

//显示分数
function show_score()
{
my_score.innerHTML="分数:"+score;
}
function documentmousedown()
{
 if(event.button==2)
  alert("本系统只支持鼠标左键");
}
function documentload()
{
 if(document.readyState=='complete')
  {
  pro.style.visibility="hidden";
  state.innerHTML="";
  help.innerHTML="按任意方向键就可以开始了,祝大家玩的开心<br>Copyright by lint.EMAIL:[email protected]. 2000.5 ";
  document.game_set.start_button.disabled=false;
  stop=0;
  auto_step();
  }
  
}
function load()
{
 if(progress<130&&document.readyState!='complete')
  {progress++;
  pro.style.width=(progress*4)+"px";
  window.setTimeout("load()",15);
  }  
}

function start_game()
{
 fruit_num=document.game_set.fruit_num.options[document.game_set.fruit_num.selectedIndex].value;
 speed=arrayspeed[document.game_set.game_speed.options[document.game_set.game_speed.selectedIndex].value];
 document.game_set.start_button.disabled=true;
 document.game_set.pause_button.disabled=false;
 document.game_set.restart_button.disabled=true;
 document.game_set.pause_button.value="暂停";
 stop=0;
 auto_step();
 
}
function pause_game()
{
 speed=arrayspeed[document.game_set.game_speed.options[document.game_set.game_speed.selectedIndex].value];
 //document.game_set.start_button.disabled=false;
 if(stop==0)
 {document.game_set.pause_button.value="继续";
  document.game_set.pause_button.disabled=false;
  document.game_set.restart_button.disabled=false;
  document.game_set.pause_button.blur();
  stop=1;
 }
 else
  {document.game_set.pause_button.value="暂停";
  document.game_set.pause_button.disabled=false;
  document.game_set.restart_button.disabled=true;
  document.game_set.pause_button.blur();
  stop=0;
  auto_step();
 }
}

document.onkeydown=documentkeydown;
document.onmousedown=documentmousedown;
document.onreadystatechange=documentload;
</Script>
</head>

<body bgcolor="#FFFFFF">

<div id="Layer1" style="position:absolute; left:10px; top:11px; width:452px; height:406px; z-index:1; background-color: #FFFFFF; layer-background-color: #FFFFFF; border: 1px none #000000">
 <form name="box">
<Script language="javascript">
for(i=0;i<M;i++)
{for(j=0;j<M;j++)
document.write("<img name='box"+i+"_"+j+"' src='images/snake10.jpg' width='25' height='25'>");
document.writeln("<br>");
}

</Script>
</form>
 </div>
<div id="my_high_score" style="position:absolute; left:467px; top:12px; width:155px; height:53px; z-index:2">最高分:0</div>
<div id="my_score" style="position:absolute; left:467px; top:68px; width:156px; height:24px; z-index:3">分数:0</div>
<div id="Layer4" style="position:absolute; left:468px; top:97px; width:123px; height:237px; z-index:5; background-color: #FFFBEC; layer-background-color: #FFFBEC; border: 1px none #000000">
 <form name="game_set" >
  <table width="75%" border="0" bordercolorlight="#CCCCFF" bordercolordark="#6666FF" bordercolor="#CCFFFF">
   <tr>
    <td>果子</td>
    <td>
     <select name="fruit_num">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>      
     </select>
    </td>
   </tr>
   <tr>
    <td>速度</td>
    <td>
     <select name="game_speed">
      <option value="0" selected>0</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
      <option value="6">6</option>
      <option value="7">7</option>
      <option value="8">8</option>
      <option value="9">9</option>
     </select>
    </td>
   </tr>
   <tr>
    <td>
     <input type="button" onClick="start_game()" name="start_button" value="开始">
    </td>
    <td>
     <input type="button" onClick="pause_game()" name="pause_button" value="暂停">
    </td>
   </tr>
   <tr>
    <td colspan="2">
     <input type="button" onClick="end()" name="restart_button" value="重新开始">
    </td>
   </tr>
   <tr>
    <td colspan="2">
     <input type="button" onClick="javascript:history.go(0)" name="Submit3" value="重置">
    </td>
   </tr>
   <tr>
    <td colspan="2">
     <input type="button" onClick="javascript:parent.window.close()" name="Button" value="退出游戏">
    </td>
   </tr>
  </table>
 </form>
</div>
<div id="help" style="position:absolute; left:9px; top:424px; width:588px; height:32px; z-index:6"></div>
<div id="pro" style="position:absolute; left:19px; top:452px; width:0px; height:42px; z-index:7; background-color: #0066FF; layer-background-color: #0066FF; border: 1px none #000000"></div>
<div id="state" style="position:absolute; left:468px; top:377px; width:126px; height:40px; z-index:8">正在下载数据,请稍侯。</div>
<Script language="javascript">
document.game_set.start_button.disabled=true;
document.game_set.pause_button.disabled=true;
document.game_set.restart_button.disabled=true;
head();
for(i=0;i<fruit_num;i++)
bring_fruit();
stop=1;
document.body.scroll='no';
load();
</Script>
</body>
</html>