[Stanford CS193p] 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()
    }
}

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤