본문 바로가기
🖥️ Frontend/Frontend 프로젝트

<HTML.CSS.JS> 숫자야구게임

by 정람지 2022. 7. 26.

HTML

css가 섞여 있어 깔끔하지 않다. 하지만 각 항목에 위치 조정을 하고 싶어서 이렇게 하는 게 편했다. 

그런데 이렇게 위치 조정하니까 그림 위에 고정되지 않고 사용자 액정 위치에 맞춰 조정된다. 다음에 그림 위에 요소 올리고 싶으면 다른 방법을 찾는 게 좋을 것 같다.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>NumberBaseballGame</title>
  <link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
 <div class="img">
          <div style="position: absolute; left: 110px; top: 140px;">
            <form>
              <input style="padding:40px;font-size:40px" />
              <button style='font-size:30px;padding:30px'>GO!</button>
            </form>
          </div>
          <div style="position: absolute; left: 100px; top: 700px;">
            <button type="button" onclick="location.href='explain.html' "  style='font-size:30px;padding:30px'>플레이 설명</button>
          </div>
          <div style="position: absolute; left: 400px; top: 940px;">
            <h3 style='font-size:50px'>결과는,</h3>
          </div>
          <div style="position: absolute; left: 400px; top: 1000px;">
            <h1 style='font-size:80px'>GOGO!</h1>
          </div>
        </div>
      
    </div>
  
 <script src="script.js"></script>
 <script src="https://replit.com/public/js/replit-badge.js"></script> 
</body>

</html>

귀여운 CSS 

그림 위에 글자 올리는 용도

!! 클래스 이름이랑 . 사이' 띄어쓰기' 절대 안 됨 !! 저번에 왜 안되는지 찾느라 힘들었다.

.img{
    position: relative;
    background-image: url(./image/base.png);                                                               
    height: 100vh;
    background-size: cover;
}

JS

핵심 자바스크립트이다.  제로초님의 강의를 들으며 만들었다. 

<배운 점>

-파이썬이 아니니 변수 지정하는 것 잊지 말기

 

-const는 재할당이 불가함

 

 

-html 에서 getElementByClassName() 으로 요소를 가져왔는데 addEventListener is not a function Error 라는 에러가 떴다. getElementByClassName() 사용해서 가져온 요소는 배열이므로 배열 표시를 해주어야 한다! [0]을 추가했더니 해결되었다.

 

-Math.floor() 무조건 올림,  Math.ceil() 무조건 내림  , Math.round () 우리가 아는 반올림  

 

-splice()는 원래 있던 거 삭제시킴! 없어짐

 

<아쉬운 점>

게임이 1회 끝나면 새로운 게임이 시작되게 하고 싶었는데 comNumbers에 새로운 값이 들어가지 않는다. 

한참 고민했는데

근데

방금 찾았다 방금

const 는 재할당이 불가하다고 배운점에 써놓고 comNumbers를 const로..

밑에 논리적으로 이상한가 계속 아래만 봤는데 애초에 문제였구나

지금이라도 알아서 다행이다

앞으로 잊지는 않을 것 같다

초보로써 당분간은 그냥 letconst 쓰지 말고 겸허하게 var만 쓰자

//요소 불러오기
var userForm = document.getElementsByTagName("form")[0];//폼
var RangSay = document.getElementsByTagName("h1")[0];//랑쥐말
var userWindow = document.getElementsByTagName("input")[0]; //입력창

const numbers = [1,2,3,4,5,6,7,8,9];
const comNumbers = []; //컴퓨터의 답
for ( var i=0; i<3; i+=1){
  var pickedNumber = numbers.splice(Math.floor(Math.random()*(9-i)),1)[0];
  comNumbers.push(pickedNumber);
}//컴퓨터가 낼 문제 뽑기 완료 
console.log (comNumbers.join(''));
var wrongtime = 0;//틀린횟수

userForm.addEventListener('submit', function callback (Event){
    Event.preventDefault();
    var userAnswer = userWindow.value; //사용자의 답은 userAnswer
    console.log(userAnswer)
    if (userAnswer === comNumbers.join('')){  //답이 맞은경우(홈런)
        RangSay.textContent = '홈런!!'
        userWindow.value ='';
        wrongtime += 15
      } 
    else {//답이 틀린 경우(.스트라이크.볼)
        var strike = 0;
        var ball = 0;
        var userAnswerList = userAnswer.split('');//사용자가입력한답을리스트로!
        wrongtime += 1; 
        if(wrongtime > 10 && wrongtime < 12){//틀린횟수 10번초과
            RangSay.textContent = '시도횟수 10번을 초과했어! 답은'+ comNumbers.join('')
            userWindow.value ='';
          }
        else if(wrongtime <= 10){//틀린횟수 10번이하
            for (var i =0; i<3; i+=1){
                if (comNumbers[i] === Number(userAnswerList[i])){//스트라이크
                    strike += 1;
                } 
                else if (comNumbers.indexOf(Number(userAnswerList[i]))>-1 ) { //볼
                    ball += 1;
                }
            }
            userWindow.value ='';
            userWindow.focus();
            RangSay.textContent = strike +'스트라이크' + ball + '볼!'
          }
    }
});

설명서용 HTML 

버튼으로 이동

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Base Explain</title>
</head>
<body>
  <div class = 'middle'>
 <h2 style='font-size:50px'>숫자야구란 감춰진 3개의 숫자가 무엇인지 맞추는 게임입니다.</h2>

<h4 style='font-size:40px'>2) 숫자는 0~9까지 구성되어 있으며, 각 숫자는 <b>한번씩만</b> 사용 가능합니다.</h4>
<h6 style='font-size:40px'>숫자 중복으로 하면 오류나니 유의!!</h6>
<h4 style='font-size:40px'>1) 3자리 숫자와 위치가 모두 맞으면 홈런입니다.</h4>
<h4 style='font-size:40px'>3) 숫자와 자리의 위치가 맞으면 스트라이크, 숫자만 맞으면 볼입니다.</h4>
<h4 style='font-size:40px'>4) 10회 도전 횟수가 초과되면/답을 맞추면 게임이 끝납니다.</h4>
<h3  style='font-size:20px'>!설명서 허접 주의!</h3>
  </div>
  
 <script src="script.js"></script>
 <script src="https://replit.com/public/js/replit-badge.js"></script> 
</body>

</html>

실제 플레이 화면

replit 사용

링크 https://NumberBaseBall.goldchae.repl.co