- Stanford University CS193P iOS 앱 개발 강좌의 Assignment 2 진행 중
- Memorize 게임 : 카드를 뒤집어 같은 이모지가 그려진 카드끼리 매칭시키는 게임
과제
- Memorize 게임에 테마 모델을 추가한다.
- 테마는 제목, 이모지 목록, 매칭되는 카드 쌍, 카드 색상으로 이루어져야 한다.
- 한줄의 코드만 작성해 새로운 테마를 추가할 수 있어야 한다.
- 테마는 각 게임이 시작할 때 랜덤으로 지정돼야 한다.
내 코드
Model
테마 모델 자체를 추가하는 것은 어렵지 않았지만, 테마 배열을 생성하고 테마를 추가하는 시점을 모르겠어서 한참을 헤맸다.
이후 ViewModel에서 랜덤 테마를 불러야 해 해당 역할을 하는 함수를 만들었다.
// 테마 모델링
struct Theme {
var name: String
var numberOfPairsOfCards: Int
var emojis: [String]
var color: String
}
// 테마들을 모아놓는 배열
struct Themes {
static var themeList: [Theme] = [
Theme(name: "Flowers", numberOfPairsOfCards: 6, emojis: ["🌹", "🌸", "🌺", "🌻", "🪷", "🪻"], color: "pink"),
Theme(name: "Animals", numberOfPairsOfCards: 6, emojis: ["🐶", "🐱", "🐯", "🐴", "🐻", "🐸"], color: "green"),
Theme(name: "Fruits", numberOfPairsOfCards: 6, emojis: ["🍎", "🍌", "🍉", "🍇", "🍒", "🥭"], color: "red"),
Theme(name: "Weather", numberOfPairsOfCards: 6, emojis: ["☀️", "🌧", "⛄️", "🌪", "🌈", "☁️"], color: "blue"),
Theme(name: "Sports", numberOfPairsOfCards: 6, emojis: ["⚽️", "🏀", "🏈", "🎾", "🏐", "🏓"], color: "orange"),
Theme(name: "Vehicles", numberOfPairsOfCards: 6, emojis: ["🚗", "🚕", "🚙", "🚑", "🚜", "🚲"], color: "gray")
]
// 랜덤 테마를 1개 선택하는 함수
static func getTheme() -> Theme {
return themeList.randomElement()!
}
ViewModel
ViewModel 곳곳에서 테마를 이용하기 위해 변수 하나를 만들고 초기화한다.
View에 카드 색상을 넘겨줘야하는데, 요구사항에서 명시한대로 theme 모델에 있는 색상 필드를 switch 문으로 Color와 매칭시켰다.
// 랜덤 테마를 초기화하기
var randomTheme = Themes.getTheme()
class EmojiMemoryGame: ObservableObject {
..
// 테마 색상을 swiftUI Color와 매칭하기
func getColor() -> Color {
switch randomTheme.color {
case "pink": .pink
case "green": .green
case "red": .red
case "blue": .blue
case "orange": .orange
case "gray": .gray
default: .black
}
}
...
// MARK: - Intents
...
// 새 게임 시작하기
func loadNewGame() {
// 테마를 교체하고, 게임에 반영하고 카드를 섞기
randomTheme = Themes.getTheme()
model = EmojiMemoryGame.createMemoryGame()
model.shuffle()
}
}