본문 바로가기

Web_Project

세 자리 수 맞추기 게임

 

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="ball.css">
    <title>숫자야구 게임</title>
</head>

<body class="home__container">
    <h1 class="home__title">숫자 야구 게임!</h1>
    <p class="home__descript">
        <br>
        컴퓨터가 세 자리 숫자를 생성하였습니다.
        <br>
        정답을 맞춰보세요!
        <br><br>
        [게임 진행 방식]
        <br>
        숫자의 값과 위치가 모두 일치하면 S
        <br>
        숫자의 값은 일치하지만 위치가 틀린다면 B
        <br><br>
        숫자 3개를 모두 맞춘 경우, 게임을 종료합니다.
        <br>
    </p>
    <div class="input">
        <input type="text" id="userInput" placeholder=" 세 자리 숫자를 입력하세요">
        <button onclick="checkGuess()">시도</button>
    </div>
    <div id="output"></div>
    <script src="ball.js"></script>
</body>

</html>

// 게임에 필요한 변수 초기화
let answer = generateRandomNumber();
let attempts = 0;

// HTML 요소 가져오기
const output = document.getElementById('output');
const userInput = document.getElementById('userInput');

// 1. 메인 게임 로직
function checkGuess() {
    // HTML 입력값 가져오기
    const guess = userInput.value;

    // 입력값이 3자리 숫자인지 확인
    if (!isValidInput(guess)) {
        alert('세 자리 숫자를 입력하세요.');
        return;
    }

    // 시도 횟수 증가
    attempts++;

    // 스트라이크와 볼 계산
    const result = calculateResult(guess);

    // 결과 출력
    output.innerHTML += `${attempts}번째 시도: ${guess} - ${result}<br>`;

    // 정답 여부 확인
    if (result === '3S') {
        output.innerHTML += `${attempts}번만에 맞혔습니다. 게임을 종료합니다.`;
        userInput.disabled = true;
    }

    // 입력 창 초기화
    userInput.value = '';
}

// 2. 랜덤 숫자 생성 함수
function generateRandomNumber() {
    let numbers = [];

    // 서로 다른 숫자 3개 뽑기
    while (numbers.length < 3) {
        const randomNumber = Math.floor(Math.random() * 10);
        if (!numbers.includes(randomNumber)) {
            numbers.push(randomNumber);
        }
    }

    return numbers.join('');
}

// 3. 입력값이 3자리 숫자인지 확인하는 함수
function isValidInput(input) {
    return /^\d{3}$/.test(input);
}

// 4. 볼과 스트라이크 계산하는 함수
function calculateResult(guess) {
    let strikes = 0;
    let balls = 0;

    for (let i = 0; i < 3; i++) {
        const digit = guess[i];
        if (digit === answer[i]) {
            strikes++;
        } else if (answer.includes(digit)) {
            balls++;
        }
    }

    // 결과 문자열 생성
    let result = '';
    if (strikes > 0) {
        result += `${strikes}S`;
    }
    if (balls > 0) {
        result += `${balls}B`;
    }

    return result || '0B0S';
}
body {
    font-family: 'Arial', sans-serif;
    text-align: center;
    margin: 50px;
}

.home__container {
    position: relative;
    height: 1000px;

    background-image: linear-gradient(45deg,
            rgb(51 43 43 / 75%),
            rgb(20 19 20 / 61%)), url("https://us.123rf.com/450wm/adrenalinapura/adrenalinapura1308/adrenalinapura130800008/21730613-%EC%95%BC%EA%B5%AC%EC%9D%98-%EC%9D%BC%EB%9F%AC%EC%8A%A4%ED%8A%B8.jpg");
    max-height: 80%;
    background-position: center;
    background-size: cover;
    background-repeat: no-repeat;
    background-attachment: fixed;
}

.input {
    display: flex;
    flex-direction: row;
    justify-content: center;
    align-items: center;
}

input {
    width: 280px;
    padding: 11px;
    font-size: 20px;
    border-radius: 10px;
    border: none;
}

button {
    padding: 7px;
    font-size: 24px;
    font-weight: bold;
    border-radius: 10px;
    border: none;

    margin-left: 8px;
}

.home__descript {
    color: white;
    font-size: 18px;
    margin-top: 10px;
}

.home__title {
    color: white;
    font-size: 45px;
    padding-top: 30px;
}

#output {
    color: white;
    font-size: 18px;
    margin-top: 15px;
}

 

 

'Web_Project' 카테고리의 다른 글

반응형 페이지 구현  (0) 2024.02.02
clonecoding_NEWNEEK  (0) 2024.01.28
오늘의 음식 메뉴 추천 홈페이지  (1) 2023.12.08
momentum_체크박스+모달창 만들기  (1) 2023.12.05
구글 모멘텀 앱 만들기  (2) 2023.12.05