이번엔 숫자 야구 게임 Lv.3 ~ Lv.4까지의 구현이다
바로 Lv.3 요구사항부터 보자
- 정답이 되는 숫자를 0에서 9까지의 서로 다른 3자리의 숫자로 바꿔주세요
- 맨 앞자리에 0이 오는 것은 불가능합니다
- 092 → 불가능
- 870 → 가능
- 300 → 불가능
랜덤으로 생성되는 정답이 서로 다른 숫자여야 하고
맨 앞자리에 0이 오지 않도록 조건을 설정하는것같다.
음 근데 사실 Lv.2에서도 다른 숫자가 오지않도록 작성하다보니 어느정도 이미 완성된 상태다
그래도 다시한번 보고가자
private func makeAnswer() -> [Int] {
var randomNumber: [Int]
repeat {
let hundreds = Int.random(in: 1..<10) // 범위 설정으로 0이 오는것을 방지
var tens = Int.random(in: 0..<10)
var units = Int.random(in: 0..<10)
while tens == hundreds {
tens = Int.random(in: 0..<10)
}
while units == hundreds || units == tens {
units = Int.random(in: 0..<10)
}
randomNumber = [hundreds, tens, units]
} while Set(randomNumber).count < 3
// print(randomNumber) // 값 확인용
return randomNumber
}
일단 맨 앞자리에 0이 오는 것이 불가하니까
Int.random(in: 1..<10)
의 범위를 1부터 시작하도록 잡았다
따로 추가적인 조건 없이 해당 조건을 해결할 수있다
그리고 10의 자리와 1의자리는 혹시나 같은 숫자가 발생했을경우
다시 랜덤 수를 생성하도록 코드를 작성했다
if
문을 작성할 수도 있지만 같은 수가 계속 나올 수도 있기 때문에 while
문을 사용했다.
주석 처리한 print(randomNumber)
를 통해 올바른 값이 생성되는지 확인하고 정답처리 관련도 확인했다
이제 Lv.4를 볼 차례다
-프로그램을 시작할 때 안내문구를 보여주세요
// 예시 환영합니다! 원하시는 번호를 입력해주세요 1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기
- 1번 게임 시작하기의 경우 "필수 구현 기능"의 예시처럼 게임이 진행됩니다
- 정답을 맞혀 게임이 종료된 경우 위 안내문구를 다시 보여주세요// 예시 환영합니다! 원하시는 번호를 입력해주세요 1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기 1 // 1번 게임 시작하기 입력 < 게임을 시작합니다 > 숫자를 입력하세요 . . .
이 요구사항은 앞선 문제들보다 비교적 쉽게 작성했다
뒤의 Lv.6까지 같은 맥락의 코드를 공유해서 한번에 올리겠다
var menuInput: Int?
var count: Int = 0
var tryCnt: [Int] = []
while menuInput != 3 {
print("환영합니다! 원하시는 번호를 입력해주세요")
print("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기")
if let input = readLine(), let choice = Int(input) {
menuInput = choice
switch menuInput {
case 1:
print("< 게임을 시작합니다 >")
let game = BaseballGame2()
game.start()
count += 1
tryCnt.append(game.tryNum)
case 2:
print("< 게임 기록 보기 >")
for i in 0..<count {
print("\(i+1)번째 게임 : 시도 횟수 - \(tryCnt[i])")
}
case 3:
print("게임을 종료합니다.")
default:
print("올바른 숫자를 입력해주세요!")
}
} else {
print("올바른 숫자를 입력해주세요!")
}
}
일단 while
문으로 사용자가 종료시키지 않는 이상 계속 작동하도록 했다. 그리고 switch
문으로 원하느 메뉴를 선택했을때 특정 동작을 하게 된다. 이렇게 하면 게임이 한차례 끝나고 메뉴를 선택하여 원하는 진행을 할 수 있다. 이게 Lv.4의 요구사항을 만족시킨다.
Lv.5의 경우는 요구사항이 아래와 같은데
2번 게임 기록 보기의 경우 완료한 게임들에 대해 시도 횟수를 보여줍니다
case 2
에 문구를 작성해주고 main.swift
에 몇번째 게임인지 알려줄 변수 count
와 각 게임들의 시도 횟수를 담은 배열 'tryCnt'를 작성했다.
tryCnt
는 BaseballGame2
에 작성된 tryNum
변수를
한 게임이 끝날때마다 받아와서 저장해둔다
tryNum
은 정답이 아닌 경우에 1씩 늘어나는 변수다
for i in 0..<count {
print("\(i+1)번째 게임 : 시도 횟수 - \(tryCnt[i])")
}
이 문구를 통해 요구사항에서 원하는 값들을 출력해준다.
Lv.6는 간단하다
3번 종료하기의 경우 프로그램이 종료됩니다
이것은 이미 while
문의 종료 조건에서 구현한 것으로
switch
문에서만 특정 문구를 출력하도록 작성해주면 된다.
이번에는 저번 계싼기 과제보다 난이도가 월등히 높았던 것 같다.
Lv.2를 제외하고 특히 Lv.3부터는 소소한 기능 추가인데
Lv.2가 정말 어려웠던것같다.
그래서 이번에 구글과 gpt의 도움을 많이 받았다
온전히 혼자 코드를 짜보도록 해야하는데 흠..
곧 올라오는 해설 영상를 보고 저번처럼 코드리뷰를 다시 해봐야겠다
오 백의 자리에 0이 오는 걸 방지하기 위해 범위를 각각 설정해두는 방법도 있군요🫢 이번 한 주도 수고많으셨습니다 !!