제어문[Learning JavaScript]

제어문

/* 크라운 앤 앵커
* 평평한 면 위에 여섯개의 사각형이 있다.
* 각 사각형에는 크라운, 앵커, 하트, 클럽, 스페이드, 다이아몬드를 나타내는 그림이 있다.
* 플레이어는 그 사각형에 마음대로 돈을 걸 수 있다.
* 돈을 건 다음 평면에 있는 사각형 숫자와 일치하는 6면체 주사위 3개를 굴린다.
* 주사위가 사각형과 일치하는 숫자에 멈추면, 거기 건만큼의 돈을 따게 된다.
*/


/*
  기능 :
  1. 50펜스로 시작한다
  2. 100펜스를 따거나 50펜스 전부를 일으면 게임 긑
  3. 돈을 건다.
  4. 주사위를 굴린다.
  5. 그림을 맞추면 돈을 가져간다.
*/

//m이상 n이하의 무작위 정수를 반황
function rand(m, n) {
  return m + Math.floor((n-m+1)*Math.random());
}

//크라운 앤 앵커 게임의 여섯 그림중 하나에 해당하는 문자열을 무작위로 반환
function randFace() {
  return ["crown", "anchor", "heart", "spade", "club", "diamond"][rand(0,5)];
}

//초기 50펜스
let funds = 50;
//게임횟수
let round = 0;

//가지고 있는 돈이 0이상이고 100이하이면 게임 계속 진행
while( funds > 0 && funds < 100) { //while 문
  round++;

  console.log( `round : ${round}`);
  console.log( `funds : ${funds}`);

  let bets = {
    crown : 0
    , anchor : 0
    , heart : 0
    , spade : 0
    , club : 0
    , diamond : 0
  };

  let totalBet = rand(1, funds);

  //총 배팅금액이 7 이면 하트에 올인
  if(totalBet === 7) {
    totalBet = funds;
    bets.heart = totalBet;
  } else {
    //판돈을 나눈다.
    let remaining = totalBet;
    do {
      let bet = rand(1, remaining);
      let face = randFace();
      bets[face] = bets[face] + bet;
      remaining = remaining - bet;
    } while(remaining > 0)
  }

  funds = funds - totalBet;

  console.log('\tbets : ' +
                Object.keys(bets).map(face => `${face} : ${bets[face]} pence`).join(',')+
                `(total : ${totalBet} pence)`);

  //주사위를 굴린다
  const hand = [];
  for(let roll = 0; roll < 3; roll++) { //for문
    hand.push(randFace());
  }

  console.log(`\thand: ${hand.join(',')}`);

  //딴 돈을 회수
  let winnings = 0;
  for(let die=0; die < hand.length; die++) {
    let face = hand[die];
    if(bets[face] > 0) winnings = winnings + bets[face];
  }

  funds = funds + winnings;
  console.log(`\twinnings: ${winnings}`);
}

console.log(`\tending funds : ${funds}`);
  • 제어문은 크게 조건문과 반복문 두 가지 범주로 나뉜다.

제어문의 예외

  • break : 루프 중간에 빠져나간다.
  • continue : 루프에서 다음 단계로 바로 건너뛴다.
  • return : 제어문을 무시하고 현재 함수를 즉시 빠져나간다.
  • throw : 예외 핸들러에서 반드시 처리해야 할 예외를 일으킨다.

메타문법

  • 자바스크립트 제어문의 문법을 간결하게 표기한다.
  • [] : 옵션
  • (..) : ‘여기 들어갈 내용이 더 있다.’
  • 단어는 플레이스홀더로 사용
//while문 :  condition이 참 같은 값이면 statement를 실행
while(condition)
	statement
    
//if..else문 : condition이 참 값이면 statement1을 실행 그렇지 않으면 else를 실행
if(condition)
	statement1
[else
	statement2]
    
//do..while
do
	statement
while(condition);

//for문 : 루프 들어가기전에 initialization을 실행. 
// condition값이 true인 동안 statement를 실행하고, final-expression을 실행.
// 그후 condition값을 다시 체크
for([initialization]; [condition]; [final-expression])
	statement

for루프의 다른 패턴

  • 쉼표 연사자를 쓰면 초기화와 마지막 표현식에 여러 문을 결합할 수 있다.
 //피보나치 수열의 숫자 중 처음 여덟개를 출력
 for(let temp, i=0, j=1; j<30; temp=i, i=j, j=i+temp)
 	console.log(j);
  • for 루프는 보통 정수 인덱스를 늘이거나 줄이면서 반복하지만, 어떤 표현식이든 쓸 수 있다.
let s = '3'; //숫자가 들어있는 문자열

//문자열의 길이를 조건으로 사용.
//여기서 사용한 for 루프의 마지막에 세미콜론이 없으면 에러가 난다.
for(; s.length<10; s = ' '+s); 

//제어 변수가 정수가 아니어도 괜찮다.
for(let x=0.2; x<3.0; x+= 0.2)
	console.log(x)

//조건에 객체 프로퍼티가 들어가도 괜찮다.
for(; !player.isBroke;)
	console.log('play');