블록체인기반 SW 개발자 과정(feat.경일게임아카데미)/과제
<JAVASCRIPT> 22.05.26일자 과제 / 숫자 야구 게임 만들기 - isNaN() , indexOf()
Summer-Jin
2022. 6. 2. 17:50
ㅋㅋㅋㅋ set() 메서드를 알게 되었다고 그걸로 야구게임을 만들어보려고 시도하다가 과정이 너무 복잡해져서
아예 갈아엎었다ㅋㅋㅋ 그래서 결국 완성된... 코드...!!!!
<수정을 통해 완성한 코드>
/*
실습과제
숫자야구게임만들기
1. 컴퓨터는 임의의 숫자 3개를 낸다.
2. 유저는 아무거나 낼 수 있다.
ex) 컴 1 2 3
유저 7 8 9
=> 아웃
====================
4 5 6
5 7 9 1볼(숫자는 하나 같고 자리가 틀림)
===========================
1,2,3
1,2,4 => 2스트라이크(숫자 2개맞고 자리도 동일)
======================================
- 같은숫자 같은 인덱스값 = > 스트라이크
- 3스트라이크면 =>홈런 승리
- 플레이 기회는 자유
*/
//컴퓨터가 내는 공 번호가 담긴 배열
let com_ball = [];
// 컴퓨터가 공으로뽑은 번호
let ball = 0;
//유저가 내는 공을 받을 배열
let user_ball = [];
//유저가 낸 공번호
let set_ball = 0;
let count = 1;
// 컴퓨터의 처음뽑은 수는 변하지 않는다 user_ball의 중복검사를 위해 객체로 담아줄 것
// 1~9사이에서 중복되지 않게 임의의 숫자 3개를 뽑는다
for (let i = 1; i <= 3; i++) {
ball = Math.floor(Math.random() * 8 + 1); //1~9사이의 숫자 뽑기
// include는 '===' 연산자를 사용함
if (com_ball.indexOf(ball) == -1) {
com_ball.push(ball);
} else if (com_ball.indexOf(ball) != -1) {
i--;
}
}
console.log("컴퓨터가 고른 공 :" + com_ball);
// //////객체 배열로 변환//////////////
// 유저가 공을 3개 내도록한다 중복되지 않은 숫자인지 검사한다.
alert("숫자 야구게임을 시작합니다.\n *총 3번 입력합니다.* ");
while (count <= 2) {
alert(count + " 번 째 게임을 시작합니다.");
while (true) {
//delete user_ball[];
for (let i = 0; i < 3; i++) {
alert(i + 1 + " 번 째 공을 던집니다. ");
set_ball = Number(
prompt(
"1~9사이의 숫자를 입력하세요 : \n ** 주의 같은 숫자는 입력하면 안됩니다.**"
)
);
//유저가 입력할 수 있는 데이터 제한하기
console.log();
if (isNaN(set_ball)) {
alert(" 범위안의 숫자만 입력하세요\n 방금 입력한 값 : " + set_ball);
i--;
} else if (0 < set_ball && set_ball <= 9) {
if (user_ball.indexOf(set_ball) == -1) {
user_ball.push(set_ball);
if (user_ball.length == 3) {
// 중복된 숫자 없이 공을 3개 잘 냈으면 끝
alert("공을 3개 다 던지셨습니다.\n 승패를 확인합니다.");
break;
}
alert(set_ball + "번 공을 던지셨습니다.\n 다음 공을 입력해주세요");
} else if (user_ball.indexOf(set_ball) != -1) {
alert("중복된 숫자는 입력할 수 없습니다.\n 다시 입력해주세요.");
i--;
continue;
}
} else {
alert("범위 안의 숫자를 입력하세요 ");
i--;
}
}
break;
}
let check_strike = 0;
let check_ball = 0;
// 스트라이크인
for (let j = 0; j < 3; j++) {
for (let k = 0; k < 3; k++) {
//com의 0번째 인덱스와 같은 값이 있으면 인덱스가 같은건지 비교
if (com_ball[j] == user_ball[k]) {
if (com_ball.indexOf(com_ball[j]) != user_ball.indexOf(user_ball[k])) {
check_ball++;
} else if (
com_ball.indexOf(com_ball[j]) == user_ball.indexOf(user_ball[k])
) {
check_strike++;
}
}
}
}
//볼 개수 계산 컴퓨터와 유저가 같은값을 뽑았으면 그걸 제거하고 남은 배열로 볼이 몇개인지 비교
alert(
count +
" 번째 게임 결과 발표!!!! \n 스트라이크 갯수 : " +
check_strike +
"\n 볼의 갯수 : " +
check_ball
);
alert(count + " 번째 게임에서 \n 내가 낸 공의 번호 : " + user_ball);
console.log("이번판 유저가 낸 공 번호 : " + user_ball);
console.log("이번판 볼 갯수 : " + check_ball);
console.log(check_strike + "슼 타입");
console.log("이번판 스트라이크 갯수 : " + check_strike);
//계속 안쌓이게 배열 비워 줌
//splice(지우기 시작할 인덱스번호, 시작인덱스부터 몇개 지울건지)
com_ball.splice(0, 3);
user_ball.splice(0, 3);
count++;
}
짜잔!! 중복검사와 유저가 제출하는 데이터를 제한하느라 조금 길어졌다ㅎㅎㅎ.
숫자 야구게임이니까 숫자가 아닌 데이터를 입력하면 제대로 입력하도록 안내문구도 친절하게 달았다ㅋㅋㅋ
지난번 가위바위보 게임에서 알게된 isNaN()!!!! 리턴값이 boolean 인걸 잊지 않고 알맞게 썼다.
그리고 마지막으로 splice로 컴퓨터와 유저의 공을 담은 배열을 비워줌으로써 다음판에 새로 공을 담을 수 있게 해주었다.
이전의 set으로 중복검사를 했을때는 이후에 ball과 strike를 어떻게 나눠 줘야 할지 고민이었는데
indexOf()를 요긴하게 썼다.
교수님께서도 게임을 만드는게 로직을 이해하는데 가장 빠른방법 중 하나라고 말씀하셨는데 하면 할수록 정말 맞말이라고 생각이든다. 원하는 기능을 해주는 메서드가 있는지 따로 검색도 해보고 있으면 사용해보려고 노력하고
안될 것 같으면 다른 방법으로 다시 시도하고 그날 배운 내용을 되새김질 할 수 있어서 좋다!
728x90