From 2e5fad009783fcfddea1e28c85afbfa775551f05 Mon Sep 17 00:00:00 2001 From: 00306 <114010099+00306@users.noreply.github.com> Date: Tue, 30 Apr 2024 22:57:57 +0900 Subject: [PATCH 01/25] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 목록 정리 --- README.md | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b2833c..becde86 100644 --- a/README.md +++ b/README.md @@ -1 +1,30 @@ -# javascript-baseball-precourse \ No newline at end of file + +

+KAKAO +

+ +# 1회차 미니 과제 - ⚾️ 숫자 야구 게임 + +> 카카오 테크 캠퍼스 2기 FE 1회차 미니 과제, 숫자 야구 게임 레포입니다. + +
+ + +## 기능 목록 +### 문제 출제 +* 1부터 9까지 서로 다른 임의의 수로 이루어진 3자리의 수가 생성된다. + +
+ +### 문제 풀기 +* 사용자로부터 서로 다른 3자리의 수를 입력 받는다. +* 정상 입력된 경우 입력에 따른 결과 메시지를 표시한다. +* 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다. +* 잘못 입력된 경우 alert()을 이용한 에러 메시지 출력 후 그 부분부터 다시 입력받는다. + +
+ +### 정답 이후 처리 +* 3개의 숫자를 모두 맞히면 게임이 종료되고 '🎉정답을 맞추셨습니다🎉' 메시지 출력과 함께 재시작 문구 및 버튼이 표시된다. + +
From e8d21bcd9eb21b7d6690051574d46f2abc9c927c Mon Sep 17 00:00:00 2001 From: 00306 <114010099+00306@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:04:10 +0900 Subject: [PATCH 02/25] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index becde86..c54e1c6 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,12 @@ ## 기능 목록 + +### 온보딩 +* 게임 타이틀과 규칙 및 예시를 표시한다. + +
+ ### 문제 출제 * 1부터 9까지 서로 다른 임의의 수로 이루어진 3자리의 수가 생성된다. From 9c4a5468770c80628e3af314c988e2803da0a80e Mon Sep 17 00:00:00 2001 From: 00306 <114010099+00306@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:14:45 +0900 Subject: [PATCH 03/25] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index c54e1c6..4e34e92 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,9 @@ ### 문제 풀기 * 사용자로부터 서로 다른 3자리의 수를 입력 받는다. * 정상 입력된 경우 입력에 따른 결과 메시지를 표시한다. + * 같은 수가 같은 자리에 있으면 스트라이크 + * 다른 자리에 있으면 볼 + * 같은 수가 전혀 없으면 낫싱 * 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다. * 잘못 입력된 경우 alert()을 이용한 에러 메시지 출력 후 그 부분부터 다시 입력받는다. From b22bb7ba53f24b3d28ca6724d573c27472fef560 Mon Sep 17 00:00:00 2001 From: 00306 <114010099+00306@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:25:24 +0900 Subject: [PATCH 04/25] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e34e92..d4fa92c 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,11 @@ ## 기능 목록 -### 온보딩 +### UI * 게임 타이틀과 규칙 및 예시를 표시한다. +* 입력을 받을 텍스트 필드를 배치한다. +* 답 제출 버튼을 배치한다. +* 결과 섹션을 배치한다.
From 23ead2a44eec9dc024162d7834655baaf4339ed5 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 1 May 2024 20:09:31 +0900 Subject: [PATCH 05/25] =?UTF-8?q?feat(UI):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=ED=83=80=EC=9D=B4=ED=8B=80=EA=B3=BC=20=EA=B7=9C=EC=B9=99=20?= =?UTF-8?q?=EB=B0=8F=20=EC=98=88=EC=8B=9C=20UI=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게임 타이틀과 규칙 및 예시 UI를 구현했습니다: -

태그로 게임 타이틀 표시 -
태그로 규칙 및 예시 코드 분리 - 태그로 특정 단어 강조 --- index.html | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index b021b5c..f3f2705 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,5 @@ - - + + @@ -7,6 +7,15 @@
+

⚾️ 숫자 야구 게임

+ +
+ 1~9까지의 수를 중복없이 3개 입력해주세요. + +
올바른 예) 139
+
틀린 예) 122
+
+ From cdbd2fb2e1ab9d42a7075966701b7dc1c95467c8 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 1 May 2024 20:20:14 +0900 Subject: [PATCH 06/25] =?UTF-8?q?feat(UI):=20=ED=85=8D=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=20=EB=B0=8F=20=EB=B2=84=ED=8A=BC=20UI=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 텍스트 필드 및 확인 버튼 UI를 구현했습니다: - 디자인 요구 사항에 맞춰
태그로 줄 바꿈 -
태그로 코드 분리 - 로 텍스트 필드 구현 - 로 버튼 구현 --- index.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/index.html b/index.html index f3f2705..ee5ad3e 100644 --- a/index.html +++ b/index.html @@ -16,6 +16,13 @@

⚾️ 숫자 야구 게임

틀린 예) 122
+
+ +
+ + +
+ From 0b9e8280cf353afb029ba47c47b3771e2cd37607 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 1 May 2024 20:36:31 +0900 Subject: [PATCH 07/25] =?UTF-8?q?feat(UI):=20=EA=B2=B0=EA=B3=BC=20UI=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 결과 UI를 구현했습니다: -

태그로 결과 타이틀 표시 - 추후 힌트가 표시될 태그 구현 - 유저에게 제안하는 메시지가 표시될 태그 구현 - 게임 재시작 버튼 태그 구현 - 버튼의 속성을 나타내는 css 선택자 구현 --- index.html | 12 ++++++++++++ src/main.css | 5 +++++ 2 files changed, 17 insertions(+) create mode 100644 src/main.css diff --git a/index.html b/index.html index ee5ad3e..cf0e194 100644 --- a/index.html +++ b/index.html @@ -23,6 +23,18 @@

⚾️ 숫자 야구 게임

+
+

📄 결과

+ + + + + + + + +
+ diff --git a/src/main.css b/src/main.css new file mode 100644 index 0000000..b01a9b4 --- /dev/null +++ b/src/main.css @@ -0,0 +1,5 @@ +.result .reult__btn--end { +} + +.result .result__btn--new { +} From 833b19749a47e95f738b33ef6169082eb0dc4953 Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 4 May 2024 20:43:55 +0900 Subject: [PATCH 08/25] =?UTF-8?q?feat:=20Game=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게임의 상태 및 로직을 관리하는 Game 클래스를 구현했습니다. - 1~9까지 서로 다른 세 개의 정수를 만드는 generateRandomNumber 메서드 구현 - user의 input값을 통해 결과를 도출하는 compareResult 메서드 구현 - user의 input값을 통해 strike, ball, nothing을 판별하는 countHits 메서드 구현 - 유저 input값의 유효성을 검사하는 isValid 메서드 구현 - input 값을 초기화하고 focus를 주는 resetInputEl 메서드 구현 - 에러메시지를 출력하고, resetInputEl 메서드를 출력하는 alertHandler 메서드 구현 - strike, ball, nothing 값에 따라 결론 값을 생성하는 setResult 메서드 구현 - result 값을 출력할 수 있는 getResult 메서드 구현 --- src/game.js | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/game.js diff --git a/src/game.js b/src/game.js new file mode 100644 index 0000000..92846f8 --- /dev/null +++ b/src/game.js @@ -0,0 +1,111 @@ +import "./isNotIncludes.js"; + +export class Game { + #answer; + + constructor() { + this.#answer = this.generateRandomNumber(); + this.result = ""; + this.isGameSet = false; + } + + generateRandomNumber() { + let number = ""; + + while (number.length < 3) { + const randomNumber = Math.floor(Math.random() * 9) + 1; + if (number.isNotIncludes(randomNumber)) { + number += randomNumber; + } + } + + console.log(number); + return number; + } + + compareResult(inputEl) { + let inputValue = inputEl.value; + if (!this.#isValid(inputValue)) { + this.#alertHandler(inputEl); + return; + } + const { strikeCount, ballCount, nothingCount } = this.#countHits(inputValue); + this.#setResult(strikeCount, ballCount, nothingCount); + } + + #countHits(inputValue) { + let nothingCount = 0; + let strikeCount = 0; + let ballCount = 0; + + for (let i = 0; i < this.#answer.length; i++) { + if (inputValue[i] === this.#answer[i]) { + strikeCount += 1; + continue; + } + + if (inputValue.isNotIncludes(this.#answer[i])) { + nothingCount += 1; + } else { + ballCount += 1; + } + } + + return { strikeCount, ballCount, nothingCount }; + } + + #alertHandler(inputEl) { + alert("1~9까지의 수를 중복없이 3개 입력해주세요."); + this.#resetInputEl(inputEl); + } + + #resetInputEl(inputEl) { + inputEl.value = ""; + inputEl.focus(); + } + + #setResult(strikeCount, ballCount, nothingCount) { + if (nothingCount === 3) { + this.result = "낫싱"; + } else if (strikeCount === 3) { + this.result = "🎉정답을 맞추셨습니다🎉"; + this.isGameSet = true; + } else { + if (strikeCount === 0) { + this.result = `${ballCount}볼`; + } else if (ballCount === 0) { + this.result = `${strikeCount}스트라이크`; + } else { + this.result = `${ballCount}볼 ${strikeCount}스트라이크`; + } + } + } + + getResult() { + return this.result; + } + + #isValid(input) { + let numPattern = /^[1-9]+$/; + + if (!numPattern.test(input)) { + return false; + } + if (input.length !== 3) { + return false; + } + if (new Set(input).size !== input.length) { + return false; + } + + return true; + } + + restart(complete) { + this.#answer = this.generateRandomNumber(); + this.result = ""; + this.isGameSet = false; + + complete(); + } +} From 3b3164fde6d175a83e300c74c7fa88ee66276d77 Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 4 May 2024 20:46:14 +0900 Subject: [PATCH 09/25] =?UTF-8?q?feat:=20String.prototype.isNotIncludes=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 코드 가독성을 위해 String 타입의 includes() 메서드 값을 반전시킨 값을 return 하는 isNotIncludes 메서드를 구현했습니다. --- src/isNotIncludes.js | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/isNotIncludes.js diff --git a/src/isNotIncludes.js b/src/isNotIncludes.js new file mode 100644 index 0000000..7f42372 --- /dev/null +++ b/src/isNotIncludes.js @@ -0,0 +1,3 @@ +String.prototype.isNotIncludes = function (char) { + return !this.includes(char); +}; From 4cb3afd19ba88b7cc668d7ac3d78c2c4870ef915 Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 4 May 2024 20:43:55 +0900 Subject: [PATCH 10/25] =?UTF-8?q?feat(Game):=20Game=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게임의 상태 및 로직을 관리하는 Game 클래스를 구현했습니다. - 1~9까지 서로 다른 세 개의 정수를 만드는 generateRandomNumber 메서드 구현 - user의 input값을 통해 결과를 도출하는 compareResult 메서드 구현 - user의 input값을 통해 strike, ball, nothing을 판별하는 countHits 메서드 구현 - 유저 input값의 유효성을 검사하는 isValid 메서드 구현 - input 값을 초기화하고 focus를 주는 resetInputEl 메서드 구현 - 에러메시지를 출력하고, resetInputEl 메서드를 출력하는 alertHandler 메서드 구현 - strike, ball, nothing 값에 따라 결론 값을 생성하는 setResult 메서드 구현 - result 값을 출력할 수 있는 getResult 메서드 구현 --- src/game.js | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/game.js diff --git a/src/game.js b/src/game.js new file mode 100644 index 0000000..92846f8 --- /dev/null +++ b/src/game.js @@ -0,0 +1,111 @@ +import "./isNotIncludes.js"; + +export class Game { + #answer; + + constructor() { + this.#answer = this.generateRandomNumber(); + this.result = ""; + this.isGameSet = false; + } + + generateRandomNumber() { + let number = ""; + + while (number.length < 3) { + const randomNumber = Math.floor(Math.random() * 9) + 1; + if (number.isNotIncludes(randomNumber)) { + number += randomNumber; + } + } + + console.log(number); + return number; + } + + compareResult(inputEl) { + let inputValue = inputEl.value; + if (!this.#isValid(inputValue)) { + this.#alertHandler(inputEl); + return; + } + const { strikeCount, ballCount, nothingCount } = this.#countHits(inputValue); + this.#setResult(strikeCount, ballCount, nothingCount); + } + + #countHits(inputValue) { + let nothingCount = 0; + let strikeCount = 0; + let ballCount = 0; + + for (let i = 0; i < this.#answer.length; i++) { + if (inputValue[i] === this.#answer[i]) { + strikeCount += 1; + continue; + } + + if (inputValue.isNotIncludes(this.#answer[i])) { + nothingCount += 1; + } else { + ballCount += 1; + } + } + + return { strikeCount, ballCount, nothingCount }; + } + + #alertHandler(inputEl) { + alert("1~9까지의 수를 중복없이 3개 입력해주세요."); + this.#resetInputEl(inputEl); + } + + #resetInputEl(inputEl) { + inputEl.value = ""; + inputEl.focus(); + } + + #setResult(strikeCount, ballCount, nothingCount) { + if (nothingCount === 3) { + this.result = "낫싱"; + } else if (strikeCount === 3) { + this.result = "🎉정답을 맞추셨습니다🎉"; + this.isGameSet = true; + } else { + if (strikeCount === 0) { + this.result = `${ballCount}볼`; + } else if (ballCount === 0) { + this.result = `${strikeCount}스트라이크`; + } else { + this.result = `${ballCount}볼 ${strikeCount}스트라이크`; + } + } + } + + getResult() { + return this.result; + } + + #isValid(input) { + let numPattern = /^[1-9]+$/; + + if (!numPattern.test(input)) { + return false; + } + if (input.length !== 3) { + return false; + } + if (new Set(input).size !== input.length) { + return false; + } + + return true; + } + + restart(complete) { + this.#answer = this.generateRandomNumber(); + this.result = ""; + this.isGameSet = false; + + complete(); + } +} From ee99ae6963d4a033f1d3eeccb5fbe12115d55325 Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 4 May 2024 20:46:14 +0900 Subject: [PATCH 11/25] =?UTF-8?q?feat(Game):=20String.prototype.isNotInclu?= =?UTF-8?q?des=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 코드 가독성을 위해 String 타입의 includes() 메서드 값을 반전시킨 값을 return 하는 isNotIncludes 메서드를 구현했습니다. --- src/isNotIncludes.js | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/isNotIncludes.js diff --git a/src/isNotIncludes.js b/src/isNotIncludes.js new file mode 100644 index 0000000..7f42372 --- /dev/null +++ b/src/isNotIncludes.js @@ -0,0 +1,3 @@ +String.prototype.isNotIncludes = function (char) { + return !this.includes(char); +}; From 362a2925448ecb175a14338cd03b6b805117a7ad Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 4 May 2024 20:57:40 +0900 Subject: [PATCH 12/25] =?UTF-8?q?feat(Game):=20=ED=83=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=83=81=ED=98=B8=EC=9E=91=EC=9A=A9=20=EB=B0=8F=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EB=A1=9C=EC=A7=81=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HTML 문서 내 태그 이벤트와 게임 로직을 결합했습니다. - Game 클래스 import 후 인스턴스 생성 - input 버튼 클릭 시 입력된 값을 바탕으로 결론을 도출하는 compareResult 메서드 실행 - 정답 시 게임 재시작 버튼 및 메시지 출력 - 재시작 버튼 클릭 시 게임 초기화 및 새 게임 시작 --- src/main.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/main.js b/src/main.js index e69de29..7022d5d 100644 --- a/src/main.js +++ b/src/main.js @@ -0,0 +1,29 @@ +import { Game } from "./game.js"; + +const inputEl = document.querySelector(".input #input__textfield"); +const inputBtnEl = document.querySelector(".input #input__btn"); +const resultTxtEl = document.querySelector(".result .result__text"); +const restartBtnEl = document.querySelector(".result .result__btn"); +const restartMsgEl = document.querySelector(".result .result__message"); + +const game = new Game(); +console.log(game.answer); + +inputBtnEl.addEventListener("click", function () { + game.compareResult(inputEl); + resultTxtEl.innerText = game.getResult(); + + if (game.isGameSet) { + restartMsgEl.innerText = "게임을 새로 시작하시겠습니까?"; + restartBtnEl.type = "button"; + } +}); + +restartBtnEl.addEventListener("click", function () { + game.restart(() => { + restartBtnEl.type = "hidden"; + resultTxtEl.innerText = game.getResult(); + inputEl.value = ""; + restartMsgEl.innerText = ""; + }); +}); From 13c07c32289b063b500b4e59a15d311f7c5e5e0b Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 4 May 2024 21:03:47 +0900 Subject: [PATCH 13/25] =?UTF-8?q?feat(Game):=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=ED=85=8D=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 디자인 요구사항에 맞춰 스타일을 적용했습니다. --- src/main.css | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main.css b/src/main.css index b01a9b4..b28974b 100644 --- a/src/main.css +++ b/src/main.css @@ -1,5 +1,8 @@ -.result .reult__btn--end { +.result .result__text { + font-weight: 700; + margin-bottom: 24px; } -.result .result__btn--new { +.result .result__restartMessage { + margin-bottom: 24px; } From d63684fffac093b48f5b5454173d3d412258525a Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 4 May 2024 21:05:35 +0900 Subject: [PATCH 14/25] =?UTF-8?q?refactor(Game):=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=ED=83=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HTML 구조에 맞게 태그 이름을 수정했습니다. --- index.html | 4 ++-- src/main.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index cf0e194..7346913 100644 --- a/index.html +++ b/index.html @@ -25,8 +25,8 @@

⚾️ 숫자 야구 게임

📄 결과

- - +
+
diff --git a/src/main.js b/src/main.js index 7022d5d..836bf6e 100644 --- a/src/main.js +++ b/src/main.js @@ -4,7 +4,7 @@ const inputEl = document.querySelector(".input #input__textfield"); const inputBtnEl = document.querySelector(".input #input__btn"); const resultTxtEl = document.querySelector(".result .result__text"); const restartBtnEl = document.querySelector(".result .result__btn"); -const restartMsgEl = document.querySelector(".result .result__message"); +const restartMsgEl = document.querySelector(".result .result__restartMessage"); const game = new Game(); console.log(game.answer); From cd3371341b4f3c407f66448e354261890df3ec39 Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 4 May 2024 21:07:49 +0900 Subject: [PATCH 15/25] =?UTF-8?q?fix(UI):=20=EA=B2=8C=EC=9E=84=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=B0=B0=EC=B9=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 디자인 요구사항에 맞춰 컴포넌트들의 위치를 수정했습니다. - span 태그를 div 태그로 변경하여 컴포넌트 수직 배치 --- index.html | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/index.html b/index.html index 7346913..e20c97e 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,9 @@ + + +
@@ -19,20 +22,15 @@

⚾️ 숫자 야구 게임


- - + +

📄 결과

- - - - - - +
From 298179503cd4940996540d4ee7d452dcbc88da2f Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 May 2024 02:23:01 +0900 Subject: [PATCH 16/25] =?UTF-8?q?feat(UI):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=ED=83=80=EC=9D=B4=ED=8B=80=20=EB=B0=8F=20=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?UI=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게임 타이틀과 로그 section 구현 및 스타일을 적용했습니다. --- index.html | 55 +++++++++++++++++--------- src/main.css | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 142 insertions(+), 20 deletions(-) diff --git a/index.html b/index.html index e20c97e..8035ad8 100644 --- a/index.html +++ b/index.html @@ -9,30 +9,47 @@ -
-

⚾️ 숫자 야구 게임

+
+
+
+
+ +
-
- 1~9까지의 수를 중복없이 3개 입력해주세요. +

⚾️ 숫자 야구 게임

-
올바른 예) 139
-
틀린 예) 122
-
+
+ 1~9까지의 수를 중복없이 3개 입력해주세요. -
+
올바른 예) 139
+
틀린 예) 122
+
-
- - -
+
-
-

📄 결과

-
-
- -
+
+ + +
- +
+

📄 결과

+
+
+ + +
+ +

📋 기록

+
+
    +
    + + +
    diff --git a/src/main.css b/src/main.css index b28974b..79e419f 100644 --- a/src/main.css +++ b/src/main.css @@ -1,8 +1,113 @@ +body { + margin: 0; + padding: 0; + overflow: hidden; +} + +#app { + margin: 50px; +} + +.titleScreen { + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: #edeae1; + transition: 0.4s; + visibility: visible; + opacity: 1; + user-select: none; + z-index: 5; +} + +.titleScreen.hidden { + visibility: hidden; + opacity: 0; +} + +.titleScreen .triangle-red { + top: 0; + left: 0; + border-bottom: 40vh solid transparent; + border-left: 60vw solid #f1535a; + border-right: 360px solid transparent; +} + +.titleScreen .triangle-offblack { + position: absolute; + bottom: 0; + right: 0; + border-top: 30vh solid transparent; + border-left: 50vw solid transparent; + border-right: 70vw solid #2f2f2f; +} + +.titleScreen .container { + position: fixed; + top: 50%; + left: 50%; + text-align: center; + transform: translate(-50%, -50%); + opacity: 1; + transition: 2s; +} + +.titleScreen .container.hidden { + opacity: 0; +} + +.titleScreen .titleScreen__image { + font-size: 300px; +} + +.titleScreen .titleScreen__title { + color: #2f2f2f; + font-weight: 700; + font-size: 120px; + margin-bottom: 100px; +} + +.titleScreen .titleScreen__startBtn { + font-size: 40px; + margin-bottom: 120px; + color: #2f2f2f; + cursor: pointer; + transition: 0.2s; + font-weight: 700; + display: inline-block; +} + +.titleScreen .titleScreen__startBtn:hover { + color: #f1535a; +} + +.result { + min-height: 150px; +} + .result .result__text { font-weight: 700; - margin-bottom: 24px; } .result .result__restartMessage { margin-bottom: 24px; } + +.log { + width: 500px; + height: 500px; + position: absolute; + overflow: auto; + margin: 20px; + background-color: rgba(95, 95, 95, 0.15); + border-radius: 20px; +} + +.log .loglist { +} + +.log .loglist li { + margin: 30px; +} From bad827b64fc6f377e17f8a0406e5331a4e1516b7 Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 May 2024 02:26:23 +0900 Subject: [PATCH 17/25] =?UTF-8?q?refactor(Module):=20DomManipulation=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dom 조작 로직을 모듈로 분리했습니다. --- src/components/domManipulation.js | 48 +++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/components/domManipulation.js diff --git a/src/components/domManipulation.js b/src/components/domManipulation.js new file mode 100644 index 0000000..58a03fd --- /dev/null +++ b/src/components/domManipulation.js @@ -0,0 +1,48 @@ +import { + inputTextFieldEl, + inputBtnEl, + resultTxtEl, + restartMsgEl, + logsEl, + restartBtnEl, + finishBtnEl, +} from "./elements.js"; + +export function showElement(element) { + element.classList.remove("hidden"); +} + +export function hideElement(element) { + element.classList.add("hidden"); +} + +export function clearElements() { + resultTxtEl.innerText = ""; + restartMsgEl.innerText = ""; + logsEl.innerHTML = ""; + restartBtnEl.type = "hidden"; + finishBtnEl.type = "hidden"; + enableBtn(inputBtnEl); +} + +export function enableInputTextField() { + inputTextFieldEl.disabled = false; +} + +export function disableInputTextField() { + inputTextFieldEl.disabled = true; +} + +export function enableBtn(btnEl) { + btnEl.disabled = false; +} + +export function disableBtn(btnEl) { + btnEl.disabled = true; +} + +export function appendLog(log) { + const li = document.createElement("li"); + li.textContent = log; + logsEl.appendChild(li); +} From 71c40659946c4e4e14f63c3c874a938a4bdf1b54 Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 May 2024 02:28:37 +0900 Subject: [PATCH 18/25] =?UTF-8?q?refactor(Constants):=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=20=EC=9E=AC=EC=8B=9C=EC=9E=91=20=EB=A9=94=EC=8B=9C=EC=A7=80,?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=EB=A9=94=EC=8B=9C=EC=A7=80,=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=83=81?= =?UTF-8?q?=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 프로그램 전반에서 메시지를 관리하고 재사용하기 위한 constants 모듈 --- src/utils/constants.js | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/utils/constants.js diff --git a/src/utils/constants.js b/src/utils/constants.js new file mode 100644 index 0000000..2eec6b2 --- /dev/null +++ b/src/utils/constants.js @@ -0,0 +1,4 @@ +export const RESTART_MESSAGE = "게임을 새로 시작하시겠습니까?"; +export const ERROR_MESSAGE = "1~9까지의 수를 중복없이 3개 입력해주세요."; +export const RESULT_NOTHING = "낫싱"; +export const RESULT_CORRECT = "🎉정답을 맞추셨습니다🎉"; From 59c417d1741020d34446064747a9aff8cb5b76b5 Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 May 2024 02:30:11 +0900 Subject: [PATCH 19/25] =?UTF-8?q?refactor(Elements):=20DOM=20=EC=9A=94?= =?UTF-8?q?=EC=86=8C=20=EC=83=81=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 프로그램 전체에서 요소에 쉽게 접근하고 코드의 가독성을 향상 시키기 위해 elements 모듈로 분리했습니다. --- src/components/elements.js | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/components/elements.js diff --git a/src/components/elements.js b/src/components/elements.js new file mode 100644 index 0000000..506cebc --- /dev/null +++ b/src/components/elements.js @@ -0,0 +1,10 @@ +export const inputTextFieldEl = document.querySelector(".input #input__textfield"); +export const inputBtnEl = document.querySelector(".input #input__btn"); +export const resultTxtEl = document.querySelector(".result .result__text"); +export const restartBtnEl = document.querySelector(".result .result__btn--restart"); +export const finishBtnEl = document.querySelector(".result .result__btn--finish"); +export const restartMsgEl = document.querySelector(".result .result__restartMessage"); +export const titleStartBtnEl = document.querySelector(".titleScreen .titleScreen__startBtn"); +export const titleScreenEl = document.querySelector(".titleScreen"); +export const titleContainersEl = document.querySelector(".titleScreen .container"); +export const logsEl = document.querySelector(".loglist"); From 3beadaabab7f50b6e7d668cd0412ed44183a6bd3 Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 May 2024 02:34:24 +0900 Subject: [PATCH 20/25] =?UTF-8?q?feat(Game):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B0=8F=20DOM=20=EC=A1=B0=EC=9E=91=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게임 인스턴스와의 상호작용이 가능하며, 사용자 상호작용을 처리할 수 있습니다. - game 인스턴스를 의존성 주입하는 initGameInstance 함수 구현 - TextField에서 'Enter' 입력 시의 로직을 처리하는 handleInputTextFieldKeyPress 함수 구현 - 확인 버튼 클릭시의 로직을 처리하는 handleInputBtnClick 함수 구현 - 재시작 버튼 클릭시의 로직을 처리하는 handleRestartBtnClick 함수 구현 - 게임 타이틀 시작 버튼 클릭 시의 로직을 처리하는 handleTitleStartBtnClick 함수 구현 - DOM 로딩 완료시의 로직을 처리하는 handleDOMContentLoaded 함수 구현 - 게임 종료 버튼 클릭 시의 로직을 처리하는 handleFinishBtnClick 함수 구현 --- src/games/eventHandlers.js | 79 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/games/eventHandlers.js diff --git a/src/games/eventHandlers.js b/src/games/eventHandlers.js new file mode 100644 index 0000000..dea81d4 --- /dev/null +++ b/src/games/eventHandlers.js @@ -0,0 +1,79 @@ +import { + inputTextFieldEl, + inputBtnEl, + restartBtnEl, + resultTxtEl, + restartMsgEl, + finishBtnEl, + titleScreenEl, + titleContainersEl, +} from "../components/elements.js"; + +import { + showElement, + hideElement, + clearElements, + enableInputTextField, + disableInputTextField, + enableBtn, + disableBtn, + appendLog, +} from "../components/domManipulation.js"; + +import { RESTART_MESSAGE } from "../utils/constants.js"; + +let game; + +export function initGameInstance(gameInstance) { + game = gameInstance; +} + +export function handleInputTextFieldKeyPress(event) { + if (event.key === "Enter") { + inputBtnEl.click(); + } +} + +export function handleInputBtnClick() { + if (game.compareResult(inputTextFieldEl)) { + resultTxtEl.innerText = game.getResult(); + inputTextFieldEl.value = ""; + inputTextFieldEl.focus(); + + if (game.isGameSet) { + disableInputTextField(); + disableBtn(inputBtnEl); + restartMsgEl.innerText = RESTART_MESSAGE; + restartBtnEl.type = "button"; + finishBtnEl.type = "button"; + } + + appendLog(game.getLastLog()); + } +} + +export function handleRestartBtnClick() { + game.restart(() => { + enableInputTextField(); + enableBtn(inputBtnEl); + clearElements(); + inputTextFieldEl.focus(); + }); +} + +export function handleTitleStartBtnClick() { + enableInputTextField(); + hideElement(titleScreenEl); + inputTextFieldEl.focus(); + game.generateRandomNumber(); +} + +export function handleDOMContentLoaded() { + showElement(titleContainersEl); +} + +export function handleFinishBtnClick() { + showElement(titleScreenEl); + clearElements(); + game.isGameSet = false; +} From 9ec4a75f08d4f376d2c1d25aebb521eb33577f00 Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 May 2024 02:35:14 +0900 Subject: [PATCH 21/25] =?UTF-8?q?refactor:=20=EB=AA=A8=EB=93=88=ED=99=94?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit main.js에 있던 코드들을 모듈화 했습니다. --- src/main.js | 44 +++++++++++++------------------- src/{ => utils}/isNotIncludes.js | 0 2 files changed, 18 insertions(+), 26 deletions(-) rename src/{ => utils}/isNotIncludes.js (100%) diff --git a/src/main.js b/src/main.js index 836bf6e..50bc186 100644 --- a/src/main.js +++ b/src/main.js @@ -1,29 +1,21 @@ -import { Game } from "./game.js"; - -const inputEl = document.querySelector(".input #input__textfield"); -const inputBtnEl = document.querySelector(".input #input__btn"); -const resultTxtEl = document.querySelector(".result .result__text"); -const restartBtnEl = document.querySelector(".result .result__btn"); -const restartMsgEl = document.querySelector(".result .result__restartMessage"); +import { Game } from "./games/game.js"; +import { inputTextFieldEl, inputBtnEl, restartBtnEl, finishBtnEl, titleStartBtnEl } from "./components/elements.js"; +import { + initGameInstance, + handleInputTextFieldKeyPress, + handleInputBtnClick, + handleRestartBtnClick, + handleTitleStartBtnClick, + handleDOMContentLoaded, + handleFinishBtnClick, +} from "./games/eventHandlers.js"; const game = new Game(); -console.log(game.answer); - -inputBtnEl.addEventListener("click", function () { - game.compareResult(inputEl); - resultTxtEl.innerText = game.getResult(); - - if (game.isGameSet) { - restartMsgEl.innerText = "게임을 새로 시작하시겠습니까?"; - restartBtnEl.type = "button"; - } -}); -restartBtnEl.addEventListener("click", function () { - game.restart(() => { - restartBtnEl.type = "hidden"; - resultTxtEl.innerText = game.getResult(); - inputEl.value = ""; - restartMsgEl.innerText = ""; - }); -}); +initGameInstance(game); +inputTextFieldEl.addEventListener("keypress", handleInputTextFieldKeyPress); +inputBtnEl.addEventListener("click", handleInputBtnClick); +restartBtnEl.addEventListener("click", handleRestartBtnClick); +titleStartBtnEl.addEventListener("click", handleTitleStartBtnClick); +document.addEventListener("DOMContentLoaded", handleDOMContentLoaded); +finishBtnEl.addEventListener("click", handleFinishBtnClick); diff --git a/src/isNotIncludes.js b/src/utils/isNotIncludes.js similarity index 100% rename from src/isNotIncludes.js rename to src/utils/isNotIncludes.js From 023ff157f1b0ca6576968dbe3571705cd18fd9bb Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 May 2024 02:40:34 +0900 Subject: [PATCH 22/25] =?UTF-8?q?feat(Game):=20=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 에러 메시지, 결과 메시지를 constants.js 모듈의 상수로 대체하였습니다. - 로그를 출력하는 addLog 함수가 추가되었습니다. - 마지막 로그 값을 반환하는 getLastLog 함수가 추가되었습니다. - 순차적 동작을 위해 setResult에 콜백함수가 추가되었습니다. --- src/{ => games}/game.js | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) rename src/{ => games}/game.js (71%) diff --git a/src/game.js b/src/games/game.js similarity index 71% rename from src/game.js rename to src/games/game.js index 92846f8..c6f586c 100644 --- a/src/game.js +++ b/src/games/game.js @@ -1,12 +1,14 @@ -import "./isNotIncludes.js"; +import "../utils/isNotIncludes.js"; +import { ERROR_MESSAGE, RESULT_NOTHING, RESULT_CORRECT } from "../utils/constants.js"; export class Game { #answer; constructor() { - this.#answer = this.generateRandomNumber(); + this.#answer = undefined; this.result = ""; this.isGameSet = false; + this.logs = []; } generateRandomNumber() { @@ -18,26 +20,28 @@ export class Game { number += randomNumber; } } - console.log(number); - return number; + this.#answer = number; } compareResult(inputEl) { let inputValue = inputEl.value; if (!this.#isValid(inputValue)) { this.#alertHandler(inputEl); - return; + return false; } const { strikeCount, ballCount, nothingCount } = this.#countHits(inputValue); - this.#setResult(strikeCount, ballCount, nothingCount); + this.#setResult(strikeCount, ballCount, nothingCount, () => { + this.logs.push(`${inputValue}: ${this.result}`); + }); + + return true; } #countHits(inputValue) { let nothingCount = 0; let strikeCount = 0; let ballCount = 0; - for (let i = 0; i < this.#answer.length; i++) { if (inputValue[i] === this.#answer[i]) { strikeCount += 1; @@ -55,7 +59,7 @@ export class Game { } #alertHandler(inputEl) { - alert("1~9까지의 수를 중복없이 3개 입력해주세요."); + alert(ERROR_MESSAGE); this.#resetInputEl(inputEl); } @@ -64,11 +68,11 @@ export class Game { inputEl.focus(); } - #setResult(strikeCount, ballCount, nothingCount) { + #setResult(strikeCount, ballCount, nothingCount, callback) { if (nothingCount === 3) { - this.result = "낫싱"; + this.result = RESULT_NOTHING; } else if (strikeCount === 3) { - this.result = "🎉정답을 맞추셨습니다🎉"; + this.result = RESULT_CORRECT; this.isGameSet = true; } else { if (strikeCount === 0) { @@ -79,12 +83,24 @@ export class Game { this.result = `${ballCount}볼 ${strikeCount}스트라이크`; } } + + callback(); } getResult() { return this.result; } + getLastLog() { + return this.logs[this.logs.length - 1]; + } + + addLog(logsEl) { + const li = document.createElement("li"); + li.textContent = game.getLastLog(); + logsEl.appendChild(li); + } + #isValid(input) { let numPattern = /^[1-9]+$/; @@ -102,10 +118,9 @@ export class Game { } restart(complete) { - this.#answer = this.generateRandomNumber(); + this.generateRandomNumber(); this.result = ""; this.isGameSet = false; - complete(); } } From 6f0b4205a1e8f7aabf66ef56c8ba9fd907860d65 Mon Sep 17 00:00:00 2001 From: 00306 <114010099+00306@users.noreply.github.com> Date: Mon, 6 May 2024 03:00:23 +0900 Subject: [PATCH 23/25] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index d4fa92c..9349030 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,11 @@
    +### 로그 +* 사용자가 입력한 값과 그 결과값을 표시한다. + +
    + ### 정답 이후 처리 * 3개의 숫자를 모두 맞히면 게임이 종료되고 '🎉정답을 맞추셨습니다🎉' 메시지 출력과 함께 재시작 문구 및 버튼이 표시된다. From 732e7517b0b1b341cdb556ec10789d7fa121b0ac Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 May 2024 03:35:01 +0900 Subject: [PATCH 24/25] =?UTF-8?q?feat(UI):=20favicon=20=EB=B0=8F=20title?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 야구공 모양의 favicon이 추가되었습니다. - '숫자 야구' 라는 제목의 타이틀이 추가되었습니다. --- images/favicon.png | Bin 0 -> 48850 bytes index.html | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 images/favicon.png diff --git a/images/favicon.png b/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..a74328e90a638013b31c6666f0d7381809ee36c2 GIT binary patch literal 48850 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 - + 숫자 야구 + From 357a109da4bde9ccdca97bfb579081ed16dbe261 Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 May 2024 03:57:55 +0900 Subject: [PATCH 25/25] =?UTF-8?q?fix(UI):=20=EA=B2=B0=EA=B3=BC=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20margin-bottom=20=EA=B0=92=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 디자인 요구사항에 부합하도록 margin-bottom 값을 수정했습니다. --- src/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.css b/src/main.css index 79e419f..e24cc95 100644 --- a/src/main.css +++ b/src/main.css @@ -89,6 +89,7 @@ body { .result .result__text { font-weight: 700; + margin-bottom: 24px; } .result .result__restartMessage {