JavaScript贪食蛇
(2011-04-29 12:15:25)
标签:
贪食蛇
javascript
数组
jquery
bug
it
|
分类:
Javascript
|
刚看完张孝祥主编的《JavaScript基础与案例开发详解》, 虽然说看完只是看了个框架而已,
刚开始觉得既然有jQuery这么方便的东西就没有必要去看js了,而且有css基础的用jQuery很顺手, 网页元素手到拿来,
但是用jQuery做了一阵之后, 发现底层一点的东西看不明白, JScript的东西也老是记不住, 做一两个小特效还行,
但是一旦逻辑结构比较复杂, 就束手无策, 学东西还是要从基层打起, 踏踏实实的学好JavaScript。
这两天发现这样一个js网站,很不错,分享出来给大家一起学习:http://www.sharejs.com/
把书翻了2遍之后, 框架清晰了很多,感觉有点基础了, 想看看一些实例应用, 在上面那个网站看到一个贪食蛇的小游戏,虽然只能在ie运行,
不过学习下设计者的思维分析, 以及逻辑分析, 也是有帮助的。
贪食蛇源代码如下:
<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=gb2312">
<title>贪吃蛇</title>
</head>
<STYLE>
.Food { background-color: green;}
.Snake {background-color: red;}
.grid {border:1px solid #000}
</STYLE>
<SCRIPT langyage="javascript">
var Rows=10
var Cells=15
var Num=20 //正方形格子的边长
var BorderWidth=5
var SpeedUp=5000
//创建地图
function CreateMap() {
BW =
eval_r(Cells*Num + 2*BorderWidth) //宽度
BH =
eval_r(Rows*Num + 2*BorderWidth)
//高度
document.body.innerHTML+='<div id=MainMap
style=position:absolute;left:'+(document.body.clientWidth-BW)/2+';top:'+(document.body.clientHeight-BH)/2+';width:'+BW+';height:'+BH+';border-width:'+BorderWidth+';border-style:outset;border-color:#0000ff></div>'
Map = new
Array() //创建全局数组Map[]
for(y=0;
y<Rows; y++) {
Map[y]=new
Array() //创建全局二维数组Map[][],初始值为'0'
for(x=0;
x<Cells; x++)
Map[y][x] =
'0' //'0'值表示“空地”
}
//ShowGrid(); //显示地图内格子
Sx =
parseInt(Math.random()*Cells) //创建全局变量Sx,赋予随机数
Sy =
parseInt(Math.random()*Rows)
//创建全局变量Sy,赋予随机数
CreateSnake()
//生成蛇 - div
CreatFood()
//生成食物 - span
AllDiv =
MainMap.all.tags('DIV')
//创建全局数组AllDiv,只有一个元素AllDiv[0]。MainMap是div的ID
AllSpan =
MainMap.all.tags('SPAN') //创建全局数组AllSpan,只有一个元素AllSpan[0]
}
//显示地图内格子
function ShowGrid() {
for(r=0;
r<Rows; r++) //行
{
t =
r*Num;
for(c=0;
c<Cells; c++) //列
{
l =
c*Num;
MainMap.innerHTML += '<table
style="position:absolute;left:'+ l +';top:'+ t
+';width:'+Num+';height:'+Num+';" cellpadding=0
cellspacing=0><tr><td
align=center valign=middle
class=grid>O</td></tr><table>'
}
}
}
//创建蛇的初始位置,赋予初始值'S'
function CreateSnake() {
//<div>表示蛇身,通过调用本函数,可以累加到若干个,蛇身变长
//注意 y 和 x
是“蛇”<div>
的自定义属性。一直保存着蛇尾(!)的当前位置
//初始时,蛇头、蛇尾是同一个位置
MainMap.innerHTML += '<div x='+Sx+' y='+Sy+'
style="position:absolute;left:'+Sx。Num+';top:'+Sy。Num+';width:'+Num+';height:'+Num+';overflow:hidden"
class=Snake></div>'
Map[Sy][Sx]='S' //Snake首字母
}
//创建食物的位置,赋予初始值'F'
//食物的初始位置不能与蛇的初始位置相同,只能在空地放置食物。
//若随机产生的2位置相同,则递归执行,直到不相同为止
function CreatFood() {
Fx =
parseInt(Math.random()*Cells)
Fy =
parseInt(Math.random()*Rows)
if(Map[Fy][Fx]=='0') //如果是空地
{
MainMap.innerHTML += '<span
style=position:absolute;left:'+Fx*Num+';top:'+Fy*Num+';width:'+Num+';height:'+Num+';overflow:hidden
class=Food></span>'
Map[Fy][Fx]='F' //Food首字母
} else
{
CreatFood();
//递归
}
}
//主移动--判断蛇头前面的是什么
function Move() {
Sx +=
GoX //自动行走,Map[Sy][Sx]为当前位置
Sy +=
GoY
if(Sy<0||Sy>=Rows) {
//碰墙,重新开始
Move1()
} else
{
SnakeFront =
Map[Sy][Sx]
if(SnakeFront=='0') { //蛇前是空地
Move2()
} else
{