最近几天准备把小项目都翻出来整理上来 顺便再理一下思路,都是很简单的小东西,但是积少成多....
我把蛇身体的每一节都定义成一小块div,定义它的样式,把他推入snakes数组中,并且插入图纸main中,这样蛇的一块身体就出现在界面中了,然后通过一次for循环
来创建出一条蛇。因为push方法是把一个元素添加到数组的结尾,为了简便操作我们需要把蛇头定义为数组的第0位,所以用i--的方法。
食物我们也将其定义为一个div,我们定义食物的坐标x,y。Math.random()*29 + 1是生成0~31之间的小数,Math.floor方法取向下的整数,再乘以20可以完美的在地图上刷新食物,把它插在地图中 ,这样在点击“开始游戏”后地图上就会出现一条蛇,并且随机生成一个食物。
之后我们需要改变蛇运动的方向,我们在body上绑定一个onkeydown事件,我们可以通过event.keyCode来获取数值判断你按得是哪个键,通过switch开关方法,改变stepX 和 stepY来控制蛇头的方向
这样整条蛇就能根据我们的控制动起来了 ,值得注意的是 当你的蛇运动时,相反方向的操作是不会对蛇本身有任何影响的,上面我就定义了蛇的方向,只有在进行对蛇有影响的操作时,蛇的方向才会改变。而且当蛇的方向改变后,我们需要清空原来的定时器,并开始新的定时操作
吃到食物后,我们把食物插到数组的结尾,来成为蛇身体的一部分,而且在吃了食物后我们的分数会+1,我们只需要用蛇当前的长度减去蛇原始的长度,就是分数了。我们需要实时的监视蛇和食物的距离,所以我们需要设置一个计时器。
<!
DOCTYPE html
>
<
html
lang
=
"en"
>
<
head
>
<
meta
charset
=
"UTF-8"
>
<
meta
name
=
"viewport"
content
=
"width=device-width, initial-scale=1.0"
>
<
meta
http-equiv
=
"X-UA-Compatible"
content
=
"ie=edge"
>
<
title
>
Document
</
title
>
<
style
>
.box
{
border
:
1px
dashed
blue
;
}
.top
{
}
.main
{
position
:
relative
;
width
:
600px
;
height
:
600px
;
background
:
yellow
;
overflow
:
hidden
;
}
<
/
style
>
</
head
>
<
body
onkeydown
=
"control(event)"
>
<
div
class
=
"box"
>
<
div
class
=
"top"
>
<
button
id
=
"start"
>
开始游戏
</
button
>
<
button
id
=
"stop"
>
暂停游戏
</
button
>
<
span
>
得分:
</
span
><
span
id
=
"score"
></
span
>
</
div
>
<
div
class
=
"main"
>
</
div
>
</
div
>
<
script
src
=
"./jquery-3.3.1.js"
>
<
/
script
>
<
script
>
var
map
=
document
.
getElementsByClassName
(
'main'
);
var
snakes
=
[];
var
stepX
=
20
,
stepY
=
0
;
var
snake_direction
=
'right'
;
var
timer
;
// 暂停游戏
document
.
getElementById
(
'stop'
).
onclick
=
function
(){
stop
();
}
//开始游戏
document
.
getElementById
(
'start'
).
onclick
=
function
(){
if
(
snakes
.
length
==
0
){
createFood
();
//创建食物
for
(
var
i
=
2
;
i
>=
0
;
i
--
){
createSnake
(
i
);
//创建蛇的身体
}}
else
{}
snakeMove
();
//蛇的移动
overDiv
();
//碰到边界的判定条件
eatIt
();
eatFood
();
//蛇吃食物
console
.
log
(
snakes
)
}
function
stop
(){
clearTimeout
(
timer
)
}
function
eatFood
(){
var
score
=
document
.
getElementById
(
'score'
);
score
.
innerHTML
=
snakes
.
length
-
3
;
var
food
=
document
.
getElementById
(
'active'
);
var
x
=
parseInt
(
snakes
[
0
].
style
.
left
);
var
y
=
parseInt
(
snakes
[
0
].
style
.
top
);
var
food_x
=
parseInt
(
food
.
style
.
left
);
var
food_y
=
parseInt
(
food
.
style
.
top
);
if
(
Math
.
abs
(
food_x
-
x
)
<
20
&&
Math
.
abs
(
food_y
-
y
)
<
20
){
food
.
style
.
backgroundColor
=
'green'
;
snakes
.
push
(
food
);
food
.
id
=
''
;
createFood
();
}
setTimeout
(
'eatFood()'
,
30
);
}
function
createFood
(){
var
food
=
document
.
createElement
(
'div'
);
var
x
=
Math
.
floor
(
Math
.
random
()
*
29
+
1
)
*
20
;
var
y
=
Math
.
floor
(
Math
.
random
()
*
29
+
1
)
*
20
;
food
.
style
.
position
=
'absolute'
;
food
.
style
.
left
=
x
+
'px'
;
food
.
style
.
top
=
y
+
'px'
;
food
.
style
.
width
=
'18px'
;
food
.
style
.
height
=
'18px'
;
food
.
style
.
border
=
'1px solid black'
;
food
.
style
.
backgroundColor
=
'blue'
;
$
(
'.main'
).
append
(
food
);
$
(
food
).
attr
(
'id'
,
'active'
);
}
function
createSnake
(
num
){
var
snakeBody
=
document
.
createElement
(
'div'
);
snakeBody
.
style
.
backgroundColor
=
'green'
;
snakeBody
.
style
.
border
=
'1px solid black'
;
snakeBody
.
style
.
width
=
'18px'
;
snakeBody
.
style
.
height
=
'18px'
;
snakeBody
.
style
.
position
=
'absolute'
;
snakeBody
.
style
.
left
=
num
*
20
+
'px'
;
snakeBody
.
style
.
top
=
'0px'
;
snakes
.
push
(
snakeBody
);
$
(
'.main'
).
append
(
snakeBody
);
}
function
snakeMove
(){
for
(
var
i
=
snakes
.
length
-
1
;
i
>
0
;
i
--
){
snakes
[
i
].
style
.
left
=
snakes
[
i
-
1
].
style
.
left
;
snakes
[
i
].
style
.
top
=
snakes
[
i
-
1
].
style
.
top
;
}
snakes
[
0
].
style
.
left
=
parseInt
(
snakes
[
0
].
style
.
left
)
+
stepX
+
'px'
;
snakes
[
0
].
style
.
top
=
parseInt
(
snakes
[
0
].
style
.
top
)
+
stepY
+
'px'
;
timer
=
setTimeout
(
'snakeMove()'
,
400
);
}
function
re_move
(){
clearTimeout
(
timer
);
snakeMove
();
}
function
control
(
event
){
var
n
=
event
.
keyCode
;
switch
(
n
){
case
37
:
if
(
snake_direction
==
'right'
){
break
;
}
else
{
stepX
=
-
20
;
stepY
=
0
;
snake_direction
=
'left'
;
}
re_move
();
break
;
case
38
:
if
(
snake_direction
==
'down'
){
break
;
}
else
{
stepX
=
0
;
stepY
=
-
20
;
snake_direction
=
'top'
;
}
re_move
();
break
;
case
39
:
if
(
snake_direction
==
'left'
){
break
;
}
else
{
stepX
=
20
;
stepY
=
0
;
snake_direction
=
'right'
;
}
re_move
();
break
;
case
40
:
if
(
snake_direction
==
'top'
){
break
;
}
else
{
stepX
=
0
;
stepY
=
20
;
snake_direction
=
'down'
;
}
re_move
();
break
;
}
}
function
overDiv
(){
var
x
=
parseInt
(
snakes
[
0
].
style
.
left
);
var
y
=
parseInt
(
snakes
[
0
].
style
.
top
);
if
(
x
<
0
||
x
>
580
){
alert
(
'diediedie~~~'
);
window
.
location
.
reload
();
}
if
(
y
<
0
||
y
>
580
){
alert
(
'diediedie~~~'
);
window
.
location
.
reload
();
}
setTimeout
(
'overDiv()'
,
30
);
}
function
eatIt
(){
for
(
var
i
=
3
;
i
<
snakes
.
length
-
1
;
i
++
){
if
(
snakes
[
i
].
style
.
left
==
snakes
[
0
].
style
.
left
&&
snakes
[
i
].
style
.
top
==
snakes
[
0
].
style
.
top
){
alert
(
'diediedie12'
)
window
.
location
.
reload
();
}
}
setTimeout
(
'eatIt'
,
30
)
}
<
/
script
>
</
body
>
</
html
>