<!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 |