Flash CS4 + ActionScript 3.0으로 First In First Out 구조인 Que 구현하기 테스트.

키보드의 왼쪽 화살표 키 클릭, 혹은 마우스로 '큐에 추가하기 버튼' 클릭시 입력창에 넣은 숫자대로 배열 맨 뒤에 추가,
키보드의 오른쪽 화살표 키 클릭, 혹은 마우스로 '큐에서 제거하기 버튼' 클릭시 배열의 맨 앞에서 제거하는 큐 구조의 프로그램 만들고 비쥬얼적으로도 그렇게 보이게 하기.

새로 큐를 만들 때마다 새로 배열에 추가되는 수를 텍스트에 표시하는 무비클립을 추가하고 한 줄에 10개씩 나열되게 처리했다.
push로 추가, shift로 제거하며 추가,제거될 때마다 비쥬얼적으로도 그렇게 보이게 처리.

AS 3.0 배열의 메서드를 이용해(14/2/16일 일기 참조)
First In First Out 자료구조인 Que는 배열의 입출력을 push, shift로,
First In Last Out 자료구조인 Stack은 배열의 입출력을 push, pop으로 구현 가능.
배열의 맨 앞에 입력은 unshift로 구현할 수 있다.

15/4/19 일

화면에 'nv'란 이름의 새로 생성될 큐 무비클립들을 담을 사각형 무비클립과 'buttonIn', 'buttonOut' 란 이름의 사각버튼 모양 무비클립을 만들어 두다.
var queArr:Array = new Array(); //무비클립 담기용 배열
var queNumArr:Array = new Array(); //무비클립속 숫자 담기용 배열
var qNum = 0; //총 무비클립 수 저장용 변수
var nvX=0, nvY = 0; //nv 무비클립속 표시되는 무비클립 위치용 변수

function init(){
	stage.focus=inputText;
	qNum = 0;
	stage.addEventListener(KeyboardEvent.KEY_DOWN,kDown);
	buttonIn.addEventListener(MouseEvent.CLICK, mDown);
	buttonOut.addEventListener(MouseEvent.CLICK, mDown);
}
function queIn(){ //큐에 요소 넣기 처리
	var nq:MovieClip = new nemoM(); //새 무비클립 생성
	nq.num = Number(qNum); //총 숫자 체크용 변수
	nq.contents = Number(inputText.text); //내용은 입력창의 내용으로
	nq.t.text = String(nq.contents); //내용을 무비클립내 텍스트에 표시
	if(qNum < 10){ //첫 10개의 요소
		nvX =qNum*nq.width;
		nvY = 0;
	}else if(0 == qNum%10){ //매 11번째 요소
		nvX -= nq.width*9;
		nvY += nq.height;
	}else{ //그외
		nvX += nq.width;
	}
	nq.x = nvX; //무비클립 위치 지정
	nq.y = nvY;
	qNum++; //총 숫자 늘리기
	
	nv.addChild(nq); //회색 사각배경에 무비클립 추가하여 나타내기
	queArr.push(nq); //무비클립을 배열에 담기
	queNumArr.push(nq.contents); //무비클립 내용을 배열에 담기
	
	outputText.text = String(queNumArr); //배열내용 텍스트에 표시
}
function queOut(){ //큐에서 요소 빼기 처리
	if(qNum > 0){
		nv.removeChildAt(1); //회색 사각배경에서 무비클립 제거하여 안보이게
		queArr.shift(); //무비클립 맨 앞요소 배열에서 제거
		queNumArr.shift(); //무비클립 내용 맨 앞요소 배열에서 제거

		for(var i in queArr){ //무비클립 배열내 모든 요소에 적용
			if(i < 10){ //첫 10개의 요소
				nvX =i*queArr[i].width; 
				nvY = 0;
			}else if(0 == i%10){ //매 11번째 요소
				nvX -= queArr[i].width*9;
				nvY += queArr[i].height;
			}else{
				nvX += queArr[i].width;
			} //그외
			queArr[i].x = nvX; 
			queArr[i].y = nvY;
		}
		qNum--; //총 숫자 줄이기
		outputText.text = String(queNumArr); //배열내용 텍스트에 표시
	}else{
		outputText.text = "배열이 텅 비었음";
	}
}
function kDown(e:KeyboardEvent){ //키보드 처리
	//trace(e.keyCode);
	switch(e.keyCode){
		case 13: trace("enter"); break; //enter
		case 32: trace("space"); break; //space bar
		case 37: queIn(); break; //<- trace("queIn", qNum);
		case 39: queOut(); break; //->
		default: break;
	}
}
function mDown(e:MouseEvent){ //마우스 버튼 클릭시 처리
	//trace(e.currentTarget.name);
	if(e.currentTarget.name == "buttonIn"){
		queIn();
	}else if(e.currentTarget.name == "buttonOut"){
		queOut();
	}else{}
}

init();