⚾️ 야구 게임 만들기 Lv1
숫자 야구 게임은 두 명이 즐길 수 있는 추리 게임으로, 상대방이 설정한 3자리의 숫자를 맞히는 것이 목표입니다. 각 자리의 숫자와 위치가 모두 맞으면 '스트라이크', 숫자만 맞고 위치가 다르면 '볼'로 판정됩니다. 예를 들어, 상대방의 숫자가 123일 때 132를 추리하면 1 스트라이크 2 볼이 됩니다. 이러한 힌트를 활용하여 상대방의 숫자를 추리해 나가는 게임입니다.
🛠️ 개발 프로세스 가이드
1. 개발 환경 세팅
- Xcode command line tool을 이용하여 진행해 보세요.
- 프로젝트 생성 방법 : Xcode 상단탭 - File - New - Project - macOS의 Command Line Tool로 프로젝트 생성
- Xcode command line tool을 이용하여 직접 입력값 받기
// readLine() 함수를 이용하여 유저의 입력값 처리하기
// readLine() 함수에 대해 학습해보고 활용하기
let input = readLine()
- 프로그래밍 기초, 기본 + 심화 강의는 Swift 5.9 버전 기준으로 촬영되었습니다.
- 최신 맥 OS에서 Xcode를 설치하면 Xcode 16 이상 버전을 사용하게 되는데 프로젝트 생성 시 Swift 6으로 되어 있을 경우, Swift 5로 변경하고 진행
2. 과제 CTA와 ETA 확인 및 수행
과제는 Lv1~Lv2까지 필수 구현, Lv3~Lv6 도전 구현으로 구성되어 있습니다.
개발은 요구사항과 데드라인을 지키는 것이 굉장히 중요합니다.
- 과제의 요구사항이 무엇인지 파악하고, 요구사항별로 상세 기능을 생각해 봅니다.
- 레벨별로 ETA를 정해 데드라인을 지켜봅니다.
- 필수 구현기능을 충분히 고민해서 구현해 보고, 시간이 남을 경우 Lv6까지 확장하여 진행해 봅니다.
- 사용하면서 발생할 수 있는 예외사항을 고려해 봅니다.
📝 Lv1 코드 구현
[ Lv 1 ]
- 1에서 9까지의 서로 다른 임의의 수 3개를 정하고 맞추는 게임입니다.
- 정답은 랜덤으로 만듭니다. (1에서 9까지의 서로 다른 임의의 수 3자리)
▼ 코드 뼈대
// main.swift 파일
// 프로젝트 생성시 자동 생성됨
let game = BaseballGame()
game.start() // BaseballGame 인스턴스를 만들고 start 함수를 구현하기
// BaseballGame.swift 파일 생성
class 혹은 struct {
func start() {
let answer = makeAnswer() // 정답을 만드는 함수
}
func makeAnswer() -> Int {
// 함수 내부를 구현하기
}
}
[ 코드 작성 ]
//
// main.swift
// BaseballGame
//
// Created by 허성필 on 3/19/25.
//
// BaseballGame.swift 파일 생성
class BaseballGame {
func start() {
let answer = makeAnswer() // 정답을 만드는 함수
print(answer)
}
func makeAnswer() -> Int {
// 함수 내부를 구현하기
let number1 = Int.random(in: 1...9) // 첫 번째 자리 랜덤 숫자
let number2 = Int.random(in: 1...9) // 두 번째 자리 랜덤 숫자
let number3 = Int.random(in: 1...9) // 세 번째 자리 랜덤 숫자
// 옵셔널 바인딩을 사용해서 3자리의 randomNumber 생성
if let randomNumber = Int("\(number1)\(number2)\(number3)") {
return randomNumber
} else {
return 0
}
}
}
let game = BaseballGame()
game.start() // BaseballGame 인스턴스를 만들고 start 함수를 구현하기
1부터 9까지 임의의 수를 생성하고 answer에 저장하는 함수를 구현해 보았다.
Int.random(in: 1...9) 함수를 사용해서 1부터 9 사이의 랜덤 정수 3개를 생성하고 3자리를 더해서 randomNumber를 생성했다.
옵셔널 바인딩을 사용해서 Int형 변환 시 옵셔널 값을 안전하게 처리하였다.
⚠️ 트러블 슈팅
현재 내 코드는 문제가 하나 있다.
바로 중복된 숫자가 나올 수 있다는 점이다.
해당 문제를 해결하기 위해서 구글링을 해본 결과 각 자리의 숫자를 따로 생성해서 합치는 것이 아니라
Set을 사용하여 중복된 값은 저장되지 않도록 구현하는 방법을 사용해야 된다는 것을 알게 되었다.
💡 Set이란?
Set은 Swift의 컬렉션 타입 중 하나로, 중복된 요소 없이 저장되는 데이터 구조이다
Set를 사용해서 number.count가 3이 될 때까지 while문이 돌아갈 때,
생성된 랜덤 숫자를 number 변수에 저장하는데 number변수는 Set 타입이기 때문에
이미 들어간 숫자가 다시 랜덤 숫자로 생성되면 저장되지 않는다.
3개의 숫자가 number 변수에 저장되면 Array(number)를 통해서 Set 타입을 Array로 변경한다.
if let을 사용하여 옵셔널 바인딩 처리한 뒤 배열의 각 자릿수를 각각 백의 자리, 십의 자리, 일의 자리 숫자로 표현하여
randomNumber로 저장하고 return 한다.
📝 최종 Lv1 코드
//
// main.swift
// BaseballGame
//
// Created by 허성필 on 3/19/25.
//
// BaseballGame.swift 파일 생성
class BaseballGame {
func start() {
let answer = makeAnswer() // 정답을 만드는 함수
print(answer)
}
func makeAnswer() -> Int {
var number = Set<Int>() // 중복 방지를 위한 Set 사용
while number.count < 3 {
let randomNum = Int.random(in: 1...9)
number.insert(randomNum) // 중복이면 추가되지 않음
}
let uniqueNumbers = Array(number) // Set을 Array로 변환
// if let을 사용하여 옵셔널 바인딩 처리하여 안전하게 옵셔널 값 사용
if let randomNumner = Int("\(uniqueNumbers[0])\(uniqueNumbers[1])\(uniqueNumbers[2])") {
return randomNumner
} else {
return 0
}
}
}
let game = BaseballGame()
game.start() // BaseballGame 인스턴스를 만들고 start 함수를 구현하기
'스파르타 코딩 클럽 - iOS 스타터 6기 > 본 캠프' 카테고리의 다른 글
21. 스파르타 코딩 클럽 - UIKit (1) | 2025.03.25 |
---|---|
20. 스파르타 코딩 클럽 - 야구 게임 만들기 Lv2 ~ Lv6 (2) | 2025.03.21 |
18. 스파르타 코딩 클럽 - 메모리 구조 (1) | 2025.03.18 |
17. 스파르타 코딩 클럽 - 프로토콜 (Protocol), 확장 (Extension) (0) | 2025.03.17 |
16. 스파르타 코딩 클럽 - 접근제어자 (0) | 2025.03.17 |