23일차 - javascript (while, for)

Yohan·2024년 3월 22일
0

코딩기록

목록 보기
30/156
post-custom-banner

2-4. 제어문

break

  • for문에 이름 설정하여 이름에 맞는 for문을 break할 수 있다.
console.log("================");
grape: for (var i = 0; i < 3; i++) {
strawberry: for (var j = 0; j < 2; j++) {
    // 안쪽 for문만 break 걸림
    if (i === j) {
      break strawberry;
    }
    console.log(`${i},${j}`);
  }
}

무한 루프

  • 프로그램이 중단되지 않게 유지할 때도 무한루프를 사용

continue

  • 조건부로 특정 반복회차를 건너뛸 때 사용
  • skip 이라고 생각하면 편하다.

up-down 실습

  • 1번
// 정답 생성
var secret = Math.floor(Math.random() * 100) + 1;


while (true) {
  // 사용자의 입력값
  var answer = +prompt("숫자를 입력하세요! [1 ~ 100]: ");
  
  // 정답 판정
  if (secret === answer) {
    alert("딩동댕~~~~ !!");
    break;
  } else if (secret > answer) {
    alert("UP!!!!");
  } else {
    alert("DOWN!!!!");
  }
}
  • 2번
// 정답 생성
var secret = Math.floor(Math.random() * 100) + 1;

// 입력기회 횟수
var count = 5;

while (true) {
  // 사용자의 입력값
  var answer = +prompt("숫자를 입력하세요! [1 ~ 100]: ");
  count--;

  // 정답 판정
  if (secret === answer) {
    alert("딩동댕~~~~ !!");
    break;
  } else if (secret > answer) {
    alert("UP!!!!");
  } else {
    alert("DOWN!!!!");
  }
  // 카운트다운 게임 종료 조건
  if (count <= 0) {
    alert(`기회가 모두 소진되었습니다. 정답은 ${secret}이지렁 ㅎㅎㅎ`);
    break;
  } else {
    alert(`기회가 ${count}번 남았습니다.`);
  }
}
  • count--; --count; 둘 다 가능 !
    -> 사용하기전에 감소시켜야되는데 당장 사용하는 것이 아니고 나중에 사용하므로 둘 중 무엇을 쓰던 상관없다.
  • 3번

// 난이도 상수
const HIGH = 1,
  MIDDLE = 2,
  LOW = 3;

while (true) {
  // 난이도 설정
  var level = +prompt(
    "1. 상 (기회 3번) | 2. 중 (기회 6번) | 3. 하 (기회 10번)"
  );

  if (level === HIGH) {
    var count = 3;
  } else if (level === MIDDLE) {
    var count = 6;
  } else if (level === LOW) {
    var count = 10;
  } else {
    alert("난이도를 숫자로 다시 입력해주세요.");
    continue; // 아래 과정을 건너뛰게해서 처음으로 돌아감
  }
  break;
}

  // 정답 생성
  var secret = Math.floor(Math.random() * 100) + 1;
  // 입력기회 횟수
  var countDown = count;

  while (true) {
    // 사용자의 입력값
    var answer = +prompt("숫자를 입력하세요! [1 ~ 100]: ");
    countDown--;

    // 정답 판정
    if (secret === answer) {
      alert("딩동댕~~~~ !!");
      break;
    } else if (secret > answer) {
      alert("UP!!!!");
    } else {
      alert("DOWN!!!!");
    }
    // 카운트다운 게임 종료 조건
    if (countDown <= 0) {
      alert(`기회가 모두 소진되었습니다. 정답은 ${secret}이지렁 ㅎㅎㅎ`);
      break;
    } else {
      alert(`기회가 ${countDown}번 남았습니다.`);
    }
}
  • 난이도 상수를 정의하여 가독성을 높였다.
  • 난이도 설정에 대한 부분을 따로 while문을 작성하여 선택하고 break해서 빠져나온다.
  • 그 이후는 2번과 동일하게 진행

사칙연산 실습

  • 1번
alert("재미있는 사칙연산 게임");
alert("즐겁게 문제를 푸시다가 지겨우면 0을 누르세요~");
alert("====================================");

// 카운트
var count = 1;
while (true) {

  // 정답 생성
  var num1 = Math.floor(Math.random() * 50) + 1;
  var num2 = Math.floor(Math.random() * 50) + 1;

  // 문제
  alert(`Q${count}. ${num1} + ${num2} = ??`);
  var answer = +prompt("");
  count++;

  if (answer === num1 + num2) {
    alert("정답입니다!");
  } else if (answer !== num1 + num2 && answer !== 0) {
    alert("틀렸어요~");
  } else if (answer === 0) {
    alert("게임을 종료합니다!");
    break;
  }
  if (count === 5) {
    alert("게임을 종료합니다!");
    break;
  }
}
  • 2번
alert("재미있는 사칙연산 게임");
alert("즐겁게 문제를 푸시다가 지겨우면 0을 누르세요~");
alert("====================================");

// 카운트
var count = 1;

// 정답횟수, 틀린횟수 카운트
var answerCount = 0;
var wrongCount = 0;
while (true) {
  // 정답 생성
  var num1 = Math.floor(Math.random() * 50) + 1;
  var num2 = Math.floor(Math.random() * 50) + 1;

  // 문제
  alert(`Q${count}. ${num1} + ${num2} = ??`);
  var answer = +prompt("");
  count++;

  if (answer === num1 + num2) {
    alert("정답입니다!");
    answerCount++;
  } else if (answer !== num1 + num2 && answer !== 0) {
    alert("틀렸어요~");
    wrongCount++;
  } else if (answer === 0) {
    alert("게임을 종료합니다!");
    break;
  }
  if (count === 6) {
    alert("게임을 종료합니다!");
    break;
  }
}
alert("================================");
alert(`정답횟수: ${answerCount}회, 틀린횟수: ${wrongCount}`);
  • 3번
alert("~~~~~~~~~ 재미있는 사칙연산 게임 ~~~~~~~~");
alert("즐겁게 문제를 푸시다가 지겨우면 0을 누르세요~");
alert("=========================================");

// 카운트
var count = 1;

// 정답, 틀린횟수 카운트
var correctCount = 0;
var wrongCount = 0;

while (true) {
  // 숫자 생성
  var num1 = Math.floor(Math.random() * 10) + 1;
  var num2 = Math.floor(Math.random() * 10) + 1;

  // 부호 생성
  // 0, 1, 2 중에 하나가 생성되는 난수
  var markNum = Math.floor(Math.random() * 3);

  // 부호
  var mark;

  // 실제정답
  var realAnswer;

  switch (markNum) {
    case 0:
      mark = "+";
      realAnswer = num1 + num2;
      break;
    case 1:
      mark = "-";
      realAnswer = num1 - num2;
      break;
    case 2:
      mark = "*";
      realAnswer = num1 * num2;
      break;
  }

  // 사용자 입력값
  var userAnswer = +prompt(`Q${count}. ${num1} ${mark} ${num2} = ??`);
  count++;

  // 정답 판정
  if (userAnswer === realAnswer) {
    alert(`정답입니다.`);
    correctCount++;
  } else if (userAnswer !== realAnswer && userAnswer !== 0) {
    alert(`틀렸어요 ~`);
    wrongCount++;
  } else if (userAnswer === 0) {
    alert(`게임을 종료합니다!`);
    break;
  }
}
alert(`정답횟수: ${correctCount}회, 틀린횟수: ${wrongCount}`);
  • 부호생성을 랜덤으로 난수를 생성하여 switch로 이어주는 식으로 썼다.

  • 부호와 더불어 실제정답도 변수로 설정해주었다. 왜냐하면 부호를 숫자와 이어주려면 실제 식이 필요한데 부호마저 mark라는 변수로 바뀌었기 때문에 이어줄 수 없기 때문이다.

  • 그렇게 숫자2개와 부호를 모두 랜덤으로 생성하게 만들고 내 입력값과 비교하는 if문을 작성했다!

  • 4번

alert("~~~~~~~~~ 재미있는 사칙연산 게임 ~~~~~~~~");
alert("즐겁게 문제를 푸시다가 지겨우면 0을 누르세요~");
alert("=========================================");

while (true) {
  // 난이도 설정
  var level = +prompt("[ 1. 상 (1~100) | 2. 중 (1~50) | 3. 하 (1~20)]");

  // 난이도에 따른 max 숫자 설정
  var maxNumber;

  if (level === 1) {
    maxNumber = 100;
  } else if (level === 2) {
    maxNumber = 50;
  } else if (level === 3) {
    maxNumber = 20;
  }
  break;
}

// 카운트
var count = 1;

// 정답, 틀린횟수 카운트
var correctCount = 0;
var wrongCount = 0;

while (true) {
  // 숫자 생성
  var num1 = Math.floor(Math.random() * maxNumber) + 1;
  var num2 = Math.floor(Math.random() * maxNumber) + 1;

  // 앞의 숫자가 더 크게 설정
  if (num1 < num2) {
    var temp = num1;
    num1 = num2;
    num2 = temp;
  } else if (num1 === num2) { // 같은 숫자 출제 X
    continue;
  }


  // 부호 생성
  // 0, 1, 2 중에 하나가 생성되는 난수
  var markNum = Math.floor(Math.random() * 3);

  // 부호
  var mark;

  // 실제정답
  var realAnswer;

  switch (markNum) {
    case 0:
      mark = "+";
      realAnswer = num1 + num2;
      break;
    case 1:
      mark = "-";
      realAnswer = num1 - num2;
      break;
    case 2:
      mark = "*";
      realAnswer = num1 * num2;
      break;
  }

  // 사용자 입력값
  var userAnswer = +prompt(`Q${count}. ${num1} ${mark} ${num2} = ??`);
  count++;

  // 정답 판정
  if (userAnswer === realAnswer) {
    alert(`정답입니다.`);
    correctCount++;
  } else if (userAnswer !== realAnswer && userAnswer !== 0) {
    alert(`틀렸어요 ~`);
    wrongCount++;
  } else if (userAnswer === 0) {
    alert(`게임을 종료합니다!`);
    break;
  }
}
alert(`정답횟수: ${correctCount}회, 틀린횟수: ${wrongCount}`);
  • 난이도에 따른 숫자범위를 다르게 설정해야하기 때문에 maxNumber 변수 생성
profile
백엔드 개발자
post-custom-banner

0개의 댓글