注:按空格开始游戏!
原文:http://www.strille.net/works/snake_game_1Kb.php#2.2
源代码:
//
--- Flash MX Snake Game 1Kb by Strille. Version 2.2, 746 bytes
//
--- Paste this code on frame 1 and set scene size to 512x280 and Frame Rate to 16
//
--- The code is not written with speed in mind, only small file size. Not that it is slow :-)
createTextField(
"
t
"
,
1
,
1
,
255
,
511
,
32
);
//
create a text field to write score and instructions
t.text
=
"
Snake Game\t-\tPress SPACE
"
;
//
show start text
beginFill(
0xeeeeee
); lineStyle(
1
); lineTo(
511
,
0
); lineTo(
511
,
256
); lineTo(
0
,
256
); endFill();
//
draw background with border
Key.addListener(t);
//
use an existing object as key listener (we don't waste bytes by creating a new object)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
t.onKeyDown
=
function()
{ // define an anonymous method to execute when a key is pressed
c = Key.getCode()-37; // get key code (c is a variable used "locally" several times)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (!(c>>2))
{ // arrow keys pressed (c = 0, 1, 2 or 3)
if (c != q[0]) // only add to the queue if it is a new direction
q.unshift(c);
return; // save the turn in the queue and exit method
}
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// SPACE or another key other than an arrow key has been pressed
x = 32*8 + 32*520; // snake start pos (left and right side of + can be viewed as x and y coord
q = []; // a queue to store key presses (so that x number of key presses during one frame are spread over x number of frames)
m = []; // create an array to store food pos and snake
createEmptyMovieClip("s", w=0); // create MC to store the snake and the food MC and reset snake counter(w)
e = 2*(m[x-520] = 2*(r=1)); // set erase counter (e) to 4, set current direction (r) to up (1) and set food on the position the snake will be over the first time to place food
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
onEnterFrame = function ()
{ // MAIN function
c = q.pop(); //
pick the next turn in the queue (may be undefined if queue is empty)![dot.gif](https://www.cnblogs.com/Images/dot.gif)
if (c%2 != r%2) //
and check that it is not undefined and not a 180 degree turn (annoying to be able to turn into the snake with one key press)
if (c != undefined)
r = c; // change current direction to the new value
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
x += [-1, -65, 1, 65][r]*8; // move the snake to a new x position (-1 = left, -65 = up, 1 = right, 65 = down)
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (m[x] == 1 or !(x%520) or !(int(x/520) % 33))
{ // GAME OVER if it is a snake block or outside the map on the next position
delete onEnterFrame; // quit looping main function
t.text += "\tGAME OVER!"; return; // type game over text and exit main
}
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
with(s.createEmptyMovieClip(w, w))
{ // place a snake block (or food block the first loop)
beginFill(255<<16); // red food color first time![dot.gif](https://www.cnblogs.com/Images/dot.gif)
if (w++) //
blue snake color the other times
beginFill(0x555588);
_x = x%520; _y = int(x/520)*8; // set snake block position
lineTo(-7, 0); lineTo(-7, -7); lineTo(0, -7); endFill(); // draw a square
}
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
m[x] += 1; // set current pos as "occupied" by a snake block
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (m[x] == 3)
{ // check if there is a food block on the new pos
t.text = "Score: " +(w-(e-=5)-2)*2; // delay erase counter with 5 (the snake will grow 5 blocks each time), calculate and type score (+10p for a food block)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
do
{} while (m[c = (s[0]._x = 8+random(64)*8)+(s[0]._y = 8+random(32)*8)*65]); // pick a free spot to place the food, save that number, place the food MC
m[c] = 2; // set the position picked on the line above to 2
}
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (e)
{ // if not food MC (s[0]) then erase last snake MC and entry in array m
c = s[e]; // get last MC
delete m[c._x+65*c._y]; removeMovieClip(c); // delete the value in the array m and delete the MC
}
e++; // increase erase snake counter
}
}
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)