-
Сведения о реализации курсовой работы
В данной курсовой работе мною была реализована классическая игра «Змейка».
На игровом поле 20x20 клеток игрок управляет «змейкой». Игра начинается с длиной «змейки» в одну клетку в центре поля. Цель – набрать максимально возможное количество очков, избегая столкновения с собственным хвостом. Для этого игроку необходимо подбирать основную и бонусную «еду». Основная «еда» добавляет «змейке» игрока одну клетку длины и одно очко счета, бонус дает игроку два очка счета без увеличения длины. Бонус появляется на экране в случайной клетке, как и «еда», но его время нахождения на игровом поле ограничено 25 кадрами (или клетками, которые «змейка» способна преодолеть до исчезновения бонуса).
Управление в игре осуществляется клавишами-стрелками, которые задают направления движения «змейки» и клавишей «пробел», которая отвечает за паузу и начало новой игры, если игрок не справился с управлением и «змейка» врезалась в собственный хвост.
-
Структура реализации проекта
-
О структуре проекта
Курсовая работа была реализована в среде Adobe Flash CS5 с использованием языка программирования ActionScript 3.0, как говорилось ранее.
Вся курсовая работа состоит из трех файлов:
-
Основной файл проекта Adobe Flash CS5 – «Snake_AS3.fla»
-
Основной файл-класс с кодом ActionScript – «Snake.as»
-
Файл программы – «Snake_AS3.swf», который является скомпилированной версией файла проекта «Snake_AS3.fla» и предназначен для работы во Flash-проигрывателе.
-
Содержание «Snake_as3.Fla»
Так как основной код и свойства программы хранятся в ActionScript-коде в файле «Snake.as», файл проекта «Snake_AS3.fla» практически пуст и не имеет никаких параметров, кроме измененного размера поля со стандартного на 600x630 пикселей, где 600x600 пикселей занимает игровое поле, генерируемое в ActionScript, а 600x30 – пустое пространство, выделенное под запись очков пользователя во время процесса игры, и подключенного файла «Snake.as» в поле Class, меню Propereties.
-
Содержание «Snake.As»
package {
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.events.TimerEvent;
import flash.ui.Keyboard;
import flash.utils.Timer;
import flash.text.TextField;
public class Snake extends Sprite{
private const SPEED : uint = 100;//Чем ниже значение, тем быстрее перемещение
private const DIM : int = 20; //20x20 - Размер поля в ячейках
private const INITIAL_SIZE : int = 1; //Длина змейки
private var left : Boolean;
private var right : Boolean;
private var up : Boolean = true;
private var down : Boolean;
private var course : String;
private var size : Number;
private var food : Sprite;
private var bonus : Sprite;
private var bonusTimer : Number;
private var timer : Timer;
private var curI : Number;
private var curJ : Number;
private var snake : Array;
private var grid : Array;
private var scoreLabel : TextField;
private var score : Number = 0;
private var gameIsOver : Boolean = false;
private var gameIsPaused : Boolean = false;
public function Snake()
{
size = stage.stageWidth / DIM;
curI = curJ = Math.floor(DIM * 0.5);
initSnake();
fillGrid();
placeFood();
timer = new Timer(SPEED);
timer.addEventListener(TimerEvent.TIMER, move);
timer.start();
stage.addEventListener(KeyboardEvent.KEY_DOWN, changeDir);
}
private function fillGrid():void
{
grid = Make2DArray();
for (var i:uint = 0; i < DIM; i++)
{
for (var j:uint = 0; j < DIM; j++)
{
var sp:Sprite = new Sprite();
sp.graphics.beginFill(0xEEEEEE);
sp.graphics.lineStyle(1,0xF5F5F5); //Цвет линий белый
sp.graphics.drawRect(0, 0, size - 1, size - 1);
sp.x = i * size;
sp.y = j * size;
sp.alpha = 1.0;
addChild(sp);
grid[i][j] = sp;
}
}
scoreLabel = new TextField();
scoreLabel.textColor = 0x000000;
scoreLabel.width = 300;
scoreLabel.x = 50;
scoreLabel.y = 600;
scoreLabel.text = "SCORE: " + score;
addChild(scoreLabel);
}
private function Make2DArray():Array
{
var a:Array = new Array(DIM);
for(var i:uint = 0; i < a.length; i++)
{
a[i] = new Array(DIM);
}
return a;
}
private function initSnake():void
{
var center:Number = Math.floor(DIM * 0.5) * size;
snake = new Array(INITIAL_SIZE);
for (var i:uint = 0; i < INITIAL_SIZE; i++)
{
var sp:Sprite = makeItem();
sp.x = center;
sp.y = center + i * size;
addChild(sp);
snake[i] = sp;
}
}
private function makeItem(c:uint = 0, c1:uint = 0, isRect:Boolean = true):Sprite
{
var s:Sprite = new Sprite();
s.graphics.beginFill(c);
s.graphics.lineStyle(2,0xF5F5F5);
s.graphics.lineStyle(2,c1);
if (isRect)
s.graphics.drawRect(0, 0, size, size);
else
s.graphics.drawCircle(15, 15, size - 15);
return s;
}
private function placeFood():void
{
var rndI:uint = Math.floor(Math.random() * DIM);
var rndJ:uint = Math.floor(Math.random() * DIM);
var rndX:Number = grid[rndI][rndJ].x;
var rndY:Number = grid[rndI][rndJ].y;
if (food != null) removeChild(food);
food = makeItem(0x0acd00, 0xF5F5F5, false);
food.x = rndX;
food.y = rndY;
addChild(food);
//Если еда была положена на змейку, то перекладываем
for (var i:uint = 0; i < snake.length; i++)
{
if (rndY == snake[i].y && rndX == snake[i].x)
{
placeFood();
}
}
}
private function placeBonus():void
{
var rndI:uint = Math.floor(Math.random() * DIM);
var rndJ:uint = Math.floor(Math.random() * DIM);
var rndX:Number = grid[rndI][rndJ].x;
var rndY:Number = grid[rndI][rndJ].y;
if (bonus != null) removeChild(bonus);
bonus = makeItem(0xff0000, 0xF5F5F5, false);
bonus.x = rndX;
bonus.y = rndY;;
addChild(bonus);
for (var i:uint = 0; i < snake.length; i++)
{
if (rndY == snake[i].y && rndX == snake[i].x)
{
placeBonus();
}
}
}
private function move(e:TimerEvent):void
{
if (course == "left"){
if (!right){left = true; up = false; down = false; right = false;}
else course = "right";
}
else if (course == "down"){
if (!up) {left = false; up = false; down = true; right = false;}
else course = "up";
}
else if (course == "right"){
if (!left) {left = false; up = false; down = false; right = true;}
else course = "left";
}
else if (course == "up"){
if (!down) {left = false; up = true; down = false; right = false;}
else course = "down";
}
if (left)
{
curI -= 1;
}
else if (right)
{
curI += 1;
}
if (up)
{
curJ -= 1;
}
else if (down)
{
curJ += 1;
}
if (left || right || up || down)
{
var s:Sprite = makeItem();
if (curI > DIM - 1) curI = 0;
if (curJ > DIM - 1) curJ = 0;
if (curI < 0) curI = DIM - 1;
if (curJ < 0) curJ = DIM - 1;
s.x = grid[curI][curJ].x;
s.y = grid[curI][curJ].y;
addChild(s);
snake.push(s);
if (Math.floor(s.x) == Math.floor(food.x) && Math.floor(s.y) == Math.floor(food.y) )
{
scoreLabel.text = "SCORE: " + ++score;
placeFood();
if (Math.random() * 10 > 8) //Бонус
{
bonusTimer = 0;
placeBonus();
}
}
else
{
removeChild(snake[0]);
snake[0] = null;
snake.shift();
}
//Если змейка врезалась в себя
for (var i:uint = 0; i < snake.length - 1; i++)
{
if (Math.floor(s.x) == Math.floor(snake[i].x) && Math.floor(s.y) == Math.floor(snake[i].y) )
gameOver();
}
if (bonus != null)
{
if (bonus.visible) bonus.visible = false;
else bonus.visible = true;
if (Math.floor(s.x) == Math.floor(bonus.x) && Math.floor(s.y) == Math.floor(bonus.y) )
{
score += 2;
scoreLabel.text = "SCORE: " + score;
removeChild(bonus);
bonus = null;
}
if (++bonusTimer > 25)
{
if (bonus != null)
{
removeChild(bonus);
bonus = null;
}
}
}
}
}
private function changeDir(e:KeyboardEvent):void
{
if(e.keyCode == Keyboard.LEFT) course = "left";
if(e.keyCode == Keyboard.UP) course = "up";
if(e.keyCode == Keyboard.RIGHT) course = "right";
if(e.keyCode == Keyboard.DOWN) course = "down";
if(e.keyCode == Keyboard.SPACE){
if (gameIsOver){
newGame();
gameIsOver = false;
}
else{
if (gameIsPaused) { timer.start(); gameIsPaused = false; }
else { timer.stop(); gameIsPaused = true; }
}
}
}
private function gameOver():void
{
gameIsOver = true;
timer.stop();
//timer.removeEventListener(TimerEvent.TIMER, move);
for (var i:uint = 0; i < snake.length; i++)
{
removeChild(snake[i]);
//snake[i] = null;
}
//removeChild(food);
scoreLabel.x = 230;
scoreLabel.y = 300;
scoreLabel.textColor = 0xff0000;
scoreLabel.text = "GAME OVER, your score is " + score;
}
private function newGame():void
{
score = 0;
curI = curJ = Math.floor(DIM * 0.5);
initSnake();
placeFood();
timer.start();
scoreLabel.x = 50;
scoreLabel.y = 600;
scoreLabel.textColor = 0x000000;
scoreLabel.text = "SCORE: " + score;
}
}
}