Показать сообщение отдельно
Старый 11.06.2013, 19:36
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Переделал:
Код AS3:
package 
{
	// импортируем классы
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
	// конец импорта классов 
	public class Main extends Sprite
	{
		// переменные класса 
		private const FIELD_W:uint = 9;
		private const FIELD_H:uint = 9;
		private const NUM_MINES:uint = 10;
		private var mineField:Array = new Array();
		private var game_container:Sprite = new Sprite();
		private var tile:tile_movieclip;
		private var timer:Timer = new Timer(1000);
		private var toolbar:toolbar_mc;
		private var gameOver:Boolean = false;
		private var firstClick:Boolean = true;
		// конец записи переменных класса
		public function Main()
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// создаем минное поле 
			for (var i:uint = 0; i < FIELD_H; i++)
			{
				mineField[i] = new Array();
				for (var j:uint = 0; j < FIELD_W; j++)
				{
					mineField[i].push(0);
				}
			}
			// конец создания минного поля
			// создание плиток
			addChild(game_container);
			for (i = 0; i < FIELD_H; i++)
			{
				for (j = 0; j < FIELD_W; j++)
				{
					tile = new tile_movieclip();
					game_container.addChild(tile);
					tile.gotoAndStop(1);
					tile.nrow = i;
					tile.ncol = j;
					tile.buttonMode = true;
					tile.x = 140 + tile.width * j;
					tile.y = 65 + tile.height * i;
					tile.addEventListener(MouseEvent.CLICK, onTileClicked);
				}
			}
			// конец создания плиток
			// управление временем и конец игры
			toolbar = new toolbar_mc();
			addChild(toolbar);
			toolbar.y = stage.stageHeight - toolbar.height;
			timer.start();
			timer.addEventListener(TimerEvent.TIMER, onTick);
			// конец управления временем и окончания игры
		}
		private function tileValue(row,col:uint):int
		{
			if (mineField[row] == undefined || mineField[row][col] == undefined)
			{
				return -1;
			}
			else
			{
				return mineField[row][col];
			}
		}
		private function onTileClicked(e:MouseEvent):void
		{
			if (!gameOver)
			{
				var clicked_tile:tile_movieclip = e.currentTarget as tile_movieclip;
				var clickedRow:uint = clicked_tile.nrow;
				var clickedCol:uint = clicked_tile.ncol;
				if (firstClick)
				{
					firstClick = false;
					// минируем поле
					var placedMines:uint = 0;
					var randomRow,randomCol:uint;
					while (placedMines < NUM_MINES)
					{
						randomRow = Math.floor(Math.random() * FIELD_H);
						randomCol = Math.floor(Math.random() * FIELD_W);
						if (mineField[randomRow][randomCol] == 0)
						{
							if (randomRow != clickedRow || randomCol != clickedCol)
							{ 
								mineField[randomRow][randomCol] = 9; 
								placedMines++; 
							}
						}
					}
					// конец минирования поля
					// помещаем цифры
					for (var i = 0; i < FIELD_H; i++)
					{
						for (var j = 0; j < FIELD_W; j++)
						{
							if (mineField[i][j] == 9)
							{
								for (var ii:int = -1; ii <= 1; ii++)
								{
									for (var jj:int =- 1; jj <= 1; jj++)
									{
										if (ii != 0 || jj != 0)
										{
											if (tileValue(i+ii,j+jj) != 9 && tileValue(i+ii,j+jj) != -1)
											{
												mineField[i + ii][j + jj]++;
											}
										}
									}
								}
							}
						}
					}
					var debugString:String;
 
					for (i = 0; i < FIELD_H; i++)
					{
						debugString = "";
						for (j = 0; j < FIELD_W; j++)
						{
							debugString +=  mineField[i][j] + " ";
						}
						trace(debugString);
					}
					// конец помещения цифр
				}
				var clickedValue:uint = mineField[clickedRow][clickedCol];
				if (e.shiftKey)
				{
					clicked_tile.gotoAndStop(5 - clicked_tile.currentFrame);
				}
				else
				{
					if (clicked_tile.currentFrame == 1)
					{
						clicked_tile.removeEventListener(MouseEvent.CLICK, onTileClicked);
						clicked_tile.buttonMode = false;
						// пустая плитка 
						if (clickedValue == 0)
						{
							floodFill(clickedRow, clickedCol);
						}
						// конец пустой плитки 
						// плитка с цифрой 
						if (clickedValue > 0 && clickedValue < 9)
						{
							clicked_tile.gotoAndStop(2);
							clicked_tile.tile_text.text = clickedValue.toString();
						}
						// конец плитки с цифрой 
						// мина 
						if (clickedValue == 9)
						{
							clicked_tile.gotoAndStop(3);
							timer.removeEventListener(TimerEvent.TIMER, onTick);
							toolbar.message_text.text = "Вы подорвались на мине!";
							gameOver = true;
						}
						// конец мины ;
					}
				}
			}
		}
		private function onTick(e:TimerEvent):void
		{
			toolbar.message_text.text = "Время игры: " + e.target.currentCount + " сек.";
		}
		private function floodFill(row,col:uint):void
		{
			var emptyTile:tile_movieclip;
			emptyTile = game_container.getChildAt(row * FIELD_W + col) as
			tile_movieclip;
			if (emptyTile.currentFrame == 1)
			{
				emptyTile.removeEventListener(MouseEvent.CLICK, onTileClicked);
				emptyTile.buttonMode = false;
				emptyTile.gotoAndStop(2);
				if (mineField[row][col] > 0)
				{
					emptyTile.tile_text.text = mineField[row][col].toString();
				}
				else
				{
					emptyTile.tile_text.text = "";
				}
				if (mineField[row][col] == 0)
				{
					for (var ii:int = -1; ii <= 1; ii++)
					{
						for (var jj:int = -1; jj <= 1; jj++)
						{
							if (ii != 0 || jj != 0)
							{
								if (tileValue(row + ii, col + jj) != 9)
								{
									if (tileValue(row + ii, col + jj) != -1)
									{
										floodFill(row + ii, col + jj);
									}
								}
							}
						}
					}
				}
			}
		}
	}
}
проблему и вызывала эта строка:
Код AS3:
toolbar.y = stage.stageHeight - toolbar.height;
в конструкторе здесь в stage обращаться нельзя

п.с. никаких вебмани не надо. Форум на то и создан, чтобы помогать просто так.