From 3c0eefd30fc1780ee5a188e88483fa7b5f630a72 Mon Sep 17 00:00:00 2001 From: coduhee Date: Tue, 13 Jan 2026 10:38:29 +0900 Subject: [PATCH 01/23] =?UTF-8?q?feat:=20=EB=AC=B8=EC=A0=9C=201=EB=B2=88?= =?UTF-8?q?=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/BaseballGame.swift | 39 ++++++++++++++++++++++++++++++++++ juhee/juhee/main.swift | 11 ++++++++++ 2 files changed, 50 insertions(+) create mode 100644 juhee/juhee/BaseballGame.swift create mode 100644 juhee/juhee/main.swift diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift new file mode 100644 index 0000000..c4e5e2b --- /dev/null +++ b/juhee/juhee/BaseballGame.swift @@ -0,0 +1,39 @@ +// +// BaseballGame.swift +// juhee +// +// Created by 김주희 on 1/13/26. +// + +import Foundation + +class BaseballGame { + func start() { + let answer = makeAnswer() + print(answer) + } + + // 1에서 9까지의 서로 다른 임의의 수 3개를 정하기 (abc) + func makeAnswer() -> Int { + + let a = Int.random(in: (1...9)) + var returnAnswer = a * 100 // 백의자리 숫자 a 대입 + + var b = Int.random(in: 1...9) + while a == b { + b = Int.random(in: 1...9) + } + returnAnswer += b * 10 // 십의 자리 숫자 b 대입 + + var c = Int.random(in: 1...9) + while a == c || b == c { + c = Int.random(in: 1...9) + } + returnAnswer += c // 일의 자리 숫자 c 대입 + + return returnAnswer + } + + +} + diff --git a/juhee/juhee/main.swift b/juhee/juhee/main.swift new file mode 100644 index 0000000..638c27c --- /dev/null +++ b/juhee/juhee/main.swift @@ -0,0 +1,11 @@ +// +// main.swift +// juhee +// +// Created by 김주희 on 1/13/26. +// + +import Foundation + +let game = BaseballGame() +game.start() From a6c06c9194051debb6b4a85435f36a1978d2c037 Mon Sep 17 00:00:00 2001 From: coduhee Date: Tue, 13 Jan 2026 16:24:52 +0900 Subject: [PATCH 02/23] =?UTF-8?q?feat:=20LV.2=20=ED=92=80=EC=9D=B4=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/BaseballGame.swift | 102 ++++++++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 15 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index c4e5e2b..44e4298 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -9,31 +9,103 @@ import Foundation class BaseballGame { func start() { - let answer = makeAnswer() - print(answer) + let answer = makeAnswer() // 정답 만드는 함수 + print("<게임을 시작합니다>") + + while true { + + // 1. 유저에게 입력값 받기 + print("숫자를 입력하세요") + guard let input = readLine(), + let inputNumber = Int(input), // 숫자로 변환 + checkInput(inputNumber) // 입력값 검사 함수 호출 + else { + print("올바르지 않은 입력값입니다.") + continue // 다시 입력하도록 while문 다시 실행 + } + + if compareInput(inputNumber, answer) == false { // 정답이면 false 출력하고 반복문에서 빠져나감 + break + } + } } - // 1에서 9까지의 서로 다른 임의의 수 3개를 정하기 (abc) - func makeAnswer() -> Int { - + func checkInput(_ inputNumber: Int) -> Bool { + var checkNum = inputNumber + let a = checkNum / 100 + checkNum -= a * 100 + + let b = checkNum / 10 + checkNum -= b * 10 + + let c = checkNum + + if a != b && b != c && c != a && 99 < inputNumber && inputNumber < 1000 { + return true + } else { + return false + } + + } + + // 입력값과 정답을 계산하는 함수 + func compareInput(_ number: Int, _ ansArray: Array) -> Bool { + var compareNum = number + var strike = 0 + var ball = 0 + + let a = compareNum / 100 + compareNum -= a * 100 + + let b = compareNum / 10 + compareNum -= b * 10 + + let c = compareNum + + let inputArray = [a, b, c] + + for (ansIdx, ansEle) in ansArray.enumerated(){ + for (iptIdx, iptEle) in inputArray.enumerated() { + if ansEle == iptEle { // 두 값이 같을때 + if ansIdx == iptIdx { // 인덱스 값도 같을때 + strike += 1 + } else { + ball += 1 + } + } + } + } + if (strike == 3 && ball == 0) { + print("정답입니다!") + return false + } else if (strike == 0 && ball == 0){ + print("Nothing") + return true + } else { + print("\(strike)스트라이크 \(ball)볼") + return true + } + + } + + + // LV. 1 + // 1에서 9까지의 서로 다른 임의의 정답인 수 3개를 정하기 (abc) + func makeAnswer() -> Array { + let a = Int.random(in: (1...9)) - var returnAnswer = a * 100 // 백의자리 숫자 a 대입 var b = Int.random(in: 1...9) while a == b { - b = Int.random(in: 1...9) + b = Int.random(in: 1...9) // a와 b가 다를때까지 b에 랜덤한 Int값 대입 } - returnAnswer += b * 10 // 십의 자리 숫자 b 대입 var c = Int.random(in: 1...9) while a == c || b == c { - c = Int.random(in: 1...9) + c = Int.random(in: 1...9) // c가 a, b값과 다를때까지 c에 랜덤한 Int값 대입 } - returnAnswer += c // 일의 자리 숫자 c 대입 - - return returnAnswer + + let answer: Array = [a, b, c] + return answer } - - } - From b26458f68f0befe8a3875651d7e3ac949387f1e0 Mon Sep 17 00:00:00 2001 From: coduhee Date: Tue, 13 Jan 2026 16:31:15 +0900 Subject: [PATCH 03/23] =?UTF-8?q?feat:=20LV.3=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/BaseballGame.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index 44e4298..cfceacb 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -95,14 +95,14 @@ class BaseballGame { let a = Int.random(in: (1...9)) - var b = Int.random(in: 1...9) + var b = Int.random(in: 0...9) while a == b { - b = Int.random(in: 1...9) // a와 b가 다를때까지 b에 랜덤한 Int값 대입 + b = Int.random(in: 0...9) // a와 b가 다를때까지 b에 랜덤한 Int값 대입 } - var c = Int.random(in: 1...9) + var c = Int.random(in: 0...9) while a == c || b == c { - c = Int.random(in: 1...9) // c가 a, b값과 다를때까지 c에 랜덤한 Int값 대입 + c = Int.random(in: 0...9) // c가 a, b값과 다를때까지 c에 랜덤한 Int값 대입 } let answer: Array = [a, b, c] From 4a0c8365a8a0ddb46d553c5c41ec8a0426f7c7be Mon Sep 17 00:00:00 2001 From: coduhee Date: Tue, 13 Jan 2026 16:48:55 +0900 Subject: [PATCH 04/23] =?UTF-8?q?feat:=20LV.4=20=EA=B3=BC=EC=A0=9C=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/BaseballGame.swift | 37 +++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index cfceacb..6c4e6f3 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -10,22 +10,35 @@ import Foundation class BaseballGame { func start() { let answer = makeAnswer() // 정답 만드는 함수 - print("<게임을 시작합니다>") + print("환영합니다! 원하시는 번호를 입력해주세요") + print("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기") while true { - // 1. 유저에게 입력값 받기 - print("숫자를 입력하세요") - guard let input = readLine(), - let inputNumber = Int(input), // 숫자로 변환 - checkInput(inputNumber) // 입력값 검사 함수 호출 - else { - print("올바르지 않은 입력값입니다.") - continue // 다시 입력하도록 while문 다시 실행 - } - - if compareInput(inputNumber, answer) == false { // 정답이면 false 출력하고 반복문에서 빠져나감 + let input = readLine() + switch input { + case "1": + while true { + print("<게임을 시작합니다> \n숫자를 입력하세요") + guard let inputNum = readLine(), + let inputNumber = Int(inputNum), // 숫자로 변환 + checkInput(inputNumber) // 입력값 검사 함수 호출 + else { + print("올바르지 않은 입력값입니다.") + continue // 다시 입력하도록 while문 다시 실행 + } + + if compareInput(inputNumber, answer) == false { // 정답이면 false 출력하고 반복문에서 빠져나감 + break + } + } + case "2": + print("게임 기록 보기") + case "3": + print("게임을 종료합니다.") break + default: + print("잘못된 값을 입력하였습니다. 번호를 다시 입력해주세요.") } } } From 19a86d48f0b5b25d0d874e09a4740713c922c4c7 Mon Sep 17 00:00:00 2001 From: coduhee Date: Tue, 13 Jan 2026 19:32:29 +0900 Subject: [PATCH 05/23] =?UTF-8?q?feat:=20LV.5=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/BaseballGame.swift | 21 ++++++++++++++------- juhee/juhee/RecordManager.swift | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 juhee/juhee/RecordManager.swift diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index 6c4e6f3..6427495 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -8,13 +8,15 @@ import Foundation class BaseballGame { + + var recordManager = RecordManager() // 기록을 관리하는 인스턴스 생성 + var appending = 0 + func start() { - let answer = makeAnswer() // 정답 만드는 함수 - print("환영합니다! 원하시는 번호를 입력해주세요") - print("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기") - while true { - // 1. 유저에게 입력값 받기 + let answer = makeAnswer() // 정답 만드는 함수 + print("환영합니다! 원하시는 번호를 입력해주세요") + print("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기") let input = readLine() switch input { case "1": @@ -29,11 +31,14 @@ class BaseballGame { } if compareInput(inputNumber, answer) == false { // 정답이면 false 출력하고 반복문에서 빠져나감 + recordManager.add(appending) // 배열에 시도 횟수 입력 + appending = 0 // appending 0으로 초기화 break } } case "2": - print("게임 기록 보기") + print("<게임 기록 보기>") + recordManager.showRecords() // showRecords 함수 호출 case "3": print("게임을 종료합니다.") break @@ -53,6 +58,8 @@ class BaseballGame { let c = checkNum + appending += 1 // 시도횟수 1 증가 + if a != b && b != c && c != a && 99 < inputNumber && inputNumber < 1000 { return true } else { @@ -102,7 +109,6 @@ class BaseballGame { } - // LV. 1 // 1에서 9까지의 서로 다른 임의의 정답인 수 3개를 정하기 (abc) func makeAnswer() -> Array { @@ -119,6 +125,7 @@ class BaseballGame { } let answer: Array = [a, b, c] + print(answer) return answer } } diff --git a/juhee/juhee/RecordManager.swift b/juhee/juhee/RecordManager.swift new file mode 100644 index 0000000..7d0dadb --- /dev/null +++ b/juhee/juhee/RecordManager.swift @@ -0,0 +1,23 @@ +// +// RecordManager.swift +// juhee +// +// Created by 김주희 on 1/13/26. +// + +import Foundation + +public class RecordManager { + var trialCounts: Array = [] + + func add(_ trialcount: Int){ + trialCounts.append(trialcount) + } + + func showRecords() { + for (idx, value) in trialCounts.enumerated() { + print("\(idx + 1)번째 게임: 시도 횟수 - \(value)") + } + } + +} From e1bb9ddd64f3c603056f218ac5e8674ec8c4d1b7 Mon Sep 17 00:00:00 2001 From: coduhee Date: Tue, 13 Jan 2026 19:45:10 +0900 Subject: [PATCH 06/23] =?UTF-8?q?feat:=20LV.6=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/BaseballGame.swift | 20 ++++++++++---------- juhee/juhee/RecordManager.swift | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index 6427495..aeafe2f 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -10,7 +10,7 @@ import Foundation class BaseballGame { var recordManager = RecordManager() // 기록을 관리하는 인스턴스 생성 - var appending = 0 + var nthTrial = 0 func start() { while true { @@ -20,8 +20,9 @@ class BaseballGame { let input = readLine() switch input { case "1": + print("<게임을 시작합니다>") while true { - print("<게임을 시작합니다> \n숫자를 입력하세요") + print("숫자를 입력하세요") guard let inputNum = readLine(), let inputNumber = Int(inputNum), // 숫자로 변환 checkInput(inputNumber) // 입력값 검사 함수 호출 @@ -31,8 +32,8 @@ class BaseballGame { } if compareInput(inputNumber, answer) == false { // 정답이면 false 출력하고 반복문에서 빠져나감 - recordManager.add(appending) // 배열에 시도 횟수 입력 - appending = 0 // appending 0으로 초기화 + recordManager.add(nthTrial) // 배열에 시도 횟수 입력 + nthTrial = 0 // 시도 횟수 0으로 초기화 break } } @@ -40,10 +41,10 @@ class BaseballGame { print("<게임 기록 보기>") recordManager.showRecords() // showRecords 함수 호출 case "3": - print("게임을 종료합니다.") - break + print("< 숫자 야구 게임을 종료합니다. >") + exit(0) // 강제 종료 함수 출력 default: - print("잘못된 값을 입력하였습니다. 번호를 다시 입력해주세요.") + print("올바른 숫자를 입력해주세요!") } } } @@ -58,7 +59,7 @@ class BaseballGame { let c = checkNum - appending += 1 // 시도횟수 1 증가 + nthTrial += 1 // 정답 맞추기 위한 시도 횟수 1 증가 if a != b && b != c && c != a && 99 < inputNumber && inputNumber < 1000 { return true @@ -102,7 +103,7 @@ class BaseballGame { print("Nothing") return true } else { - print("\(strike)스트라이크 \(ball)볼") + print("\(strike)스트라이크 \(ball)볼\n ") return true } @@ -125,7 +126,6 @@ class BaseballGame { } let answer: Array = [a, b, c] - print(answer) return answer } } diff --git a/juhee/juhee/RecordManager.swift b/juhee/juhee/RecordManager.swift index 7d0dadb..fdba7d3 100644 --- a/juhee/juhee/RecordManager.swift +++ b/juhee/juhee/RecordManager.swift @@ -8,7 +8,7 @@ import Foundation public class RecordManager { - var trialCounts: Array = [] + var trialCounts: Array = [] // 시도 횟수 저장할 빈 배열 func add(_ trialcount: Int){ trialCounts.append(trialcount) From 5f8014de08f76dcede9ba9c5f64f1d97bb0ab501 Mon Sep 17 00:00:00 2001 From: coduhee Date: Wed, 14 Jan 2026 10:51:41 +0900 Subject: [PATCH 07/23] =?UTF-8?q?refactor:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80,=20=ED=95=A8=EC=88=98=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GameCenter 클래스를 추가하고 기능 분산, 같은 기능을 하는 splitNumber 함수 생성 --- juhee/juhee/BaseballGame.swift | 87 +++--------------------------- juhee/juhee/GameCenter.swift | 93 +++++++++++++++++++++++++++++++++ juhee/juhee/RecordManager.swift | 2 +- 3 files changed, 100 insertions(+), 82 deletions(-) create mode 100644 juhee/juhee/GameCenter.swift diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index aeafe2f..9c65ab8 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -7,14 +7,15 @@ import Foundation -class BaseballGame { +public class BaseballGame { // 야구 게임 진행 클래스 var recordManager = RecordManager() // 기록을 관리하는 인스턴스 생성 + var game = GameCenter() // 게임 연산 계산 인스턴스 생성 var nthTrial = 0 func start() { while true { - let answer = makeAnswer() // 정답 만드는 함수 + let answer = game.makeAnswer() // 정답 만드는 함수 print("환영합니다! 원하시는 번호를 입력해주세요") print("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기") let input = readLine() @@ -25,13 +26,13 @@ class BaseballGame { print("숫자를 입력하세요") guard let inputNum = readLine(), let inputNumber = Int(inputNum), // 숫자로 변환 - checkInput(inputNumber) // 입력값 검사 함수 호출 + game.checkInput(inputNumber) // 입력값 검사 함수 호출 else { print("올바르지 않은 입력값입니다.") continue // 다시 입력하도록 while문 다시 실행 } - if compareInput(inputNumber, answer) == false { // 정답이면 false 출력하고 반복문에서 빠져나감 + if game.compareInput(inputNumber, answer) == false { // 정답이면 false 출력하고 반복문에서 빠져나감 recordManager.add(nthTrial) // 배열에 시도 횟수 입력 nthTrial = 0 // 시도 횟수 0으로 초기화 break @@ -49,83 +50,7 @@ class BaseballGame { } } - func checkInput(_ inputNumber: Int) -> Bool { - var checkNum = inputNumber - let a = checkNum / 100 - checkNum -= a * 100 - - let b = checkNum / 10 - checkNum -= b * 10 - - let c = checkNum - - nthTrial += 1 // 정답 맞추기 위한 시도 횟수 1 증가 - - if a != b && b != c && c != a && 99 < inputNumber && inputNumber < 1000 { - return true - } else { - return false - } - - } - - // 입력값과 정답을 계산하는 함수 - func compareInput(_ number: Int, _ ansArray: Array) -> Bool { - var compareNum = number - var strike = 0 - var ball = 0 - - let a = compareNum / 100 - compareNum -= a * 100 - - let b = compareNum / 10 - compareNum -= b * 10 - - let c = compareNum - - let inputArray = [a, b, c] - - for (ansIdx, ansEle) in ansArray.enumerated(){ - for (iptIdx, iptEle) in inputArray.enumerated() { - if ansEle == iptEle { // 두 값이 같을때 - if ansIdx == iptIdx { // 인덱스 값도 같을때 - strike += 1 - } else { - ball += 1 - } - } - } - } - if (strike == 3 && ball == 0) { - print("정답입니다!") - return false - } else if (strike == 0 && ball == 0){ - print("Nothing") - return true - } else { - print("\(strike)스트라이크 \(ball)볼\n ") - return true - } - - } + - // 1에서 9까지의 서로 다른 임의의 정답인 수 3개를 정하기 (abc) - func makeAnswer() -> Array { - - let a = Int.random(in: (1...9)) - - var b = Int.random(in: 0...9) - while a == b { - b = Int.random(in: 0...9) // a와 b가 다를때까지 b에 랜덤한 Int값 대입 - } - - var c = Int.random(in: 0...9) - while a == c || b == c { - c = Int.random(in: 0...9) // c가 a, b값과 다를때까지 c에 랜덤한 Int값 대입 - } - - let answer: Array = [a, b, c] - return answer - } } diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift new file mode 100644 index 0000000..440a091 --- /dev/null +++ b/juhee/juhee/GameCenter.swift @@ -0,0 +1,93 @@ +// +// GameCenter.swift +// juhee +// +// Created by 김주희 on 1/14/26. +// + +import Foundation + +class GameCenter { // 게임에 필요한 계산을 하는 클래스 + + + // 사용자가 입력한 값 검증 + func checkInput(_ inputNumber: Int) -> Bool { + + var arr = splitNum(inputNumber) + +// nthTrial += 1 // 정답 맞추기 위한 시도 횟수 1 증가 + + if arr[0] != arr[1] + && arr[1] != arr[2] + && arr[0] != arr[2] + && 99 < inputNumber + && inputNumber < 1000 { + return true + } else { + return false + } + } + + // 입력값과 정답을 계산하는 함수 + func compareInput(_ number: Int, _ ansArray: Array) -> Bool { + var strike = 0 + var ball = 0 + + + let inputArray = splitNum(number) + + for (ansIdx, ansEle) in ansArray.enumerated(){ + for (iptIdx, iptEle) in inputArray.enumerated() { + if ansEle == iptEle { // 두 값이 같을때 + if ansIdx == iptIdx { // 인덱스 값도 같을때 + strike += 1 + } else { + ball += 1 + } + } + } + } + if (strike == 3 && ball == 0) { + print("정답입니다!") + return false + } else if (strike == 0 && ball == 0){ + print("Nothing") + return true + } else { + print("\(strike)스트라이크 \(ball)볼\n ") + return true + } + + } + + // 정답 만드는 함수 + // 1에서 9까지의 서로 다른 임의의 정답인 수 3개를 정하기 (abc) + func makeAnswer() -> Array { + + let a = Int.random(in: (1...9)) + + var b = Int.random(in: 0...9) + while a == b { + b = Int.random(in: 0...9) // a와 b가 다를때까지 b에 랜덤한 Int값 대입 + } + + var c = Int.random(in: 0...9) + while a == c || b == c { + c = Int.random(in: 0...9) // c가 a, b값과 다를때까지 c에 랜덤한 Int값 대입 + } + + let answer: Array = [a, b, c] + return answer + } + + + // 입력한 세자리 수를 숫자 각 한개씩으로 배열로 쪼개는 함수 + func splitNum(_ num: Int) -> [Int] { + let a = num / 100 + let b = num / 10 + let c = num % 10 + return [a, b, c] + } + + +} diff --git a/juhee/juhee/RecordManager.swift b/juhee/juhee/RecordManager.swift index fdba7d3..4efdd39 100644 --- a/juhee/juhee/RecordManager.swift +++ b/juhee/juhee/RecordManager.swift @@ -7,7 +7,7 @@ import Foundation -public class RecordManager { +public class RecordManager { // 기록 관리 클래스 var trialCounts: Array = [] // 시도 횟수 저장할 빈 배열 func add(_ trialcount: Int){ From 9b740e37ac28a376fad6b13895735585b821ad69 Mon Sep 17 00:00:00 2001 From: coduhee Date: Wed, 14 Jan 2026 11:02:25 +0900 Subject: [PATCH 08/23] =?UTF-8?q?refactor:=20.contains=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=82=AC=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EA=B0=84=EA=B2=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/BaseballGame.swift | 3 ++- juhee/juhee/GameCenter.swift | 19 +++++++------------ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index 9c65ab8..ec1a4e2 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -11,9 +11,10 @@ public class BaseballGame { // 야구 게임 진행 클래스 var recordManager = RecordManager() // 기록을 관리하는 인스턴스 생성 var game = GameCenter() // 게임 연산 계산 인스턴스 생성 - var nthTrial = 0 +// var nthTrial = 0 func start() { + while true { let answer = game.makeAnswer() // 정답 만드는 함수 print("환영합니다! 원하시는 번호를 입력해주세요") diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 440a091..18bc256 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -9,7 +9,6 @@ import Foundation class GameCenter { // 게임에 필요한 계산을 하는 클래스 - // 사용자가 입력한 값 검증 func checkInput(_ inputNumber: Int) -> Bool { @@ -33,20 +32,16 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 var strike = 0 var ball = 0 + let inputArray = splitNum(number) // 입력값을 쪼개서 세원소를 가진 배열로 - let inputArray = splitNum(number) - - for (ansIdx, ansEle) in ansArray.enumerated(){ - for (iptIdx, iptEle) in inputArray.enumerated() { - if ansEle == iptEle { // 두 값이 같을때 - if ansIdx == iptIdx { // 인덱스 값도 같을때 - strike += 1 - } else { - ball += 1 - } - } + for i in 0..<3 { + if inputArray[i] == ansArray[i] { + strike += 1 + } else if ansArray.contains(inputArray[i]) { + ball += 1 } } + if (strike == 3 && ball == 0) { print("정답입니다!") return false From 6e045cfb94a6e93a1801dcabce793b4337f210f1 Mon Sep 17 00:00:00 2001 From: coduhee Date: Wed, 14 Jan 2026 11:20:27 +0900 Subject: [PATCH 09/23] =?UTF-8?q?refactor:=20playGame()=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/BaseballGame.swift | 48 ++++++++++++++++++---------------- juhee/juhee/GameCenter.swift | 14 +++++----- 2 files changed, 33 insertions(+), 29 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index ec1a4e2..e30a5fc 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -11,34 +11,15 @@ public class BaseballGame { // 야구 게임 진행 클래스 var recordManager = RecordManager() // 기록을 관리하는 인스턴스 생성 var game = GameCenter() // 게임 연산 계산 인스턴스 생성 -// var nthTrial = 0 + var nthTrial = 0 func start() { - while true { - let answer = game.makeAnswer() // 정답 만드는 함수 print("환영합니다! 원하시는 번호를 입력해주세요") print("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기") - let input = readLine() - switch input { + switch readLine() { case "1": - print("<게임을 시작합니다>") - while true { - print("숫자를 입력하세요") - guard let inputNum = readLine(), - let inputNumber = Int(inputNum), // 숫자로 변환 - game.checkInput(inputNumber) // 입력값 검사 함수 호출 - else { - print("올바르지 않은 입력값입니다.") - continue // 다시 입력하도록 while문 다시 실행 - } - - if game.compareInput(inputNumber, answer) == false { // 정답이면 false 출력하고 반복문에서 빠져나감 - recordManager.add(nthTrial) // 배열에 시도 횟수 입력 - nthTrial = 0 // 시도 횟수 0으로 초기화 - break - } - } + playGame() case "2": print("<게임 기록 보기>") recordManager.showRecords() // showRecords 함수 호출 @@ -49,6 +30,29 @@ public class BaseballGame { // 야구 게임 진행 클래스 print("올바른 숫자를 입력해주세요!") } } + + + func playGame(){ + let answer = game.makeAnswer() // 정답 만드는 함수 + print("<게임을 시작합니다>") + while true { + print("숫자를 입력하세요") + guard let inputNum = readLine(), + let inputNumber = Int(inputNum), // 숫자로 변환 + game.checkInput(inputNumber) // 입력값 검사 함수 호출 + else { + print("올바르지 않은 입력값입니다.") + continue // 다시 입력하도록 while문 다시 실행 + } + + if game.compareInput(inputNumber, answer) == "True" { + // 정답이면 "True" 출력하고 반복문에서 빠져나감 + recordManager.add(nthTrial) // 배열에 시도 횟수 입력 + nthTrial = 0 // 시도 횟수 0으로 초기화 + break + } + } + } } diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 18bc256..802bc08 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -11,10 +11,9 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 // 사용자가 입력한 값 검증 func checkInput(_ inputNumber: Int) -> Bool { + let arr = splitNum(inputNumber) - var arr = splitNum(inputNumber) - -// nthTrial += 1 // 정답 맞추기 위한 시도 횟수 1 증가 + nthTrial += 1 // 정답 맞추기 위한 시도 횟수 1 증가 if arr[0] != arr[1] && arr[1] != arr[2] @@ -28,12 +27,13 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 } // 입력값과 정답을 계산하는 함수 - func compareInput(_ number: Int, _ ansArray: Array) -> Bool { + func compareInput(_ number: Int, _ ansArray: Array) -> String { var strike = 0 var ball = 0 let inputArray = splitNum(number) // 입력값을 쪼개서 세원소를 가진 배열로 + // strike,ball에 값 입력 for i in 0..<3 { if inputArray[i] == ansArray[i] { strike += 1 @@ -44,13 +44,13 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 if (strike == 3 && ball == 0) { print("정답입니다!") - return false + return "True" } else if (strike == 0 && ball == 0){ print("Nothing") - return true + return "False" } else { print("\(strike)스트라이크 \(ball)볼\n ") - return true + return "False" } } From 024507fdffb4e4f47ed29a336c25d73a471c6e51 Mon Sep 17 00:00:00 2001 From: coduhee Date: Wed, 14 Jan 2026 12:24:37 +0900 Subject: [PATCH 10/23] =?UTF-8?q?refactor:=20GameCounter=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/BaseballGame.swift | 8 +++++--- juhee/juhee/GameCenter.swift | 15 ++++++++------- juhee/juhee/GameCounter.swift | 17 +++++++++++++++++ 3 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 juhee/juhee/GameCounter.swift diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index e30a5fc..1e8aa7d 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -11,7 +11,7 @@ public class BaseballGame { // 야구 게임 진행 클래스 var recordManager = RecordManager() // 기록을 관리하는 인스턴스 생성 var game = GameCenter() // 게임 연산 계산 인스턴스 생성 - var nthTrial = 0 + var gameCounter = GameCounter(trial: 0) func start() { while true { @@ -45,10 +45,12 @@ public class BaseballGame { // 야구 게임 진행 클래스 continue // 다시 입력하도록 while문 다시 실행 } + gameCounter.trial += 1 + if game.compareInput(inputNumber, answer) == "True" { // 정답이면 "True" 출력하고 반복문에서 빠져나감 - recordManager.add(nthTrial) // 배열에 시도 횟수 입력 - nthTrial = 0 // 시도 횟수 0으로 초기화 + recordManager.add(gameCounter.trial) // 배열에 시도 횟수 입력 + gameCounter.trial = 0 // 시도 횟수 0으로 초기화 break } } diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 802bc08..00189ec 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -9,12 +9,11 @@ import Foundation class GameCenter { // 게임에 필요한 계산을 하는 클래스 + // 사용자가 입력한 값 검증 func checkInput(_ inputNumber: Int) -> Bool { let arr = splitNum(inputNumber) - nthTrial += 1 // 정답 맞추기 위한 시도 횟수 1 증가 - if arr[0] != arr[1] && arr[1] != arr[2] && arr[0] != arr[2] @@ -31,13 +30,13 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 var strike = 0 var ball = 0 - let inputArray = splitNum(number) // 입력값을 쪼개서 세원소를 가진 배열로 - - // strike,ball에 값 입력 + let inputArray = splitNum(number) // 입력값을 쪼개서 세 원소를 가진 배열로 + + // strike, ball에 값 입력 for i in 0..<3 { if inputArray[i] == ansArray[i] { strike += 1 - } else if ansArray.contains(inputArray[i]) { + } else if ansArray.contains(inputArray[i]){ ball += 1 } } @@ -72,6 +71,8 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 } let answer: Array = [a, b, c] + print(answer) + return answer } @@ -79,7 +80,7 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 // 입력한 세자리 수를 숫자 각 한개씩으로 배열로 쪼개는 함수 func splitNum(_ num: Int) -> [Int] { let a = num / 100 - let b = num / 10 + let b = num / 10 - a * 10 let c = num % 10 return [a, b, c] } diff --git a/juhee/juhee/GameCounter.swift b/juhee/juhee/GameCounter.swift new file mode 100644 index 0000000..9f967f1 --- /dev/null +++ b/juhee/juhee/GameCounter.swift @@ -0,0 +1,17 @@ +// +// GameCounter.swift +// juhee +// +// Created by 김주희 on 1/14/26. +// + +import Foundation + +class GameCounter { + init(trial: Int) { + self.trial = trial + } + + var trial: Int + +} From 92c324c497916a6457f6236275b17f8fa58105e3 Mon Sep 17 00:00:00 2001 From: coduhee Date: Thu, 15 Jan 2026 10:05:21 +0900 Subject: [PATCH 11/23] =?UTF-8?q?feat:=20array->set=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/BaseballGame.swift | 23 +++++++++++++---------- juhee/juhee/GameCenter.swift | 8 +++----- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index 1e8aa7d..e1b3513 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -10,13 +10,15 @@ import Foundation public class BaseballGame { // 야구 게임 진행 클래스 var recordManager = RecordManager() // 기록을 관리하는 인스턴스 생성 - var game = GameCenter() // 게임 연산 계산 인스턴스 생성 + var gameCenter = GameCenter() // 게임 연산 계산 인스턴스 생성 var gameCounter = GameCounter(trial: 0) func start() { + while true { print("환영합니다! 원하시는 번호를 입력해주세요") print("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기") + switch readLine() { case "1": playGame() @@ -33,24 +35,25 @@ public class BaseballGame { // 야구 게임 진행 클래스 func playGame(){ - let answer = game.makeAnswer() // 정답 만드는 함수 + let answer = gameCenter.makeAnswer() // 정답 만드는 함수 print("<게임을 시작합니다>") + while true { print("숫자를 입력하세요") - guard let inputNum = readLine(), - let inputNumber = Int(inputNum), // 숫자로 변환 - game.checkInput(inputNumber) // 입력값 검사 함수 호출 + guard let input = readLine(), + let inputNumber = Int(input), // 숫자로 변환 + gameCenter.checkInput(inputNumber) // 입력값 검사 함수 호출 else { print("올바르지 않은 입력값입니다.") continue // 다시 입력하도록 while문 다시 실행 } - gameCounter.trial += 1 + gameCounter.trial += 1 // 올바른 숫자를 입력하였으므로 시도횟수 +1 - if game.compareInput(inputNumber, answer) == "True" { - // 정답이면 "True" 출력하고 반복문에서 빠져나감 - recordManager.add(gameCounter.trial) // 배열에 시도 횟수 입력 - gameCounter.trial = 0 // 시도 횟수 0으로 초기화 + if gameCenter.compareInput(inputNumber, answer) == "정답" { + // "정답"return하면 반복문에서 빠져나감 + recordManager.add(gameCounter.trial) // 정답이므로 배열에 최종 시도 횟수 입력 + gameCounter.trial = 0 // 해당 게임 시도 횟수 0으로 초기화 break } } diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 00189ec..157cb18 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -12,11 +12,9 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 // 사용자가 입력한 값 검증 func checkInput(_ inputNumber: Int) -> Bool { - let arr = splitNum(inputNumber) + let set = Set(splitNum(inputNumber)) - if arr[0] != arr[1] - && arr[1] != arr[2] - && arr[0] != arr[2] + if set.count == 3 // Array를 Set으로 변환하여 중복을 제외한 값이 3이어야 함 && 99 < inputNumber && inputNumber < 1000 { return true @@ -43,7 +41,7 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 if (strike == 3 && ball == 0) { print("정답입니다!") - return "True" + return "정답" } else if (strike == 0 && ball == 0){ print("Nothing") return "False" From b575a572ef02cd7d553ff848c90b08458c545411 Mon Sep 17 00:00:00 2001 From: coduhee Date: Thu, 15 Jan 2026 10:38:13 +0900 Subject: [PATCH 12/23] =?UTF-8?q?refactor:=20Set=EC=9D=84=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=B4=20=EC=A4=91=EB=B3=B5=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/GameCenter.swift | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 157cb18..1a6fe7c 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -53,25 +53,15 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 } // 정답 만드는 함수 - // 1에서 9까지의 서로 다른 임의의 정답인 수 3개를 정하기 (abc) func makeAnswer() -> Array { - - let a = Int.random(in: (1...9)) - - var b = Int.random(in: 0...9) - while a == b { - b = Int.random(in: 0...9) // a와 b가 다를때까지 b에 랜덤한 Int값 대입 - } - - var c = Int.random(in: 0...9) - while a == c || b == c { - c = Int.random(in: 0...9) // c가 a, b값과 다를때까지 c에 랜덤한 Int값 대입 - } - - let answer: Array = [a, b, c] - print(answer) + var answerSet: Set = [] + answerSet.insert(Int.random(in: 1...9)) // 일의 자리 수는 1부터 9까지 - return answer + while answerSet.count < 3 { // Set을 이용한 중복없이 정답 생성 + answerSet.insert(Int.random(in: 0...9)) + } + let answerArray = Array(answerSet) // 순서없는 Set을 Array로 변경 + return answerArray } From 8bf3f01253e9d94c817bc08a4401ab7cdba547f8 Mon Sep 17 00:00:00 2001 From: coduhee Date: Fri, 16 Jan 2026 15:02:45 +0900 Subject: [PATCH 13/23] refactor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GameCounter class 삭제 및 recordManager class에 addTrial메서드 생성 및 기타 코드 리팩토링 --- juhee/juhee/BaseballGame.swift | 47 +++++++++++------------- juhee/juhee/GameCenter.swift | 65 +++++++++++++++++---------------- juhee/juhee/GameCounter.swift | 17 --------- juhee/juhee/RecordManager.swift | 10 ++++- 4 files changed, 64 insertions(+), 75 deletions(-) delete mode 100644 juhee/juhee/GameCounter.swift diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index e1b3513..d40267e 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -9,58 +9,53 @@ import Foundation public class BaseballGame { // 야구 게임 진행 클래스 - var recordManager = RecordManager() // 기록을 관리하는 인스턴스 생성 var gameCenter = GameCenter() // 게임 연산 계산 인스턴스 생성 - var gameCounter = GameCounter(trial: 0) - + var recordManager = RecordManager() // 게임 기록을 관리하는 인스턴스 생성 + func start() { while true { - print("환영합니다! 원하시는 번호를 입력해주세요") - print("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기") + print("환영합니다!🤗 원하시는 번호를 입력해주세요 💬") + print("1. 게임 시작하기 ⚾️ 2. 게임 기록 보기 📋 3. 종료하기 ⛔️") switch readLine() { case "1": - playGame() + print("\n< Round \(recordManager.trialCounts.count + 1): 게임을 시작합니다 >") + playGame() // 야구게임 진행 메소드 실행 case "2": - print("<게임 기록 보기>") + print("\n< 게임 기록 보기 📋 >") recordManager.showRecords() // showRecords 함수 호출 case "3": - print("< 숫자 야구 게임을 종료합니다. >") - exit(0) // 강제 종료 함수 출력 + print("\n< 숫자 야구 게임을 종료합니다. ⛔️ >") + exit(0) // 강제 종료 함수 실행 default: - print("올바른 숫자를 입력해주세요!") + print("올바른 숫자를 입력해주세요! 😤") } } func playGame(){ - let answer = gameCenter.makeAnswer() // 정답 만드는 함수 - print("<게임을 시작합니다>") - + let answer = gameCenter.makeAnswer() // 정답 만드는 함수 호출 + print(answer) while true { - print("숫자를 입력하세요") - guard let input = readLine(), - let inputNumber = Int(input), // 숫자로 변환 + print("숫자를 입력하세요:") + guard let inputNumber = readLine().flatMap(Int.init), // 올바른 입력값인지 검사 gameCenter.checkInput(inputNumber) // 입력값 검사 함수 호출 else { - print("올바르지 않은 입력값입니다.") - continue // 다시 입력하도록 while문 다시 실행 + print("올바르지 않은 입력값입니다.😤 다시 입력해주세요!\n") + continue // 다시 재입력하도록 while문 다시 실행 } - gameCounter.trial += 1 // 올바른 숫자를 입력하였으므로 시도횟수 +1 + recordManager.addTrial() // 올바른 숫자를 입력하였으므로 시도횟수 +1 - if gameCenter.compareInput(inputNumber, answer) == "정답" { - // "정답"return하면 반복문에서 빠져나감 - recordManager.add(gameCounter.trial) // 정답이므로 배열에 최종 시도 횟수 입력 - gameCounter.trial = 0 // 해당 게임 시도 횟수 0으로 초기화 - break + if gameCenter.compareInpAns(inputNumber, answer) == "collect" { + recordManager.add(recordManager.trial) // 정답이므로 배열에 최종 시도 횟수 입력 + recordManager.trial = 0 // 게임 시도 횟수 0으로 초기화 + break // 입력값이 "collect"이면 반복문에서 빠져나감 } } } } - - } diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 1a6fe7c..346a8b7 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -8,9 +8,34 @@ import Foundation class GameCenter { // 게임에 필요한 계산을 하는 클래스 + + // 입력한 세자리 수를 숫자 각 한개씩으로 배열로 쪼개는 함수 + func splitNum(_ num: Int) -> [Int] { + let a = num / 100 + let b = num / 10 - a * 10 + let c = num % 10 + return [a, b, c] + } + // 정답 만드는 함수 + func makeAnswer() -> Array { + var answerSet: Set = [] + var answerArray: [Int] = [] + + let first = Int.random(in: 1...9) // 백의 자리 수는 1부터 9까지 + answerSet.insert(first) + answerArray.append(first)// 백의 자리 수 배열에 넣기 (먼저 안넣으면 백의자리에 0 가능해짐) + + while answerSet.count < 3 { // Set을 이용해 중복없이 정답 생성하도록 반복 + answerSet.insert(Int.random(in: 0...9)) + } + + answerSet.remove(first) // 백의자리 삭제 + answerArray.append(contentsOf: Array(answerSet)) + return answerArray + } - // 사용자가 입력한 값 검증 + // 사용자가 입력한 값 검증 함수 func checkInput(_ inputNumber: Int) -> Bool { let set = Set(splitNum(inputNumber)) @@ -23,14 +48,13 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 } } - // 입력값과 정답을 계산하는 함수 - func compareInput(_ number: Int, _ ansArray: Array) -> String { + // 입력값과 정답을 비교하는 함수 + func compareInpAns(_ number: Int, _ ansArray: Array) -> String { var strike = 0 var ball = 0 - let inputArray = splitNum(number) // 입력값을 쪼개서 세 원소를 가진 배열로 - // strike, ball에 값 입력 + // strike, ball에 결과값 입력 for i in 0..<3 { if inputArray[i] == ansArray[i] { strike += 1 @@ -40,38 +64,17 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 } if (strike == 3 && ball == 0) { - print("정답입니다!") - return "정답" + print("정답입니다!✔️\n") + return "collect" } else if (strike == 0 && ball == 0){ - print("Nothing") + print("Nothing 😵\n") return "False" } else { - print("\(strike)스트라이크 \(ball)볼\n ") + print("\(strike) 스트라이크 \(ball) 볼\n ") return "False" } - - } - // 정답 만드는 함수 - func makeAnswer() -> Array { - var answerSet: Set = [] - answerSet.insert(Int.random(in: 1...9)) // 일의 자리 수는 1부터 9까지 - - while answerSet.count < 3 { // Set을 이용한 중복없이 정답 생성 - answerSet.insert(Int.random(in: 0...9)) - } - let answerArray = Array(answerSet) // 순서없는 Set을 Array로 변경 - return answerArray } - - // 입력한 세자리 수를 숫자 각 한개씩으로 배열로 쪼개는 함수 - func splitNum(_ num: Int) -> [Int] { - let a = num / 100 - let b = num / 10 - a * 10 - let c = num % 10 - return [a, b, c] - } - - + } diff --git a/juhee/juhee/GameCounter.swift b/juhee/juhee/GameCounter.swift deleted file mode 100644 index 9f967f1..0000000 --- a/juhee/juhee/GameCounter.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// GameCounter.swift -// juhee -// -// Created by 김주희 on 1/14/26. -// - -import Foundation - -class GameCounter { - init(trial: Int) { - self.trial = trial - } - - var trial: Int - -} diff --git a/juhee/juhee/RecordManager.swift b/juhee/juhee/RecordManager.swift index 4efdd39..160ec8b 100644 --- a/juhee/juhee/RecordManager.swift +++ b/juhee/juhee/RecordManager.swift @@ -8,12 +8,20 @@ import Foundation public class RecordManager { // 기록 관리 클래스 + var trial = 0 // 게임 시도 횟수 var trialCounts: Array = [] // 시도 횟수 저장할 빈 배열 + + // 게임 시도 횟수 증가 함수 + func addTrial() { + trial += 1 + } - func add(_ trialcount: Int){ + // 배열에 시도 횟수 추가 함수 + func add(_ trialcount: Int) { trialCounts.append(trialcount) } + // 기록 출력 함수 func showRecords() { for (idx, value) in trialCounts.enumerated() { print("\(idx + 1)번째 게임: 시도 횟수 - \(value)") From 7c411c9f3efed7d613e838b7e3e195a8caf41d44 Mon Sep 17 00:00:00 2001 From: coduhee Date: Fri, 16 Jan 2026 15:17:06 +0900 Subject: [PATCH 14/23] =?UTF-8?q?chore:=20=EC=A0=91=EA=B7=BC=EC=A0=9C?= =?UTF-8?q?=EC=96=B4=EC=9E=90=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- juhee/juhee/BaseballGame.swift | 4 ++-- juhee/juhee/GameCenter.swift | 4 ++-- juhee/juhee/RecordManager.swift | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index d40267e..2198e6c 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -9,8 +9,8 @@ import Foundation public class BaseballGame { // 야구 게임 진행 클래스 - var gameCenter = GameCenter() // 게임 연산 계산 인스턴스 생성 - var recordManager = RecordManager() // 게임 기록을 관리하는 인스턴스 생성 + private var gameCenter = GameCenter() // 게임 연산 계산 인스턴스 생성 + private var recordManager = RecordManager() // 게임 기록을 관리하는 인스턴스 생성 func start() { diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 346a8b7..157b559 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -9,8 +9,8 @@ import Foundation class GameCenter { // 게임에 필요한 계산을 하는 클래스 - // 입력한 세자리 수를 숫자 각 한개씩으로 배열로 쪼개는 함수 - func splitNum(_ num: Int) -> [Int] { + // 입력한 세자리 수를 숫자 각 한개씩으로 배열로 쪼개는 내부 로직 함수 + private func splitNum(_ num: Int) -> [Int] { let a = num / 100 let b = num / 10 - a * 10 let c = num % 10 diff --git a/juhee/juhee/RecordManager.swift b/juhee/juhee/RecordManager.swift index 160ec8b..97cbef5 100644 --- a/juhee/juhee/RecordManager.swift +++ b/juhee/juhee/RecordManager.swift @@ -7,9 +7,9 @@ import Foundation -public class RecordManager { // 기록 관리 클래스 - var trial = 0 // 게임 시도 횟수 - var trialCounts: Array = [] // 시도 횟수 저장할 빈 배열 +class RecordManager { // 기록 관리 클래스 + private(set) var trial = 0 // 게임 시도 횟수 + private(set) var trialCounts: Array = [] // 시도 횟수 저장할 빈 배열 // 게임 시도 횟수 증가 함수 func addTrial() { From 286109d86df290ce7c313d49d73ef08fff15445a Mon Sep 17 00:00:00 2001 From: coduhee Date: Fri, 16 Jan 2026 19:44:25 +0900 Subject: [PATCH 15/23] refactor --- juhee/juhee/BaseballGame.swift | 20 ++++++++++++++------ juhee/juhee/GameCenter.swift | 29 +++++++++++++++++------------ juhee/juhee/RecordManager.swift | 2 +- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index 2198e6c..fd9ef51 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -35,27 +35,35 @@ public class BaseballGame { // 야구 게임 진행 클래스 func playGame(){ + let answer = gameCenter.makeAnswer() // 정답 만드는 함수 호출 print(answer) - while true { + var isplay = true + while isplay { // 입력값 검사 반복문 print("숫자를 입력하세요:") guard let inputNumber = readLine().flatMap(Int.init), // 올바른 입력값인지 검사 gameCenter.checkInput(inputNumber) // 입력값 검사 함수 호출 else { print("올바르지 않은 입력값입니다.😤 다시 입력해주세요!\n") - continue // 다시 재입력하도록 while문 다시 실행 + continue } recordManager.addTrial() // 올바른 숫자를 입력하였으므로 시도횟수 +1 - if gameCenter.compareInpAns(inputNumber, answer) == "collect" { + let result = gameCenter.compareInpAns(inputNumber, answer) + + switch result { + case .correct: + print("정답입니다!✔️\n") recordManager.add(recordManager.trial) // 정답이므로 배열에 최종 시도 횟수 입력 recordManager.trial = 0 // 게임 시도 횟수 0으로 초기화 - break // 입력값이 "collect"이면 반복문에서 빠져나감 + isplay = false + case .nothing: + print("Nothing 😵\n") + case .progress(let s, let b): + print("\(s) 스트라이크 \(b) 볼\n") } } } } - - } diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 157b559..36b9084 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -9,6 +9,7 @@ import Foundation class GameCenter { // 게임에 필요한 계산을 하는 클래스 + // 입력한 세자리 수를 숫자 각 한개씩으로 배열로 쪼개는 내부 로직 함수 private func splitNum(_ num: Int) -> [Int] { let a = num / 100 @@ -17,6 +18,7 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 return [a, b, c] } + // 정답 만드는 함수 func makeAnswer() -> Array { var answerSet: Set = [] @@ -35,6 +37,7 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 return answerArray } + // 사용자가 입력한 값 검증 함수 func checkInput(_ inputNumber: Int) -> Bool { let set = Set(splitNum(inputNumber)) @@ -48,8 +51,16 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 } } - // 입력값과 정답을 비교하는 함수 - func compareInpAns(_ number: Int, _ ansArray: Array) -> String { + + enum GameResult { + case correct + case nothing + case progress(strike: Int, ball: Int) + } + + + // 입력값과 정답을 비교해 힌트 계산하는 함수 + func compareInpAns(_ number: Int, _ ansArray: [Int]) -> GameResult { var strike = 0 var ball = 0 let inputArray = splitNum(number) // 입력값을 쪼개서 세 원소를 가진 배열로 @@ -63,18 +74,12 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 } } - if (strike == 3 && ball == 0) { - print("정답입니다!✔️\n") - return "collect" + if (strike == 3) { + return GameResult.correct } else if (strike == 0 && ball == 0){ - print("Nothing 😵\n") - return "False" + return GameResult.nothing } else { - print("\(strike) 스트라이크 \(ball) 볼\n ") - return "False" + return GameResult.progress(strike: strike, ball: ball) } - } - - } diff --git a/juhee/juhee/RecordManager.swift b/juhee/juhee/RecordManager.swift index 97cbef5..3751d3a 100644 --- a/juhee/juhee/RecordManager.swift +++ b/juhee/juhee/RecordManager.swift @@ -8,7 +8,7 @@ import Foundation class RecordManager { // 기록 관리 클래스 - private(set) var trial = 0 // 게임 시도 횟수 + var trial = 0 // 게임 시도 횟수 private(set) var trialCounts: Array = [] // 시도 횟수 저장할 빈 배열 // 게임 시도 횟수 증가 함수 From 914cfa954748cd81b81eed3b412fa54fd18add86 Mon Sep 17 00:00:00 2001 From: coduhee Date: Sun, 18 Jan 2026 16:38:11 +0900 Subject: [PATCH 16/23] Enhance README with project details and structure Updated the README to provide detailed project information, including purpose, rules, structure, class responsibilities, and refactoring points. --- README.md | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 161 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 340697e..a77423e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,162 @@ -# ⚾ 숫자 야구 게임 +# ⚾️ 숫자 야구 게임 -숫자 야구 게임은 컴퓨터가 생성한 중복 없는 숫자를 맞히는 콘솔 기반 게임입니다. -사용자는 숫자를 입력하고 **스트라이크 / 볼 / 아웃** 결과를 통해 정답을 추론합니다. +Swift로 구현한 콘솔 기반 숫자 야구 게임입니다. +게임의 흐름, 규칙, 기록을 각각의 책임으로 나누어 설계하는 것을 목표로 했습니다. + +--- + +## 📌 프로젝트 목적 + +* Swift 기본 문법 및 제어 흐름 이해 +* 클래스 단위 책임 분리 연습 +* Set / Array 활용 +* 접근 제어자를 통한 캡슐화 경험 +* 계산 로직과 출력 로직 분리 + +--- + +## 🎮 게임 규칙 + +* 정답은 **중복되지 않는 3자리 숫자** +* **백의 자리는 1~9**, 나머지는 **0~9** +* 입력값에 따라 다음 힌트를 제공 + + * **Strike**: 숫자와 위치가 모두 일치 + * **Ball**: 숫자는 같지만 위치가 다름 + * **Nothing**: 일치하는 숫자 없음 +* 3 스트라이크 시 게임 종료 +* 각 게임의 시도 횟수를 기록으로 저장 + +--- + +## 🧱 프로젝트 구조 + +``` +📁 Project + ┣ 📄 main.swift + ┣ 📄 BaseballGame.swift + ┣ 📄 GameCenter.swift + ┣ 📄 RecordManager.swift +``` + +--- + +## 📂 클래스별 역할 설명 + +이 프로젝트는 **각 클래스가 하나의 책임만 가지도록 분리**했습니다. + +--- + +### `main.swift` + +**프로그램의 진입점 역할** + +* 게임 로직을 직접 다루지 않음 +* `BaseballGame`을 생성하고 실행만 담당 + +```swift +let game = BaseballGame() +game.start() +``` + +프로그램의 시작 지점을 명확히 하기 위한 구조입니다. + +--- + +### `BaseballGame` + +**게임 전체 흐름을 제어하는 클래스** + +* 메뉴 출력 +* 사용자 입력 처리 +* 게임 시작 / 종료 판단 +* 다른 객체들을 조합하여 사용 + +```swift +private var gameCenter = GameCenter() +private var recordManager = RecordManager() +``` + +계산 로직이나 기록 관리는 직접 처리하지 않고, +각각의 책임을 가진 객체에 위임합니다. + +→ 게임의 **흐름과 순서만 책임지는 조율자 역할**입니다. + +--- + +### `GameCenter` + +**숫자 야구 게임의 규칙과 계산을 담당하는 클래스** + +* 정답 숫자 생성 +* 입력값 유효성 검사 +* 스트라이크 / 볼 계산 + +```swift +enum GameResult { + case correct + case nothing + case progress(strike: Int, ball: Int) +} +``` + +* 계산 결과를 문자열이 아닌 `enum`으로 반환 +* 출력은 하지 않고, 결과만 전달 + +```swift +private func splitNum(_ num: Int) +``` + +내부 계산 로직은 `private`로 숨겨 외부에서 알 필요 없도록 설계했습니다. + +→ 게임 규칙이 변경되더라도 이 클래스만 수정하면 되도록 구성했습니다. + +--- + +### `RecordManager` + +**게임 기록과 상태를 관리하는 클래스** + +* 시도 횟수 증가 +* 게임 결과 저장 +* 기록 출력 + +```swift +private(set) var trialCounts: [Int] +``` + +* 외부에서는 읽기만 가능 +* 수정은 메서드를 통해서만 가능 + +→ 상태 변경 책임을 명확히 하기 위한 설계입니다. + +--- + +## 🔐 접근 제어 설계 의도 + +* `private` + + * 내부 구현 세부사항 은닉 +* `private(set)` + + * 상태는 보호하고 읽기만 허용 +* 불필요한 `public` 노출 최소화 + +객체 간 결합도를 낮추고, 책임을 명확히 하기 위함입니다. + +--- + +## ✨ 리팩토링 포인트 + +* 문자열 비교 대신 `enum` 사용 +* 계산 로직과 출력 로직 분리 +* Set은 중복 검사 용도로만 사용 +* 클래스별 책임을 기준으로 코드 정리 + +--- + +## 📝 느낀 점 + +* 클래스 분리를 통해 코드 가독성이 좋아졌고 +* 책임이 명확해지면서 수정 포인트를 찾기 쉬워졌음 +* 단순히 동작하는 코드보다 구조를 고민하는 경험을 할 수 있었음 From 4aa3e114135001228c2906ca93592d03218d8c9a Mon Sep 17 00:00:00 2001 From: coduhee Date: Sun, 18 Jan 2026 22:06:51 +0900 Subject: [PATCH 17/23] refactor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 정답 생성 함수 배열의 contains를 이용한 방식으로 리팩토링 --- juhee/juhee/GameCenter.swift | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 36b9084..6bc115f 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -21,19 +21,17 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 // 정답 만드는 함수 func makeAnswer() -> Array { - var answerSet: Set = [] - var answerArray: [Int] = [] - - let first = Int.random(in: 1...9) // 백의 자리 수는 1부터 9까지 - answerSet.insert(first) - answerArray.append(first)// 백의 자리 수 배열에 넣기 (먼저 안넣으면 백의자리에 0 가능해짐) - - while answerSet.count < 3 { // Set을 이용해 중복없이 정답 생성하도록 반복 - answerSet.insert(Int.random(in: 0...9)) + var answerArray: Array = [] + answerArray.append(Int.random(in: 1...9)) // 백의 자리 수는 1부터 9까지 + + while answerArray.contains(answerArray[0]) { + answerArray.append(Int.random(in: 0...9)) } - - answerSet.remove(first) // 백의자리 삭제 - answerArray.append(contentsOf: Array(answerSet)) + + while answerArray.contains(answerArray[0]) || answerArray.contains(answerArray[1]) { + answerArray.append(Int.random(in: 0...9)) + } + return answerArray } From 15170dac9a499e3b02bf80359c237307924724b7 Mon Sep 17 00:00:00 2001 From: coduhee Date: Sun, 18 Jan 2026 22:33:11 +0900 Subject: [PATCH 18/23] chore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 주석 추가 --- juhee/juhee/BaseballGame.swift | 2 ++ juhee/juhee/GameCenter.swift | 9 +++++---- juhee/juhee/RecordManager.swift | 1 + 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index fd9ef51..1aac76b 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -12,6 +12,7 @@ public class BaseballGame { // 야구 게임 진행 클래스 private var gameCenter = GameCenter() // 게임 연산 계산 인스턴스 생성 private var recordManager = RecordManager() // 게임 기록을 관리하는 인스턴스 생성 + // MARK: - 게임 선택 함수 func start() { while true { @@ -34,6 +35,7 @@ public class BaseballGame { // 야구 게임 진행 클래스 } + // MARK: - 농구 게임 시작 함수 func playGame(){ let answer = gameCenter.makeAnswer() // 정답 만드는 함수 호출 diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 6bc115f..2e08cc0 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -10,7 +10,7 @@ import Foundation class GameCenter { // 게임에 필요한 계산을 하는 클래스 - // 입력한 세자리 수를 숫자 각 한개씩으로 배열로 쪼개는 내부 로직 함수 + // MARK: - 입력한 세자리 수를 숫자 각 한개씩으로 배열로 쪼개는 내부 로직 함수 private func splitNum(_ num: Int) -> [Int] { let a = num / 100 let b = num / 10 - a * 10 @@ -19,7 +19,7 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 } - // 정답 만드는 함수 + // MARK: - 정답 만드는 함수 func makeAnswer() -> Array { var answerArray: Array = [] answerArray.append(Int.random(in: 1...9)) // 백의 자리 수는 1부터 9까지 @@ -36,7 +36,7 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 } - // 사용자가 입력한 값 검증 함수 + // MARK: - 사용자가 입력한 값 검증 함수 func checkInput(_ inputNumber: Int) -> Bool { let set = Set(splitNum(inputNumber)) @@ -50,6 +50,7 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 } + // MARK: - GameResult 구조체 enum GameResult { case correct case nothing @@ -57,7 +58,7 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 } - // 입력값과 정답을 비교해 힌트 계산하는 함수 + // MARK: - 입력값과 정답을 비교해 힌트 계산하는 함수 func compareInpAns(_ number: Int, _ ansArray: [Int]) -> GameResult { var strike = 0 var ball = 0 diff --git a/juhee/juhee/RecordManager.swift b/juhee/juhee/RecordManager.swift index 3751d3a..3693acd 100644 --- a/juhee/juhee/RecordManager.swift +++ b/juhee/juhee/RecordManager.swift @@ -7,6 +7,7 @@ import Foundation +// MARK: - 게임 기록 관리 클래스 class RecordManager { // 기록 관리 클래스 var trial = 0 // 게임 시도 횟수 private(set) var trialCounts: Array = [] // 시도 횟수 저장할 빈 배열 From 2ecc3566707e0c139f1993ccaa21a29eb2ee43f5 Mon Sep 17 00:00:00 2001 From: coduhee Date: Mon, 19 Jan 2026 12:52:02 +0900 Subject: [PATCH 19/23] refactor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Array = [Int] 동의어 --- juhee/juhee/GameCenter.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 2e08cc0..3956531 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -20,8 +20,8 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 // MARK: - 정답 만드는 함수 - func makeAnswer() -> Array { - var answerArray: Array = [] + func makeAnswer() -> [Int] { + var answerArray: [Int] = [] answerArray.append(Int.random(in: 1...9)) // 백의 자리 수는 1부터 9까지 while answerArray.contains(answerArray[0]) { From f6d0662b0736b9e39e9f12719e59b735dbbab88f Mon Sep 17 00:00:00 2001 From: coduhee Date: Mon, 19 Jan 2026 14:52:18 +0900 Subject: [PATCH 20/23] refactor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit if return문 삭제해도 똑같은 의미 --- juhee/juhee/GameCenter.swift | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 3956531..a55a471 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -40,13 +40,9 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 func checkInput(_ inputNumber: Int) -> Bool { let set = Set(splitNum(inputNumber)) - if set.count == 3 // Array를 Set으로 변환하여 중복을 제외한 값이 3이어야 함 + return set.count == 3 // Array를 Set으로 변환하여 중복을 제외한 값이 3이어야 함 && 99 < inputNumber - && inputNumber < 1000 { - return true - } else { - return false - } + && inputNumber < 1000 } From 2231475b0c14ddab2e3128a719f843c49b3cae69 Mon Sep 17 00:00:00 2001 From: coduhee Date: Mon, 19 Jan 2026 18:01:11 +0900 Subject: [PATCH 21/23] refactor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 배열의 shuffle 이용해 풀이 --- juhee/juhee/BaseballGame.swift | 1 - juhee/juhee/GameCenter.swift | 19 ++++++++----------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index 1aac76b..330a27b 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -39,7 +39,6 @@ public class BaseballGame { // 야구 게임 진행 클래스 func playGame(){ let answer = gameCenter.makeAnswer() // 정답 만드는 함수 호출 - print(answer) var isplay = true while isplay { // 입력값 검사 반복문 print("숫자를 입력하세요:") diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index a55a471..0639930 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -21,18 +21,15 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 // MARK: - 정답 만드는 함수 func makeAnswer() -> [Int] { - var answerArray: [Int] = [] - answerArray.append(Int.random(in: 1...9)) // 백의 자리 수는 1부터 9까지 - - while answerArray.contains(answerArray[0]) { - answerArray.append(Int.random(in: 0...9)) - } - - while answerArray.contains(answerArray[0]) || answerArray.contains(answerArray[1]) { - answerArray.append(Int.random(in: 0...9)) + let arr = (0...9).map { $0 } + + let shuffledArr = arr.shuffled() // 배열을 랜덤으로 섞어줌 + + if shuffledArr[0] == 0 { + return [Int](shuffledArr[1...3]) // Int 배열로 형변환 필수 + } else { + return [Int](shuffledArr[0...2]) } - - return answerArray } From 1b8c78fd898b0ecb3c2c3acde9bade0ae27fca85 Mon Sep 17 00:00:00 2001 From: coduhee Date: Mon, 19 Jan 2026 20:00:39 +0900 Subject: [PATCH 22/23] feat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게임에 쓰이는 입력수의 자리수를 gameNumber로 별도로 선언함 --- juhee/juhee/GameCenter.swift | 110 +++++++++++++++++------------------ 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 0639930..18d457f 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -8,70 +8,68 @@ import Foundation class GameCenter { // 게임에 필요한 계산을 하는 클래스 - + var gameNumber = 3 // MARK: - 입력한 세자리 수를 숫자 각 한개씩으로 배열로 쪼개는 내부 로직 함수 private func splitNum(_ num: Int) -> [Int] { - let a = num / 100 - let b = num / 10 - a * 10 - let c = num % 10 - return [a, b, c] - } - - - // MARK: - 정답 만드는 함수 - func makeAnswer() -> [Int] { - let arr = (0...9).map { $0 } + let result = String(num).compactMap{ Int(String($0))} + return result + } - let shuffledArr = arr.shuffled() // 배열을 랜덤으로 섞어줌 - if shuffledArr[0] == 0 { - return [Int](shuffledArr[1...3]) // Int 배열로 형변환 필수 - } else { - return [Int](shuffledArr[0...2]) + // MARK: - 정답 만드는 함수 + func makeAnswer() -> [Int] { + let arr = (0...9).map { $0 } + + let shuffledArr = arr.shuffled() // 배열을 랜덤으로 섞어줌 + + if shuffledArr[0] == 0 { + return [Int](shuffledArr[1...gameNumber]) // Int 배열로 형변환 필수 + } else { + return [Int](shuffledArr[0...gameNumber - 1]) + } } - } - - - // MARK: - 사용자가 입력한 값 검증 함수 - func checkInput(_ inputNumber: Int) -> Bool { - let set = Set(splitNum(inputNumber)) - return set.count == 3 // Array를 Set으로 변환하여 중복을 제외한 값이 3이어야 함 - && 99 < inputNumber - && inputNumber < 1000 - } - - - // MARK: - GameResult 구조체 - enum GameResult { - case correct - case nothing - case progress(strike: Int, ball: Int) - } - - - // MARK: - 입력값과 정답을 비교해 힌트 계산하는 함수 - func compareInpAns(_ number: Int, _ ansArray: [Int]) -> GameResult { - var strike = 0 - var ball = 0 - let inputArray = splitNum(number) // 입력값을 쪼개서 세 원소를 가진 배열로 - - // strike, ball에 결과값 입력 - for i in 0..<3 { - if inputArray[i] == ansArray[i] { - strike += 1 - } else if ansArray.contains(inputArray[i]){ - ball += 1 - } + + // MARK: - 사용자가 입력한 값 검증 함수 + func checkInput(_ inputNumber: Int) -> Bool { + let set = Set(splitNum(inputNumber)) + + return set.count == gameNumber // Array를 Set으로 변환하여 중복을 제외한 값이 3이어야 함 + && Int(pow(10.0,Double(gameNumber - 1))) - 1 < inputNumber + && inputNumber < Int(pow(10.0,Double(gameNumber))) } - if (strike == 3) { - return GameResult.correct - } else if (strike == 0 && ball == 0){ - return GameResult.nothing - } else { - return GameResult.progress(strike: strike, ball: ball) + + // MARK: - GameResult 구조체 + enum GameResult { + case correct + case nothing + case progress(strike: Int, ball: Int) + } + + + // MARK: - 입력값과 정답을 비교해 힌트 계산하는 함수 + func compareInpAns(_ number: Int, _ ansArray: [Int]) -> GameResult { + var strike = 0 + var ball = 0 + let inputArray = splitNum(number) // 입력값을 쪼개서 세 원소를 가진 배열로 + + // strike, ball에 결과값 입력 + for i in 0.. Date: Thu, 22 Jan 2026 09:22:30 +0900 Subject: [PATCH 23/23] refactor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit wholeNumberValue 이용하여 함수 간결화, 함수 네이밍 수정 --- juhee/juhee/BaseballGame.swift | 2 +- juhee/juhee/GameCenter.swift | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/juhee/juhee/BaseballGame.swift b/juhee/juhee/BaseballGame.swift index 330a27b..268836e 100644 --- a/juhee/juhee/BaseballGame.swift +++ b/juhee/juhee/BaseballGame.swift @@ -51,7 +51,7 @@ public class BaseballGame { // 야구 게임 진행 클래스 recordManager.addTrial() // 올바른 숫자를 입력하였으므로 시도횟수 +1 - let result = gameCenter.compareInpAns(inputNumber, answer) + let result = gameCenter.compare(inputNumber, answer) switch result { case .correct: diff --git a/juhee/juhee/GameCenter.swift b/juhee/juhee/GameCenter.swift index 18d457f..7a0627c 100644 --- a/juhee/juhee/GameCenter.swift +++ b/juhee/juhee/GameCenter.swift @@ -12,8 +12,7 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 // MARK: - 입력한 세자리 수를 숫자 각 한개씩으로 배열로 쪼개는 내부 로직 함수 private func splitNum(_ num: Int) -> [Int] { - let result = String(num).compactMap{ Int(String($0))} - return result + return String(num).compactMap { $0.wholeNumberValue } } @@ -50,16 +49,16 @@ class GameCenter { // 게임에 필요한 계산을 하는 클래스 // MARK: - 입력값과 정답을 비교해 힌트 계산하는 함수 - func compareInpAns(_ number: Int, _ ansArray: [Int]) -> GameResult { + func compare(input: Int, with answer: [Int]) -> GameResult { var strike = 0 var ball = 0 - let inputArray = splitNum(number) // 입력값을 쪼개서 세 원소를 가진 배열로 + let inputArray = splitNum(input) // 입력값을 쪼개서 세 원소를 가진 배열로 // strike, ball에 결과값 입력 for i in 0..