Показать сообщение отдельно
Старый 15.04.2010, 22:08
N1kk_ вне форума Посмотреть профиль Отправить личное сообщение для N1kk_ Найти все сообщения от N1kk_
  № 1  
Ответить с цитированием
N1kk_

Регистрация: Apr 2010
Сообщений: 4
Attention не запускается по непонятным причинам

Всем привет!
Сразу оговорюсь - пишу на AS3 недавно и вот решил сделать морской бой
Процесс дошел до написания метода, который расстанавливал бы корабли на игровом поле. Вроде реализовал алгоритм, но почему-то не работает Запускаю флешку - жрет ресурсы процессора и, видимо, не может выйти из цикла do-while. Что самое интересное: тот же алгоритм, реализованный на C++ (в Visual Studio) прекрасно работает (даже посчитал количество итераций цикла - около 50 получается). Пишу во FlashDevelop.
Вот код метода:
Код AS3:
// Генератор расстановки кораблей
private function placementGenerator() : void
{
	// возвращает истину, если можно поместить однопалубный корабль в клетку
	// с координатами x, y То есть если эта клетка в массиве
           // fieldArray равна 0, и восемь ее соседних клеток тоже нулевые
	private function isFreeCell(x: int, y: int) : Boolean
	{
		// приращения для определения восьми соседних клеток 
		var buf: Array = new Array([0, 1], [1, 0], [0, -1], [-1, 0], 
						[1, 1], [-1, 1], [1, -1], [ -1, -1]);
 
		var dx: int;
		var dy: int;
 
		// если клетка свободна
		if ((x > 0) && (x < 10) && (y > 0) && (y < 10) && (fieldArray[x][y] == 0))
		{
			// проверяем 8 соседних клеток
			var i: int;
			for (i = 0; i < 8; i++)
			{
				dx = x + buf[i][0];
				dy = y + buf[i][1];
				// если занята соседняя клетка....
				if ((dx > 0) && (dx < 10) && (dy > 0) && (dy < 10) && fieldArray[dx][dy] == 1) 
					return false;
			}		
			return true;
		} else 
			return false;
	}		
	var x: int; // координаты корабля
	var y: int; 
	var directionX: int; // направление корабля (вертикально или горизонтально)
	var directionY: int;
	var done: Boolean;
 
           // размещаем корабли
	// начиная от 4х-палубного до однопалубных
	for (var deck: int = 4; deck > -1; deck--)
	{
		// Количество кораблей
		for (var n: int = 1; n <= (4 - deck); n++)
		{
			do 
			{
				// получаем случайные координаты
				x = Math.floor(Math.random() * 10); 
				y = Math.floor(Math.random() * 10); 		
				directionX = Math.floor(Math.random());
 
				if (directionX == 0) directionY = 1 else directionY = 0;
 
				// определяем возможность разместить корабль
				done = true;
				var i: int;	
 
				for (i = 0; i <= deck; i++)
					if (isFreeCell(x + directionX * i, y + directionY * i) == false) 
						done = false;
 
				// если успешно, то размещаем
				if (done)	
				{
					trace("done");
					for (i = 0; i <= deck; i++)
						fieldArray[x + directionX * i][y + directionY * i] = 1;
				}
			} while (done == false);	
		}
	}			
}
Вот код конструктора класса, содержащего этот метод. Ну и еще метод инициализации массива..
Код AS1/AS2:
private static const MAX_ROWS: int = 10;
private var fieldRow: Array;		
private var fieldArray: Array; 
 
public function GameField() 
{
	init();
	placementGenerator();
	//dispose();
}
 
// Initializing
private function init() : void
{
	fieldRow = new Array(MAX_ROWS);
	fieldArray = new Array(fieldRow, fieldRow, fieldRow, fieldRow, fieldRow, 
							fieldRow, fieldRow, fieldRow, fieldRow, fieldRow);
 
	for (var i: int = 0; i < MAX_ROWS; i++)
		for (var j: int = 0; j < MAX_ROWS; j++)
			fieldArray[i][j] = 0;
}
Ну и все это дело вызывается из основного класса программы таким образом:
Код AS3:
 
public function Main()
{
	var field: GameField = new GameField();
}

В чем может быть проблема? Второй день бьюсь