Привет! Итак, продолжаем создавать игру "Пятнашки". В прошлой статье мы создали графику для нашей игры. Теперь приступим к программированию. Писать код мы будем на языке ActionScript 3.0 в среде FlashDevelop.
Так как "Пятнашки" очень простая игра, код будет относительно несложен и состоять всего из трёх классов:
Итак приступим к написанию кода игры.
Во FlashDevelop создаём новый проект (AS3Project) без прелоадера. В папке с проектом автоматически создадутся три папки: "bin", "lib" и "src".
В папку "lib" необходимо скопировать файл библиотеки SWC, который мы создали в прошлом уроке.
Теперь во FlashDevelop, в окне Project, в папке "lib" найдем наш файл SWC, щелкнем по нему правой кнопкой и в появившемся контекстном меню выберем "Add to library". Тем самым мы добавили нашу графику в проект и теперь можем обращаться к ней.
Теперь сделаем небольшую настройку проекта. Зайдем в меню Project -> Properties. В открывшемся окне установим размеры (Dimensions) - 288 x 400 px.
Начнём писать код с класса "Game". Но сначала этот класс нужно создать. В окне Project, щелкнем правой кнопкой по папке "src", выберем Add -> New Class..
Теперь можно рассмотреть листинг класса "Game" :
Здесь мы создаём, расставляем графику, присваиваем плиткам необходимые параметры.
Сами плитки мы не двигаем по полю. Мы всего лишь присваиваем новые параметры необходимой плитке (номер кадра, положение в матрице, число на плитке) исходя из её положения в матрице.
Теперь посмотрим как устроен класс "Tile"
Здесь всё просто. Три параметра и собственно сама плитка из нашей библиотеки SWC.
Ну и последний листинг класса "Main"
Здесь просто создаётся игра, с помощью класса Game.
И так, игру мы написали, теперь можно её скомпилировать и запустить.
В итоге у нас должно получиться вот что:
Плитки расставляются случайным образом. Начать новую игру можно на кнопку "Рестарт". Счетчик ходов считает ходы. Как только мы собираем головоломку, совершать ходы больше не получится - это будет считаться победой.
Проект с игрой можно скачать по ссылке.
На этом всё. В следующей статье мы попробуем портировать наши "Пятнашки" на Андроид с помощью технологии Adobe Air
Так как "Пятнашки" очень простая игра, код будет относительно несложен и состоять всего из трёх классов:
- Main.as - базовый класс для запуска игры. Большая его часть генерируется автоматически.
- Game.as - главный класс. Вся игровая логика сосредоточена здесь.
- Tile.as - класс отвечающий за плитки с числами в игре.
Итак приступим к написанию кода игры.
Во FlashDevelop создаём новый проект (AS3Project) без прелоадера. В папке с проектом автоматически создадутся три папки: "bin", "lib" и "src".
В папку "lib" необходимо скопировать файл библиотеки SWC, который мы создали в прошлом уроке.
Теперь во FlashDevelop, в окне Project, в папке "lib" найдем наш файл SWC, щелкнем по нему правой кнопкой и в появившемся контекстном меню выберем "Add to library". Тем самым мы добавили нашу графику в проект и теперь можем обращаться к ней.
Теперь сделаем небольшую настройку проекта. Зайдем в меню Project -> Properties. В открывшемся окне установим размеры (Dimensions) - 288 x 400 px.
Начнём писать код с класса "Game". Но сначала этот класс нужно создать. В окне Project, щелкнем правой кнопкой по папке "src", выберем Add -> New Class..
Теперь можно рассмотреть листинг класса "Game" :
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
/**
* ...
* @author RablV
*/
public class Game extends Sprite
{
// матрица плиток
private var matrix:Vector.<Vector.<Tile>> = new <Vector.<Tile>>[ new <Tile> [null, null, null, null],
new <Tile> [null, null, null, null],
new <Tile> [null, null, null, null],
new <Tile> [null, null, null, null] ];
// эталонная матрица для проверки победы
private var checkMatrix:Array = new Array( [1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 0] );
//массив для хранения рандомной последовательности
private var randomMas:Array = new Array();
// счетчик ходов
private var countMc:Count_mc;
// переменная для хранения колличества ходов
private var moveCount:int = 0;
// флаг победы
private var flagVictory:Boolean = false;
public function Game() {
setFon(); // устанавливаем фон
setRestartBtn(); // устанавливаем кнопку Рестарт
setCountMc(); // устанавливаем счетчик ходов
setTiles(); // устанавливаем плитки
}
// устанавливаем фон
private function setFon():void {
var fon:Fon_mc = new Fon_mc(); // берем фон из библиотеки SWC
addChild(fon);
}
// установка кнопки Рестарт
private function setRestartBtn():void {
var restartBtn:Restart_btn = new Restart_btn();
addChild(restartBtn);
restartBtn.x = 44, 7;
restartBtn.y = 326, 5;
restartBtn.addEventListener(MouseEvent.CLICK, newRandGame);
}
// установка счетчика
private function setCountMc():void {
countMc = new Count_mc();
addChild(countMc);
countMc.x = 192,55;
countMc.y = 326,5;
}
// устанавливаем плитки
private function setTiles():void {
for (var j:int = 0; j < 4; j++ ) { // в двойном цикле ставим плитки по вертикали и горизонтали
for (var i:int = 0; i < 4; i++ ) {
matrix[i][j] = new Tile();
matrix[i][j].i = i; // присваемвам плиткам их координаты в матрице
matrix[i][j].j = j;
matrix[i][j].x = 4 + i * 64 + 8*i; // расставляем плитки на игровом поле
matrix[i][j].y = 4 + j * 64 + 8*j;
matrix[i][j].tileMc.stop(); // каждую плитку нужно остановить, чтоб не мерцала (т.к. в ней 2 кадра)
matrix[i][j].addEventListener(MouseEvent.CLICK, move); // слушатель клика на каждую плитку
addChild(matrix[i][j]);
}
}
newRandGame();
}
// обработка клика на плику, перемещение плит
private function move(e:MouseEvent):void {
var currNumber:int = e.currentTarget.number; // сохраняем номер текущей плитки
if (currNumber != 0 && !flagVictory) { // если это не пустое поле и не победное положение, то продолжаем
var numberStr:String = String(currNumber) // номер текущей плитки запишем в строку
var i:int = e.currentTarget.i; // сохраним координаты плитки в матрице
var j:int = e.currentTarget.j;
var flag:Boolean = false; // флаг для определения завершения хода
for (var k:int = 0; k < 4; k++ ) { // нам нужно проверить наличие пустой плитки с четырёх сторон
switch(k) {
case 0 :{
if (i+1 < 4 && matrix[i + 1][j].number == 0) { // если плитка не крайняя и снизу есть пустое поле, то
matrix[i + 1][j].tileMc.gotoAndStop(1); // пустое поле превращаем в плитку
matrix[i + 1][j].tileMc.Number_field.text = numberStr; // задаем новой плитке строку с числом
matrix[i + 1][j].number = currNumber; // теперь новая плитка превратилась в ту, на которую мы нажали
flag = true; // говорим что ход заврешен
};
break;
}
case 1 :{
if (j+1 < 4 && matrix[i][j+1].number == 0) {
matrix[i][j + 1].tileMc.gotoAndStop(1);
matrix[i][j+1].tileMc.Number_field.text = numberStr;
matrix[i][j + 1].number = currNumber;
flag = true;
};
break;
}
case 2 :{
if (i-1 > -1 && matrix[i - 1][j].number == 0) {
matrix[i - 1][j].tileMc.gotoAndStop(1);
matrix[i - 1][j].tileMc.Number_field.text = numberStr;
matrix[i - 1][j].number = currNumber;
flag = true;
};
break;
}
case 3 :{
if (j-1 > -1 && matrix[i][j-1].number == 0) {
matrix[i][j - 1].tileMc.gotoAndStop(1);
matrix[i][j - 1].tileMc.Number_field.text = numberStr;
matrix[i][j - 1].number = currNumber;
flag = true;
};
break;
}
}
if (flag) { // если ход завершен
matrix[i][j].number = 0; // текущую плитку делаем пустым полем
e.currentTarget.tileMc.gotoAndStop(2);
moveCount++; // счетчик ходов
countMc.Count_field.text = String(moveCount); // увеличиваем счетчик
if(check()) flagVictory=true; // проверка на победу
break;
}
}
}
}
// функция создания новой игры
private function newRandGame(e:MouseEvent = null):void {
flagVictory = false; // сброс флага победы
moveCount=0; // сброс счетчика ходов
countMc.Count_field.text = String(moveCount);
var tempcount:int = 0; // временная переменная для присвоения занчений в массиве
random(); // генерируем рандомную последовательность от 1 до 15 в массив
for (var j:int = 0; j < 4; j++ ) { // в двойном цикле пишем рандомную последовательность в нашу матрицу
for (var i:int = 0; i < 4; i++ ) {
matrix[i][j].tileMc.gotoAndStop(1);
matrix[i][j].tileMc.Number_field.text = String(randomMas[tempcount]);
matrix[i][j].number = randomMas[tempcount];
tempcount++;
}
}
matrix[3][3].tileMc.gotoAndStop(2); // плитку в правом нижнем углу делаем пустым полем
matrix[3][3].number = 0;
}
// создание масива с рандомной последовательностью от 1 до 15
private function random():void {
var flag:Boolean = true;
var temp:int = 0;
var count:int = 0;
for (var k:int = 0; k < 16; k++ ) randomMas[k]=0 // обнуляем массив
for (var j:int = 0; j <15; j++ ) { // в цикле создаем и записываем в массив 15 чисел
while (flag) { // этот цикл работает до тех пор, пока не сгенерируется число, которого еще нет в массиве
if (count == 15) break;
temp = 15 * Math.random() + 1;
flag = false;
for (var i:int = 0; i < 16; i++ ) { // цикл проверяет сгенерированное число, на его наличие в массиве
if (randomMas[i] == temp) { flag = true; break; }
}
}
randomMas[j] = temp;
count++;
flag = true;
}
}
// проверка победы
private function check():Boolean {
// сравниваем текущую матрицу плиток с эталонной матрицей
for (var j:int = 0; j < 4; j++ ) {
for (var i:int = 0; i < 4; i++ ) {
if (matrix[i][j].number != checkMatrix[j][i]) {
return false;
}
}}
return true;
}
}
}
Здесь мы создаём, расставляем графику, присваиваем плиткам необходимые параметры.
Сами плитки мы не двигаем по полю. Мы всего лишь присваиваем новые параметры необходимой плитке (номер кадра, положение в матрице, число на плитке) исходя из её положения в матрице.
Теперь посмотрим как устроен класс "Tile"
package
{
import flash.display.Sprite;
/**
* ...
* @author RablV
*/
public class Tile extends Sprite
{
public var i:int; // положение в матрице
public var j:int;
public var number:int; // номер плитки
public var tileMc:Tile_mc;
public function Tile()
{
tileMc = new Tile_mc();
addChild(tileMc);
}
}
}
Здесь всё просто. Три параметра и собственно сама плитка из нашей библиотеки SWC.
Ну и последний листинг класса "Main"
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.display.SimpleButton;
/**
* ...
* @author RablV
*/
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var game:Game = new Game(); // создаём новую игру
addChild(game);
}
}
}
Здесь просто создаётся игра, с помощью класса Game.
И так, игру мы написали, теперь можно её скомпилировать и запустить.
В итоге у нас должно получиться вот что:
Плитки расставляются случайным образом. Начать новую игру можно на кнопку "Рестарт". Счетчик ходов считает ходы. Как только мы собираем головоломку, совершать ходы больше не получится - это будет считаться победой.
Проект с игрой можно скачать по ссылке.
На этом всё. В следующей статье мы попробуем портировать наши "Пятнашки" на Андроид с помощью технологии Adobe Air
Комментариев нет:
Отправить комментарий