Flash CS4 + ActionScript 3.0로 99병의 맥주 프로그래밍 하기.

웹 서핑 중 99병의 맥주 -한 병도 남지 않을 때까지 반복문과 분기문을 이용해 노래를 계속 수행하는 프로그래밍 항목을 보고 http://www.99-bottles-of-beer.net/에서 여러 언어로 짜여진 99병의 맥주 출력 코드를 볼 수 있다 하여 가 보고 액션스크립트 코드가 있기에 긁어 테스트해 봤는데 이전 AS 2.0 코드라 실행되지 않았다. 하여 3.0으로 고치고 기능들을 추가하다.

화면은 텅 비워 둔 상태로 액션스크립트 코드로만 화면 구성하고 작동하게 만들었다.
간만에 동적으로 생성되는 텍스트필드 작업.
동적으로 맥주 무비클립 만들고 그 무비클립 안에 그림 그리고 텍스트 필드를 만들어 붙여 넣은 뒤 맥주의 번호를 써넣기.
숫자를 한글로 표현하게 처리.

* 나중에 보니 20단위에서 딱 20일 때 '스물 병'이라는 에러가 나온다. '스무 병'으로 바꿔야 해서 코드를 살짝 수정하다.

15/6/11 목

var beerArr:Array=new Array(); //맥주들 담을 배열
var num10Arr:Array=["","열","스물","서른","마흔","쉰","예순","일흔","여든","아흔"];//10자리 숫자 한글
var num01Arr:Array=["빵","한","두","세","네","다섯","여섯","일곱","여덟","아홉"];//1자리 숫자 한글
var beerHolder:MovieClip=new MovieClip(); //맥주들 무비 담을 무비클립
var secTimer:Timer=new Timer(1000); //1초 타이머
var timerNum:int; //맥주 카운팅용 변수
var beerMaxNum:int = 99; //최대 맥주수
var exp:TextField=new TextField(); //설명용 텍스트 필드
var titleT:TextField=new TextField(); //타이틀용 텍스트 필드
var sign:TextField=new TextField(); //날자, 사인용 텍스트 필드

function init(){
	timerNum = beerMaxNum;
	stage.addChild(exp); //설명용 텍스트 필드 화면에 추가
	exp.x = 20, exp.y = 300;
	exp.width=400;
	exp.scrollH=3; exp.scrollV=3;
	//exp.mouseWheelEnabled;//마우스 휠 사용 가능
	//exp.background=true;
	//exp.backgroundColor=0xECF2F9;
	exp.text = "";
	exp.text = numToText((timerNum))+" 병의 맥주가 벽장에 있네, "+numToText((timerNum))+" 병의 맥주라네.";
	stage.addChild(titleT);
	titleT.x=220, titleT.y=10, titleT.width=300;
	titleT.text = "아흔아홉병의 맥주";
	stage.addChild(sign);
	sign.x=430, sign.y=380, sign.width=300;
	sign.text = "2015/6/11 木 바람들들";
	
	stage.addChild(beerHolder); //맥주들 무비클립 담을 무비클립 화면 추가
	beerMovInit(); //맥주들 무비클립 생성, 초기화, 배열에 넣기
	secTimer.addEventListener(TimerEvent.TIMER, inTime);
	secTimer.start();
}
function inTime(e:TimerEvent){ //타이머 작동시 처리
	timerNum--;
	if(timerNum >= 0){
		beerHolder.getChildByName("br"+timerNum).alpha = 0.2;
		exp.text = numToText((timerNum+1))+"병의 맥주가 벽장에 있네,"+numToText((timerNum+1))+"병의 맥주라네";
		exp.appendText("\n하나를 내려서 넘겨주었네,"+numToText(timerNum)+"병의 맥주가 벽장에 있네.");
		if(timerNum==0) exp.text = "더 이상 벽장에 맥주가 없네.";
	}else{
		while(beerHolder.numChildren){ beerHolder.removeChildAt(0); }
		beerArr = [];
		exp.text = "이제 맥주는 없다네.\n가게에 가서 더 사왔네,"+numToText(beerMaxNum)+"병의 맥주가 벽장에 있네";
		secTimer.stop(); //타이머 정지
		init();
	}
}
function numToText(num:int){ //숫자 한글로 변환
	var ten, one, numText;
	ten = int(num / 10); //십자리 수 분리 저장
	one = num % 10; //한자리 수 분리 저장
	if(num > 9){ //10 이상일 때
		numText = num10Arr[ten] + num01Arr[one];
		if(num == 20) numText = "스무"; //20일 때
	}else{ //한 자리 수 일 때
		numText = num01Arr[one];
	}
	return numText;
}
function beerMovInit(){ //맥주들 무비클립 생성, 초기화, 배열에 넣기
	for(var i=0; i < beerMaxNum; i++){
		var m:MovieClip=new MovieClip(); //새 빈 무비클립 만들기
		m.name = "br"+i;
		m.t=new TextField(); //맥주 무비클립 내 텍스트필드 만들기
		m.t.x =-15, m.t.y = -15;
		m.t.text = i+1;
		m.addChild(m.t);
		m.x = 30 + i % 20 * 25;
		m.y = 70 + Math.floor(i/20)*50; 
		
		m.graphics.lineStyle(1,0); //맥주 병 그래픽 그리기
		m.graphics.moveTo(0, 0);
		m.graphics.lineTo(0, -10);
		m.graphics.lineTo(-5, -15);
		m.graphics.lineTo(-5, -20);
		m.graphics.lineTo(-10, -20);
		m.graphics.lineTo(-10, -15);
		m.graphics.lineTo(-15, -10);
		m.graphics.lineTo(-15, 0);
		m.graphics.lineTo(0, 0);
		
		beerHolder.addChild(m); //화면에 추가하여 표시
		beerArr.push(m); //배열에 추가
	}
}
init();