clisp 책보고 공부하다가 컴퓨터에게 내가 생각한 숫자 맞추게 하기 예제를 따라해보다.

[숫자 맞추게하기 CLISP 코드]

(defParameter *max* 100)
(defParameter *min* 1)
(defun guessMyNumber() (ash(+ *max* *min*) -1))
(defun smaller() (setf *max* (1- (guessMyNumber))) (guessMyNumber))
(defun bigger() (setf *min* (1+ (guessMyNumber))) (guessMyNumber))
(defun newGuess() (setf *max* 100)(setf *min* 1) (guessMyNumber))

대충 위와 같은 형태였는데 역시 이 괄호괄호 언어인 clisp은 일반적인 프로그래밍 언어와는 달리 생소하게 느껴지는 부분들이 많다. 위 예제는 책의 극초반 부분이라 아직 그리 엄청나게 다를 것 까진 없다만. 예제는 전역변수 2개와 전역함수 4개를 설정하는 코드들이다. 실행시 (guessmynumber)로 시작하고 컴퓨터가 숫자를 추측해 내놓으면 자신이 생각한 숫자와 비교해 (smaller) 혹은 (bigger)로 응하면 된다. 그리고 새로 시작할 경우에는 (newGuess) 함수로 재시작.

문득 플래시 액션스크립트로 만들어보면 어떨까해서 만들어 보다.

[숫자 맞추게 하기 플래시 액션스크립트 코드]-그렇잖아도 clisp에 비해 긴 코드인데 이것저것 인터페이스 등을 덕지덕지 덧붙이고 하다보니 코드가 길어졌다.
핵심이랄 수 있는 숫자 추측하는 알고리즘의 경우 위 clisp은 절반씩 나눠 가며 찾는 방식인데 이 절반씩 나눠 찾기 방식이 너무 단조롭게 느껴져 액션스크립트 코드에서는 일단 대충 찍고 그 안에서 다시 찍어 가며 찾는 방식을 택했다.

var max:uint=100;
var min:int=1;
var tempNum:uint;
var tryNum:uint=0;

function preGame(){
screenM.gotoAndStop("start");
screenM.startGame.addEventListener(MouseEvent.CLICK,startGame);
}

function startGame(e:MouseEvent){
screenM.gotoAndStop("game");
//screenM.startGame.removeEventListener(MouseEvent.CLICK,startGame);
GameInit();
}

function backTitle(e:MouseEvent){
max = 100; min = 1; tryNum = 0;
preGame();
}

function GameInit(){
guessMyNumber();
bigger.gotoAndStop("on");
smaller.gotoAndStop("on");
ok.gotoAndStop("on");
newGame.gotoAndStop("off");
title.gotoAndStop("off");
bigger.addEventListener(MouseEvent.CLICK,bigHandle);
smaller.addEventListener(MouseEvent.CLICK,smallHandle);
ok.addEventListener(MouseEvent.CLICK,okHandle);
newGame.addEventListener(MouseEvent.CLICK,newGuess);
title.addEventListener(MouseEvent.CLICK,backTitle);
}

function guessMyNumber(){
comBar.minBar.scaleX = min/100;
comBar.maxBar.scaleX = 1-(max/100);
comBar.minNum.x = 370*(min/100);
comBar.maxNum.x = 370-(370*(1-max/100));
comBar.minNum.txt.text = min-1;
comBar.maxNum.txt.text = max+1;

//tempNum = Math.floor((max+min)/2); //clisp코드와 비슷한 분할 찾기 방식
tempNum = Math.floor(Math.random()*(max-min))+min; //범위내 찍기 방식
NumText.text = String(tempNum);
expText.text ="인가요?";
tryNum++;
checkNumber();
}

function checkNumber(){
if(min == max){
tempNum = max;
rightNumber();
}
}

function bigHandle(e:MouseEvent){
min = tempNum + 1;
guessMyNumber();
}

function smallHandle(e:MouseEvent){
if(max>0){ max = tempNum - 1; }
guessMyNumber();
}

function okHandle(e:MouseEvent){ rightNumber(); }

function rightNumber(){
NumText.text ="^_^";
expText.text =tempNum+"이었군요.\n"+tryNum+"번만에 맞췄네요.";
bigger.gotoAndStop("off");
smaller.gotoAndStop("off");
ok.gotoAndStop("off");
newGame.gotoAndStop("on");
title.gotoAndStop("on");
bigger.removeEventListener(MouseEvent.CLICK,bigHandle);
smaller.removeEventListener(MouseEvent.CLICK,smallHandle);
}

function newGuess(e:MouseEvent){
max = 100; min = 1; tryNum = 0;
bigger.gotoAndStop("on");
smaller.gotoAndStop("on");
ok.gotoAndStop("on");
newGame.gotoAndStop("off");
title.gotoAndStop("off");
comBar.minBar.scaleX = 0;
comBar.maxBar.scaleX = 0.01;
comBar.minNum.x=0;
comBar.maxNum.x=370;
comBar.minNum.txt.text = 1;
comBar.maxNum.txt.text = 100;

guessMyNumber();
bigger.addEventListener(MouseEvent.CLICK,bigHandle);
smaller.addEventListener(MouseEvent.CLICK,smallHandle);
}

preGame();

13/01/12 토