annotate GeoQuiz/Logic/GuessTheCapital.swift @ 0:413e2d21333e

first commit
author Dennis C. M. <dennis@denniscm.com>
date Tue, 20 Sep 2022 08:13:26 +0200
parents
children 4dbe0cd9dadc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
1 //
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
2 // GuessTheCapital.swift
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
3 // GeoQuiz
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
4 //
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
5 // Created by Dennis Concepción Martín on 18/9/22.
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
6 //
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
7
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
8 import Foundation
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
9
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
10 class GuessTheCapital: Game, ObservableObject {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
11
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
12 struct Country: Hashable {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
13 let capitalName: String
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
14 let flagSymbol: String
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
15 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
16
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
17 let countries: [String: Country]
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
18 var countriesAsked = [String: Country]()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
19
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
20 @Published var userScore = 0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
21 @Published var userLives = 3
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
22 @Published var questionCounter = 0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
23 @Published var alertTitle = ""
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
24 @Published var alertMessage = ""
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
25 @Published var showingBuyLivesView = false
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
26 @Published var showingNoLivesAlert = false
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
27 @Published var showingWrongAnswerAlert = false
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
28 @Published var showingEndGameAlert = false
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
29
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
30 @Published var userChoices = [String: Country]()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
31 @Published var countryNameAsked = ""
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
32
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
33 init() {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
34 let flags: CountryFlags = load("CountryFlags.json")
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
35 let capitals: CountryCapitals = load("CountryCapitals.json")
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
36
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
37 var countries = [String: Country]()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
38
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
39 for country in capitals.countries {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
40 let countryName = country.key
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
41 let capitalName = country.value
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
42
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
43 if let flagSymbol = flags.countries[countryName] {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
44 countries[country.key] = Country(capitalName: capitalName, flagSymbol: flagSymbol)
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
45 } else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
46 fatalError()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
47 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
48 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
49
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
50 self.countries = countries
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
51 askQuestion()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
52 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
53
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
54 func askQuestion() {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
55 guard questionCounter < countries.count else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
56 self.alertTitle = "Amazing!"
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
57 self.alertMessage = "You've completed the game."
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
58 self.showingEndGameAlert = true
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
59
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
60 return
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
61 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
62
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
63 var userChoices = [String: Country]()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
64
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
65 while userChoices.count < 2 {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
66 if let country = countries.randomElement() {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
67 userChoices[country.key] = country.value
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
68 } else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
69 fatalError("Couldn't get a random country")
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
70 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
71 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
72
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
73 let countryAsked = countries.first(where: {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
74 !userChoices.keys.contains($0.key) &&
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
75 !countriesAsked.keys.contains($0.key)
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
76 })
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
77
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
78 if let countryAsked = countryAsked {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
79 userChoices[countryAsked.key] = countryAsked.value
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
80 self.countriesAsked[countryAsked.key] = countryAsked.value
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
81 self.countryNameAsked = countryAsked.key
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
82 } else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
83 fatalError("Couldn't get countryAsked")
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
84 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
85
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
86 self.userChoices = userChoices
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
87 self.questionCounter += 1
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
88 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
89
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
90 func answered(userChoice userCapitalNameGuess: String) {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
91 guard let correctCountry = countries[countryNameAsked] else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
92 fatalError("Couln't find \(countryNameAsked) in countries dictionary")
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
93 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
94
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
95 guard userLives > 0 else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
96 self.alertTitle = "Not enough lives!"
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
97 self.alertMessage = "Please buy more lives to keep playing"
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
98 self.showingNoLivesAlert = true
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
99
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
100 return
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
101 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
102
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
103 if correctCountry.capitalName == userCapitalNameGuess {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
104 hapticSuccess()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
105 self.userScore += 1
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
106 askQuestion()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
107 } else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
108 hapticError()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
109 self.userLives -= 1
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
110 self.alertTitle = "Wrong!"
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
111 self.alertMessage = "The capital of \(countryNameAsked) is \(correctCountry.capitalName). You have \(userLives) lives left"
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
112 self.showingWrongAnswerAlert = true
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
113 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
114 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
115 }