JavaScript/조건문과 반복문

JavaScript 숫자 맞히기 게임 만들기 - 조건문과 반복문 실습

코딩하는 패션이과생 2025. 6. 6. 20:16
반응형

게임 소개

숫자 맞히기 게임은 컴퓨터가 생성한 랜덤 숫자를 사용자가 맞추는 게임입니다. 이 실습을 통해 JavaScript의 조건문(if, else), 반복문(while), 그리고 사용자 입력 처리 방법을 종합적으로 학습할 수 있습니다.

🎯 학습 목표

  • 조건문을 활용한 게임 로직 구현
  • 반복문을 사용한 게임 진행 제어
  • 사용자 입력 검증 및 피드백 제공
  • 게임 상태 관리 및 결과 출력

게임 규칙

📋 기본 규칙

  1. 컴퓨터가 1~100 사이의 랜덤 숫자를 생성
  2. 사용자가 숫자를 입력하여 맞추기 시도
  3. 입력한 숫자가 정답보다 크면 "더 작은 수를 입력하세요"
  4. 입력한 숫자가 정답보다 작으면 "더 큰 수를 입력하세요"
  5. 정답을 맞추면 시도 횟수와 함께 축하 메시지 출력
  6. 최대 시도 횟수 제한 (예: 10회)

기본 버전 만들기

먼저 가장 간단한 형태의 숫자 맞히기 게임을 만들어보겠습니다.

1단계: 랜덤 숫자 생성

// 1~100 사이의 랜덤 숫자 생성
let randomNumber = Math.floor(Math.random() * 100) + 1;
console.log("컴퓨터가 1~100 사이의 숫자를 선택했습니다!");
console.log("정답:", randomNumber); // 테스트용 (실제 게임에서는 제거)

Math.random() 함수 설명:

  • Math.random(): 0 이상 1 미만의 소수 반환
  • Math.random() * 100: 0 이상 100 미만의 소수
  • Math.floor(): 소수점 이하 버림
  • + 1: 1~100 범위로 조정

2단계: 기본 게임 로직

let randomNumber = Math.floor(Math.random() * 100) + 1;
let userGuess = parseInt(prompt("1~100 사이의 숫자를 맞춰보세요:"));

if (userGuess === randomNumber) {
    console.log("정답입니다! 축하합니다!");
} else if (userGuess < randomNumber) {
    console.log("더 큰 수를 입력하세요!");
} else {
    console.log("더 작은 수를 입력하세요!");
}

console.log("정답은 " + randomNumber + "이었습니다.");

실행 결과 (예시):

// 사용자가 50을 입력하고 정답이 75인 경우
더 큰 수를 입력하세요!
정답은 75이었습니다.

이 기본 버전은 한 번만 추측할 수 있는 단순한 형태입니다. 조건문을 사용해 사용자의 입력과 정답을 비교하고 적절한 피드백을 제공합니다.


기능 개선하기

이제 while문을 사용하여 여러 번 시도할 수 있는 게임으로 개선해보겠습니다.

3단계: 반복 게임 로직

let randomNumber = Math.floor(Math.random() * 100) + 1;
let userGuess = 0;
let attempts = 0;

console.log("숫자 맞히기 게임을 시작합니다!");
console.log("1~100 사이의 숫자를 맞춰보세요!");

while (userGuess !== randomNumber) {
    userGuess = parseInt(prompt("숫자를 입력하세요:"));
    attempts++;

    if (userGuess === randomNumber) {
        console.log("정답입니다! 축하합니다!");
        console.log("시도 횟수: " + attempts + "회");
    } else if (userGuess < randomNumber) {
        console.log("더 큰 수를 입력하세요!");
    } else {
        console.log("더 작은 수를 입력하세요!");
    }
}

실행 결과 (예시):

숫자 맞히기 게임을 시작합니다!
1~100 사이의 숫자를 맞춰보세요!
// 사용자가 50 입력
더 큰 수를 입력하세요!
// 사용자가 75 입력  
더 작은 수를 입력하세요!
// 사용자가 63 입력
정답입니다! 축하합니다!
시도 횟수: 3회

4단계: 입력 검증 추가

let randomNumber = Math.floor(Math.random() * 100) + 1;
let userGuess = 0;
let attempts = 0;

console.log("숫자 맞히기 게임을 시작합니다!");

while (userGuess !== randomNumber) {
    let input = prompt("1~100 사이의 숫자를 입력하세요:");
    userGuess = parseInt(input);

    // 입력값 검증
    if (isNaN(userGuess) || userGuess < 1 || userGuess > 100) {
        console.log("올바른 숫자를 입력해주세요 (1~100)");
        continue; // 다시 입력받기
    }

    attempts++;

    if (userGuess === randomNumber) {
        console.log("🎉 정답입니다! 축하합니다!");
        console.log("시도 횟수: " + attempts + "회");
    } else if (userGuess < randomNumber) {
        console.log("⬆️ 더 큰 수를 입력하세요!");
    } else {
        console.log("⬇️ 더 작은 수를 입력하세요!");
    }
}

입력 검증 설명:

  • isNaN(): 숫자가 아닌 값인지 확인
  • userGuess < 1 || userGuess > 100: 범위 밖 값 확인
  • continue: 현재 반복을 건너뛰고 다음 반복으로 이동

완성된 게임

최종적으로 시도 횟수 제한과 게임 재시작 기능을 추가한 완성된 버전입니다.

function numberGuessingGame() {
    let randomNumber = Math.floor(Math.random() * 100) + 1;
    let userGuess = 0;
    let attempts = 0;
    const maxAttempts = 10;

    console.log("🎮 숫자 맞히기 게임을 시작합니다!");
    console.log("1~100 사이의 숫자를 맞춰보세요!");
    console.log("최대 " + maxAttempts + "번까지 시도할 수 있습니다.");

    while (userGuess !== randomNumber && attempts < maxAttempts) {
        let input = prompt(`숫자를 입력하세요 (${attempts + 1}/${maxAttempts}번째 시도):`);

        // 게임 종료 조건
        if (input === null || input.toLowerCase() === 'quit') {
            console.log("게임을 종료합니다.");
            return;
        }

        userGuess = parseInt(input);

        // 입력값 검증
        if (isNaN(userGuess) || userGuess < 1 || userGuess > 100) {
            console.log("❌ 올바른 숫자를 입력해주세요 (1~100)");
            continue;
        }

        attempts++;

        if (userGuess === randomNumber) {
            console.log("🎉 정답입니다! 축하합니다!");
            console.log("💯 시도 횟수: " + attempts + "회");

            // 성능 평가
            if (attempts <= 3) {
                console.log("🏆 대단해요! 천재적인 실력입니다!");
            } else if (attempts <= 6) {
                console.log("👍 좋아요! 실력이 좋네요!");
            } else {
                console.log("✨ 수고하셨습니다!");
            }

        } else if (userGuess < randomNumber) {
            console.log("⬆️ 더 큰 수를 입력하세요!");

            // 힌트 제공
            if (randomNumber - userGuess > 20) {
                console.log("💡 힌트: 많이 작아요!");
            }

        } else {
            console.log("⬇️ 더 작은 수를 입력하세요!");

            // 힌트 제공
            if (userGuess - randomNumber > 20) {
                console.log("💡 힌트: 많이 커요!");
            }
        }
    }

    // 게임 종료 처리
    if (attempts >= maxAttempts && userGuess !== randomNumber) {
        console.log("😢 시도 횟수를 모두 사용했습니다!");
        console.log("정답은 " + randomNumber + "이었습니다.");
    }

    // 게임 재시작 여부 확인
    let playAgain = confirm("다시 게임하시겠습니까?");
    if (playAgain) {
        console.log("\n" + "=".repeat(30));
        numberGuessingGame(); // 재귀 호출로 게임 재시작
    } else {
        console.log("게임을 종료합니다. 감사합니다!");
    }
}

// 게임 시작
numberGuessingGame();

실행 결과 예시:

🎮 숫자 맞히기 게임을 시작합니다!
1~100 사이의 숫자를 맞춰보세요!
최대 10번까지 시도할 수 있습니다.

// 1번째 시도: 50
⬆️ 더 큰 수를 입력하세요!
💡 힌트: 많이 작아요!

// 2번째 시도: 75  
⬇️ 더 작은 수를 입력하세요!

// 3번째 시도: 63
🎉 정답입니다! 축하합니다!
💯 시도 횟수: 3회
🏆 대단해요! 천재적인 실력입니다!

다시 게임하시겠습니까?

추가 기능 아이디어

게임을 더욱 흥미롭게 만들 수 있는 추가 기능들입니다:

난이도 선택 기능

function selectDifficulty() {
    let difficulty = prompt("난이도를 선택하세요:\n1. 쉬움 (1~50, 15번 시도)\n2. 보통 (1~100, 10번 시도)\n3. 어려움 (1~200, 8번 시도)");

    switch(difficulty) {
        case "1":
            return { max: 50, attempts: 15 };
        case "2":
            return { max: 100, attempts: 10 };
        case "3":
            return { max: 200, attempts: 8 };
        default:
            console.log("기본 난이도(보통)로 설정됩니다.");
            return { max: 100, attempts: 10 };
    }
}

점수 시스템 추가

function calculateScore(attempts, maxAttempts) {
    let baseScore = 1000;
    let penalty = attempts * 50;
    let score = Math.max(baseScore - penalty, 100);
    return score;
}

// 게임 끝날 때 점수 계산
let score = calculateScore(attempts, maxAttempts);
console.log("🏆 최종 점수: " + score + "점");

최고 기록 저장

// 브라우저의 localStorage 활용
function saveBestScore(attempts) {
    let bestScore = localStorage.getItem('bestScore');
    if (!bestScore || attempts < parseInt(bestScore)) {
        localStorage.setItem('bestScore', attempts);
        console.log("🎉 새로운 최고 기록입니다!");
    }
}

function showBestScore() {
    let bestScore = localStorage.getItem('bestScore');
    if (bestScore) {
        console.log("🏅 현재 최고 기록: " + bestScore + "회");
    }
}

마무리

숫자 맞히기 게임 만들기를 통해 JavaScript의 핵심 개념들을 실습해보았습니다.

이 실습을 통해 JavaScript의 기본 문법을 실제 프로젝트에 적용하는 경험을 쌓을 수 있었습니다. 더 복잡한 게임이나 웹 애플리케이션을 만들 때도 이런 기본 개념들이 토대가 됩니다!