스파르타코딩 클럽/개인과제
6. 스파르타 코딩클럽 [본캠프 - 숫자야구 게임(2)]
UDDT
2025. 3. 18. 23:00
Ch 2. 프로그래밍 심화 주차 과제
숫자 야구 게임은 두 명이 즐길 수 있는 추리 게임으로, 상대방이 설정한 3자리의 숫자를 맞히는 것이 목표입니다.
각 자리의 숫자와 위치가 모두 맞으면 '스트라이크', 숫자만 맞고 위치가 다르면 '볼'로 판정됩니다.
예를 들어, 상대방의 숫자가 123일 때 132를 추리하면 1스트라이크 2볼이 됩니다.
이러한 힌트를 활용하여 상대방의 숫자를 추리해 나가는 게임입니다.
Lv 1. 에서 내가 작성한 코드
let randomNumber1 = Int.random(in: 1...9)
let randomNumber2 = Int.random(in: 1...9)
let randomNumber3 = Int.random(in: 1...9)
var computerChoice: [Int] = []
computerChoice = [randomNumber1, randomNumber2, randomNumber3]
위의 코드는 배열에 [3, 3, 2] 등의 중복되는 숫자가 담길 수 있다
⎮ Lv. 2
- 정답을 맞추기 위해 3자리수를 입력하고 힌트를 받습니다
* 힌트는 야구용어인 볼과 스트라이크입니다.
- 같은 자리에 같은 숫자가 있는 경우 스트라이크, 다른 자리에 숫자가 있는 경우 볼입니다
ex) 정답 : 456 인 경우 435를 입력한 경우 → 1스트라이크 1볼
357를 입력한 경우 → 1스트라이크
678를 입력한 경우 → 1볼
123를 입력한 경우 → Nothing
* 만약 올바르지 않은 입력값에 대해서는 오류 문구를 보여주세요
- 3자리 숫자가 정답과 같은 경우 게임이 종료됩니다
실행 예시(정답 : 456)
< 게임을 시작합니다 >
숫자를 입력하세요
435
1스트라이크 1볼
숫자를 입력하세요
357
1스트라이크
숫자를 입력하세요
123
Nothing
숫자를 입력하세요
dfg // 세 자리 숫자가 아니어서 올바르지 않은 입력값
올바르지 않은 입력값입니다
숫자를 입력하세요
199 // 9가 두번 사용되어 올바르지 않은 입력값
올바르지 않은 입력값입니다
숫자를 입력하세요
103 // 0이 사용되어 올바르지 않은 입력값
올바르지 않은 입력값입니다
숫자를 입력하세요
456
정답입니다!
다시 작성한 코드
class BaseballGame {
func start() {
print("게임을 시작합니다")
makeAnswer() // 정답을 만드는 함수
func makeAnswer() -> Int {
// 컴퓨터 랜덤 숫자 생성
let randomNumber1 = Int.random(in: 1...9)
var randomNumber2 = Int.random(in: 1...9)
var randomNumber3 = Int.random(in: 1...9)
if randomNumber1 == randomNumber2 {
randomNumber2 = Int.random(in: 1...9)
} else if randomNumber2 == randomNumber3 {
randomNumber3 = Int.random(in: 1...9)
} else if randomNumber3 == randomNumber1 {
randomNumber3 = Int.random(in: 1...9)
}
let computerChoice = [randomNumber1, randomNumber2, randomNumber3]
let strComputerChoice = computerChoice.map(String.init).joined() // ["5", "6", "7"]
guard let intComputerChoice = Int(strComputerChoice) else { return 0 }
return intComputerChoice // 567
}
}
이렇게 작성하면 해결이 될 줄 알았는데,
송스승과 코드 리뷰를 하는 와중에 지금의 코드로도 예외처리가 안된다는 것을 깨달았다.
if randomNumber1 == randomNumber2 {
randomNumber2 = Int.random(in: 1...9)
위의 코드로 randomNumber1과 randomNumber2를 비교해도,
다시 randomNumber2가 동일한 randomNumber를 뽑게 되면 동일한 숫자가 반영된다.
다시다시 작성한 코드
let randomNumber1 = Int.random(in: 1...9)
var randomNumber2 = Int.random(in: 1...9)
var randomNumber3 = Int.random(in: 1...9)
while randomNumber1 == randomNumber2 || randomNumber1 == randomNumber3 || randomNumber2 == randomNumber3 {
randomNumber2 = Int.random(in: 1...9)
randomNumber3 = Int.random(in: 1...9)
}
let computerChoice = [randomNumber1, randomNumber2, randomNumber3]
위의 코드로 바꾸고 나면,
조건이 만족될 때까지 randomNumber를 변경하기 때문에 [3, 4, 6]과 같이 각각 다른 숫자를 뽑아낼 수 있다.