Всем привет!
Сразу оговорюсь - пишу на 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();
}
В чем может быть проблема? Второй день бьюсь
