항해 4일차 (숫자 야구 게임)

Undong·2023년 4월 6일
0

항해구구

목록 보기
4/52
post-thumbnail

항해 4일차

팀플 과제인 숫자야구 프로그램 만들기를 진행하였다. 2인1팀으로 페어하면서 숫자 야구 게임을 만드는 것이다.

간략하게 보자면

조건

  • 컴퓨터는 0과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑습니다. (ex) 123, 759
  • 사용자는 컴퓨터가 뽑은 숫자를 맞추기 위해 시도합니다.
  • 컴퓨터는 사용자가 입력한 세자리 숫자에 대해서, 아래의 규칙대로 스트라이크(S)와 볼(B)를 알려줍니다.
    • 숫자의 값과 위치가 모두 일치하면 S
    • 숫자의 값은 일치하지만 위치가 틀렸으면 B
  • 기회는 무제한이며, 몇번의 시도 후에 맞췄는지 기록됩니다.
  • 숫자 3개를 모두 맞춘 경우, 게임을 종료합니다.

진행 방식
컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!
1번째 시도 : 134
0B0S
2번째 시도 : 238
1B1S
3번째 시도 : 820
2B1S
4번째 시도 : 028
3B
5번째 시도 : 280
3S
4번만에 맞히셨습니다.
게임을 종료합니다.

해당 프로그램을 진행하기 위해

1. 랜덤 숫자 만들기
2. 한자리 숫자에 대해 볼, 스크라이크 판단 하는 부분 구현하기
3. 볼, 스트라이크를 표현하는 부분 구현하기
4. 게임 종료하는 부분 구현하기 

단계로 구현해 나갔다.

코드

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
}); // 입출력

const number = [];
number[0] = Math.floor(Math.random() * 10);
do {
  number[1] = Math.floor(Math.random() * 10);
} while (number[1] === number[0]);
do {
  number[2] = Math.floor(Math.random() * 10);
} while (number[2] === number[0] || number[2] === number[1]);
// 랜덤 숫자 추출 중복 값 제거 

let count = 0;
let tried = 1;
console.log("컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!");
function askNumber() {
  rl.question(tried + "번째 시도 : ", (num) => {
    let arr1 = num.split("").map(Number);
    //console.log(number);
    // 입력 값 배열로 추출
    let S = 0;
    let B = 0;
    
    count++; // count번 만에 맞히셨습니다. 
    tried++; // tried 번째 시도

    if (arr1.length === 3 && arr1.every((n) => Number.isInteger(n))) {
      for (let j = 0; j < 3; j++) {
        for (let k = 0; k < 3; k++) {
          if (number[j] == arr1[k]) {
            if (j === k) {
              S++;
             // 중첩 반복문을 활용하여 랜덤 숫자와 입력 숫자 비교 
            } else {
              B++;
            }

            break;
          }
        }
      }

      if (S === 3) {
        console.log(count + "번만에 맞히셨습니다");
        console.log("게임을 종료합니다!!");
        rl.close(); // 입력 끝
      } else {
        console.log(`${S}s${B}b`);
        askNumber();
      }
    } else {
      console.log("세자리 수를 입력해주세요");
      askNumber();
    }

  });
}

askNumber(); // 함수 호출

readline

readline 모듈은 JS 내장 모듈로, 한 번에 한 줄씩 Readable 스트림 (예 : process.stdin)에서 데이터를 읽기위한 인터페이스를 제공한다.
처음 생성 시 createInterface를 통해 input, output을 설정해준다.
다음에, 입력을 갖고 처리할 callback함수인 function(line)을 설정해준다.
또한 close()를 이용하여 입력을 원하는 만큼 받고 입력을 멈추는 기능을 구현한다.

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.on('line', function(line) {
  console.log(line); //입력 값을 처리할 callback 내용 기제

  rl.close(); //callback 종료
}).on("close", function() {
  process.exit(); // 출력과 관련된 내용 기재 (console.log같은거..)
});

마무리

변수, 반복문, 함수, 조건문, 배열 등을 이용하여 숫자 야구 프로그램을 만들었다. console에서는 prompt를 사용하여 입력을 받지만 node에서는 readline을 사용하여 입력을 받을 수 있다는 것을 알게 되었고, 팀원들과 소통을 하면서 문제를 풀어 나갈 수 있어 좋은 과제가 된 것 같다.

profile
console.log("Hello")

0개의 댓글