Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет. Змейка..docx
Скачиваний:
9
Добавлен:
24.12.2018
Размер:
158.88 Кб
Скачать
  1. Сведения о реализации курсовой работы

В данной курсовой работе мною была реализована классическая игра «Змейка».

На игровом поле 20x20 клеток игрок управляет «змейкой». Игра начинается с длиной «змейки» в одну клетку в центре поля. Цель – набрать максимально возможное количество очков, избегая столкновения с собственным хвостом. Для этого игроку необходимо подбирать основную и бонусную «еду». Основная «еда» добавляет «змейке» игрока одну клетку длины и одно очко счета, бонус дает игроку два очка счета без увеличения длины. Бонус появляется на экране в случайной клетке, как и «еда», но его время нахождения на игровом поле ограничено 25 кадрами (или клетками, которые «змейка» способна преодолеть до исчезновения бонуса).

Управление в игре осуществляется клавишами-стрелками, которые задают направления движения «змейки» и клавишей «пробел», которая отвечает за паузу и начало новой игры, если игрок не справился с управлением и «змейка» врезалась в собственный хвост.

  1. Структура реализации проекта

    1. О структуре проекта

Курсовая работа была реализована в среде Adobe Flash CS5 с использованием языка программирования ActionScript 3.0, как говорилось ранее.

Вся курсовая работа состоит из трех файлов:

  • Основной файл проекта Adobe Flash CS5 – «Snake_AS3.fla»

  • Основной файл-класс с кодом ActionScript – «Snake.as»

  • Файл программы – «Snake_AS3.swf», который является скомпилированной версией файла проекта «Snake_AS3.fla» и предназначен для работы во Flash-проигрывателе.

    1. Содержание «Snake_as3.Fla»

Так как основной код и свойства программы хранятся в ActionScript-коде в файле «Snake.as», файл проекта «Snake_AS3.fla» практически пуст и не имеет никаких параметров, кроме измененного размера поля со стандартного на 600x630 пикселей, где 600x600 пикселей занимает игровое поле, генерируемое в ActionScript, а 600x30 – пустое пространство, выделенное под запись очков пользователя во время процесса игры, и подключенного файла «Snake.as» в поле Class, меню Propereties.

    1. Содержание «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;

}

}

}