comparison GeoQuiz/Controllers/CityGameController.swift @ 29:f5a2c2dab208

fix files structure
author Dennis C. M. <dennis@denniscm.com>
date Thu, 10 Nov 2022 10:27:28 +0100
parents GeoQuiz/Models/Controllers/CityGameController.swift@425078c01194
children eb23effeede7
comparison
equal deleted inserted replaced
28:f51b70c2cccc 29:f5a2c2dab208
1 //
2 // CityGameController.swift
3 // GeoQuiz
4 //
5 // Created by Dennis Concepción Martín on 29/9/22.
6 //
7
8 import Foundation
9 import AVFAudio
10
11 class CityGameController: Game, ObservableObject {
12
13 // Define type of generics
14 typealias T = CityModel.City
15
16 var data: [String: T]
17 var dataAsked = [String: T]()
18
19 // Data
20 @Published var correctAnswer = (
21 key: String(),
22 value: T(country: String(), lat: Double(), lon: Double())
23 )
24
25 // User
26 @Published var userChoices = [String: T]()
27 @Published var userScore = 0
28 @Published var userLives = 3
29 @Published var correctAnswers = [String: T]()
30 @Published var wrongAnswers = [String: T]()
31
32 // Alerts
33 @Published var alertTitle = String()
34 @Published var alertMessage = String()
35 @Published var showingEndGameAlert = false
36 @Published var showingWrongAnswerAlert = false
37 @Published var showingExitGameAlert = false
38
39 // Animations
40 @Published var scoreScaleAmount = 1.0
41 @Published var livesScaleAmount = 1.0
42
43 // Sound effects
44 @Published var player: AVAudioPlayer?
45
46 init() {
47 let data: CityModel = Bundle.main.decode("cities.json")
48 self.data = data.cities
49
50 let user = UserController()
51 userLives = user.data.numberOfLives
52
53 if let userData = UserDefaults.standard.data(forKey: "UserData") {
54 if let decodedUserData = try? JSONDecoder().decode(UserDataModel.self, from: userData) {
55 userLives = decodedUserData.numberOfLives
56 }
57 }
58
59 askQuestion {
60 selector()
61 }
62 }
63 }
64
65 extension CityGameController {
66 func selector() {
67
68 // Get random choices
69 var userChoices = [String: T]()
70
71 while userChoices.count < 2 {
72 if let choice = data.randomElement() {
73 let userChoicesCountry = userChoices.map { $0.value.country }
74
75 if !userChoicesCountry.contains(choice.value.country) {
76 userChoices[choice.key] = choice.value
77 }
78 } else {
79 fatalError("Couldn't get a random value from data")
80 }
81 }
82
83 // Get question asked (correct answer)
84 let userChoicesCountry = userChoices.map { $0.value.country }
85 let correctAnswer = data.first(where: {
86 !userChoices.keys.contains($0.key) && // Avoid duplicated cities
87 !dataAsked.keys.contains($0.key) && // Avoid cities already asked
88 !userChoicesCountry.contains($0.value.country) // Avoid duplicated country names in userChoices
89 })
90
91 // Unwrap optional
92 if let correctAnswer = correctAnswer {
93 userChoices[correctAnswer.key] = correctAnswer.value
94 dataAsked[correctAnswer.key] = correctAnswer.value
95 self.correctAnswer = correctAnswer
96 } else {
97 fatalError("Couldn't unwrap optional value")
98 }
99
100 self.userChoices = userChoices
101 }
102 }
103