Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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();
}

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

Старый 16.04.2010, 02:25
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 2  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 612
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
Код AS3:
(x > 0) && (x < 10) && (y > 0) && (y < 10)
- клетка должна попасть в координаты от 1 до 9 (хм это уже на 19 клеток меньше чем на поле 10х10)

Код AS3:
	x = Math.floor(Math.random() * 10); 
y = Math.floor(Math.random() * 10);
Тут x, y беруться от 0 до 9 (так как Math.floor(Math.random()) - всегда 0)

Дальше разбираться не стал.

Старый 16.04.2010, 12:45
N1kk_ вне форума Посмотреть профиль Отправить личное сообщение для N1kk_ Найти все сообщения от N1kk_
  № 3  
Ответить с цитированием
N1kk_

Регистрация: Apr 2010
Сообщений: 4
Сделал так:
Код AS3:
(x >= 0) && (x < 10) && (y >= 0) && (y < 10)
Массив, который представляет поле 10x10 индексируется у меня от 0..9. Значит и координаты берутся рандомно от 0 до 9ти. Мне кажется дело не в этом Раз на c++ работает тот же код.... Может просто я не знаю каких-то особенностей языка AS3 из-за которых программа не хочет работать?

Старый 16.04.2010, 17:03
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 4  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 612
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
Две вещи неправильны:
1) Корабли всегда выбирают одно направление. Правильно:
Код AS3:
directionX = Math.floor(Math.random() + 0.5);
2) Функция init выглядит так:
Код AS3:
private function init() : void
{
	fieldArray = [];
	for (var i: int = 0; i < MAX_ROWS; i++){
		fieldArray[i] = [];
		for (var j: int = 0; j < MAX_ROWS; j++){
			fieldArray[i][j] = 0;
		}
	}
}
В твоём варианте - каждый ряд это один и тот же массив. То есть при добавлении 1 в (1,1) еденица будет и (1,2), (1,3) ... (1,10) так как fieldArray[1] = fieldArray[2] и.т.д


Последний раз редактировалось Rzer; 16.04.2010 в 17:52.
Старый 17.04.2010, 12:49
N1kk_ вне форума Посмотреть профиль Отправить личное сообщение для N1kk_ Найти все сообщения от N1kk_
  № 5  
Ответить с цитированием
N1kk_

Регистрация: Apr 2010
Сообщений: 4
Все, заработало! Спасибо, Rzer! Значит я неправильно создавал двумерный массив....

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:23.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:23.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.