annotate GeoQuiz/Logic/GuessTheFlag.swift @ 1:259a15f485c5

fix bug with NavigationLink
author Dennis C. M. <dennis@denniscm.com>
date Tue, 20 Sep 2022 11:53:54 +0200
parents 413e2d21333e
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 // GuessTheFlag.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 20/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 GuessTheFlag: Game, ObservableObject {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
11 let countries: [String: String]
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
12 var countriesAsked = [String: String]()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
13
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
14 @Published var userScore = 0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
15 @Published var userLives = 3
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
16 @Published var questionCounter = 0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
17 @Published var alertTitle = ""
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
18 @Published var alertMessage = ""
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
19 @Published var showingBuyLivesView = false
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
20 @Published var showingNoLivesAlert = false
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
21 @Published var showingWrongAnswerAlert = false
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
22 @Published var showingEndGameAlert = false
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
23
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
24 @Published var userChoices = [String: String]()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
25 @Published var countryNameAsked = ""
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
26
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
27 init() {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
28 let flags: CountryFlags = load("CountryFlags.json")
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
29 self.countries = flags.countries
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
30 askQuestion()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
31 }
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 func askQuestion() {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
34 guard questionCounter < countries.count else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
35 self.alertTitle = "Amazing!"
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
36 self.alertMessage = "You've completed the game."
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
37 self.showingEndGameAlert = true
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 return
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
40 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
41
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
42 var userChoices = [String: String]()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
43
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
44 while userChoices.count < 2 {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
45 if let country = countries.randomElement() {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
46 userChoices[country.key] = country.value
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
47 } else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
48 fatalError("Couldn't get a random country")
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 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
51
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
52 let countryAsked = countries.first(where: {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
53 !userChoices.keys.contains($0.key) &&
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
54 !countriesAsked.keys.contains($0.key)
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
55 })
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
56
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
57 if let countryAsked = countryAsked {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
58 userChoices[countryAsked.key] = countryAsked.value
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
59 self.countriesAsked[countryAsked.key] = countryAsked.value
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
60 self.countryNameAsked = countryAsked.key
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
61 } else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
62 fatalError("Couldn't get countryAsked")
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
63 }
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 self.userChoices = userChoices
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
66 self.questionCounter += 1
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
67 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
68
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
69 func answered(userChoice userFlagSymbolGuess: String) {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
70 guard let correctFlagSymbolAnswer = countries[countryNameAsked] else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
71 fatalError("Couln't find \(countryNameAsked) in countries dictionary")
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
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
74 guard userLives > 0 else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
75 self.alertTitle = "Not enough lives!"
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
76 self.alertMessage = "Please buy more lives to keep playing"
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
77 self.showingNoLivesAlert = true
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
78
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
79 return
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
80 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
81
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
82 if correctFlagSymbolAnswer == userFlagSymbolGuess {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
83 hapticSuccess()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
84 self.userScore += 1
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
85 askQuestion()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
86 } else {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
87 hapticError()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
88 self.userLives -= 1
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
89 self.alertTitle = "Wrong!"
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
90 self.alertMessage = "That's not the flag of \(countryNameAsked). You have \(userLives) lives left"
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
91 self.showingWrongAnswerAlert = true
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
92 }
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 }