|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Apr 2010
Сообщений: 4
|
не запускается по непонятным причинам
Всем привет!
Сразу оговорюсь - пишу на AS3 недавно и вот решил сделать морской бой Процесс дошел до написания метода, который расстанавливал бы корабли на игровом поле. Вроде реализовал алгоритм, но почему-то не работает Запускаю флешку - жрет ресурсы процессора и, видимо, не может выйти из цикла do-while. Что самое интересное: тот же алгоритм, реализованный на C++ (в Visual Studio) прекрасно работает (даже посчитал количество итераций цикла - около 50 получается). Пишу во FlashDevelop. Вот код метода: // Генератор расстановки кораблей 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); } } } 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; } В чем может быть проблема? Второй день бьюсь |
|
|||||
- клетка должна попасть в координаты от 1 до 9 (хм это уже на 19 клеток меньше чем на поле 10х10)
Тут x, y беруться от 0 до 9 (так как Math.floor(Math.random()) - всегда 0) Дальше разбираться не стал.
__________________
if (love is true) break my.heart; |
|
|||||
Регистрация: Apr 2010
Сообщений: 4
|
Сделал так:
Массив, который представляет поле 10x10 индексируется у меня от 0..9. Значит и координаты берутся рандомно от 0 до 9ти. Мне кажется дело не в этом Раз на c++ работает тот же код.... Может просто я не знаю каких-то особенностей языка AS3 из-за которых программа не хочет работать? |
|
|||||
Две вещи неправильны:
1) Корабли всегда выбирают одно направление. Правильно: 2) Функция init выглядит так: В твоём варианте - каждый ряд это один и тот же массив. То есть при добавлении 1 в (1,1) еденица будет и (1,2), (1,3) ... (1,10) так как fieldArray[1] = fieldArray[2] и.т.д
__________________
if (love is true) break my.heart; Последний раз редактировалось Rzer; 16.04.2010 в 17:52. |
|
|||||
Регистрация: Apr 2010
Сообщений: 4
|
Все, заработало! Спасибо, Rzer! Значит я неправильно создавал двумерный массив....
|
Часовой пояс GMT +4, время: 23:23. |
|
« Предыдущая тема | Следующая тема » |
|
|