제어문
/* 크라운 앤 앵커
* 평평한 면 위에 여섯개의 사각형이 있다.
* 각 사각형에는 크라운, 앵커, 하트, 클럽, 스페이드, 다이아몬드를 나타내는 그림이 있다.
* 플레이어는 그 사각형에 마음대로 돈을 걸 수 있다.
* 돈을 건 다음 평면에 있는 사각형 숫자와 일치하는 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');