Mercurial > public > geoquiz
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 |