Тема: Алгоритмы Работа с массивами [UPDATE]
Показать сообщение отдельно
Старый 14.02.2014, 18:17
australian incognito вне форума Посмотреть профиль Отправить личное сообщение для australian incognito Найти все сообщения от australian incognito
  № 1  
Ответить с цитированием
australian incognito
 
Аватар для australian incognito

Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
Post Работа с массивами [UPDATE]

Задам вопрос в контексте недавно созданной темы: http://www.flasher.ru/forum/showthread.php?t=206574
Ниже описан применяемый мной алгоритм, но главный вопрос: почему при трейсе 'rand num' не совпадают с 'res num'? Как сделать, чтобы совпадали и логика, заложенная ниже работала верно?
Код AS3:
import flash.events.Event;
 
var objNum:Number = 10;
var objArr:Array = new Array();
var enabledObjArr:Array = new Array();
var prevObjArr:Array = new Array();
//
var entFrParam:Number = 0;
var entFrParamMax:Number = 60;
 
function mainFunc(e:Event):void
{
	var i:int;
	//
	if (entFrParam++ == entFrParamMax)
	{
		trace("\n\n///////// rand num:")
		//
		entFrParam = 0;
		//
		prevObjArr = getRandElements(objArr,4,prevObjArr);
		//
		for (i = 0; i < prevObjArr.length; i++)
		{
			//trace(prevObjArr[i].name)
			enabledObjArr.push(prevObjArr[i]);
			//
			trace(prevObjArr[i].name);
		}
		trace("///////// res num:")
	}
	//
	for (i = 0; i < enabledObjArr.length; i++)
	{
		process(enabledObjArr[i], 60);
		//
		if (enabledObjArr[i].degree >= 360)
		{
			trace(enabledObjArr[i].name);
			//
			enabledObjArr.shift();
		}
	}
}
 
function getRandElements(arr:Array, n:int, exclude:Array):Array
{
	var i:int;
	var tmp:Array = arr.concat();
	var res:Array = [];
 
	// убираем исключаемые
	for (i = 0; i < exclude.length; i++)
	{
		tmp.splice(tmp.indexOf(exclude[i]), 1);
	}
	// выбираем из оставшихся рандомно
	for (i = 0; i < n; i++)
	{
		var rnd:int = Math.random() * tmp.length;
		res.push(tmp[rnd]);
		tmp.splice(rnd, 1);
	}
 
	// возвращаем нужный массив
	return res;
}
 
function process(obj:Object, speed:Number)
{
	obj.degree +=  speed;
}
 
for (var i = 0; i < objNum; i++)
{
	objArr[i] = new Object();
	objArr[i].name = i;
	objArr[i].degree = 0;
}
//
this.addEventListener(Event.ENTER_FRAME, mainFunc);