Flash MX Snake Game (746 bytes)

by Strille


Byte count: 918 904 874 855 839 832 822 804 801 750 746 bytes!
Last updated: October 24, 2003

Download:
swf file: snake_game_1Kb.swf
commented source code: snake_game_1Kb.txt
compact source code: snake_game_1Kb_obscure.txt (v 2.1)


Source code

Simply create a new Flash MX movie and paste the code below on frame 1. Please note that the file size can vary a few bytes depending on which frame rate and scene size you use and if you run in debug mode or not. The byte count above is correct when frame rate is set to 16, scene size to 512x280 and the option "Compress Movie" is switched on.

Note: If you use Flash MX 2004, publish as a Flash 6 movie for it to work correctly. It will play correctly in Flash Player 7.



Version 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)
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)
	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
	}

	// 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

	onEnterFrame = function () { // MAIN function
		c = q.pop(); // ...pick the next turn in the queue (may be undefined if queue is empty)...
		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

		x += [-1, -65, 1, 65][r]*8; // move the snake to a new x position (-1 = left, -65 = up, 1 = right, 65 = down)

		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
		}

		with(s.createEmptyMovieClip(w, w)) { // place a snake block (or food block the first loop)
			beginFill(255<<16); // red food color first time...
			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
		}

		m[x] += 1; // set current pos as "occupied" by a snake block

		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)
			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
		}

		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
	}
}

View older versions