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