Mercurial > public > geoquiz
view GeoQuiz/Logic/GuessTheFlag.swift @ 0:413e2d21333e
first commit
author | Dennis C. M. <dennis@denniscm.com> |
---|---|
date | Tue, 20 Sep 2022 08:13:26 +0200 |
parents | |
children | 4dbe0cd9dadc |
line wrap: on
line source
// // GuessTheFlag.swift // GeoQuiz // // Created by Dennis Concepción Martín on 20/9/22. // import Foundation class GuessTheFlag: Game, ObservableObject { let countries: [String: String] var countriesAsked = [String: String]() @Published var userScore = 0 @Published var userLives = 3 @Published var questionCounter = 0 @Published var alertTitle = "" @Published var alertMessage = "" @Published var showingBuyLivesView = false @Published var showingNoLivesAlert = false @Published var showingWrongAnswerAlert = false @Published var showingEndGameAlert = false @Published var userChoices = [String: String]() @Published var countryNameAsked = "" init() { let flags: CountryFlags = load("CountryFlags.json") self.countries = flags.countries askQuestion() } func askQuestion() { guard questionCounter < countries.count else { self.alertTitle = "Amazing!" self.alertMessage = "You've completed the game." self.showingEndGameAlert = true return } var userChoices = [String: String]() while userChoices.count < 2 { if let country = countries.randomElement() { userChoices[country.key] = country.value } else { fatalError("Couldn't get a random country") } } let countryAsked = countries.first(where: { !userChoices.keys.contains($0.key) && !countriesAsked.keys.contains($0.key) }) if let countryAsked = countryAsked { userChoices[countryAsked.key] = countryAsked.value self.countriesAsked[countryAsked.key] = countryAsked.value self.countryNameAsked = countryAsked.key } else { fatalError("Couldn't get countryAsked") } self.userChoices = userChoices self.questionCounter += 1 } func answered(userChoice userFlagSymbolGuess: String) { guard let correctFlagSymbolAnswer = countries[countryNameAsked] else { fatalError("Couln't find \(countryNameAsked) in countries dictionary") } guard userLives > 0 else { self.alertTitle = "Not enough lives!" self.alertMessage = "Please buy more lives to keep playing" self.showingNoLivesAlert = true return } if correctFlagSymbolAnswer == userFlagSymbolGuess { hapticSuccess() self.userScore += 1 askQuestion() } else { hapticError() self.userLives -= 1 self.alertTitle = "Wrong!" self.alertMessage = "That's not the flag of \(countryNameAsked). You have \(userLives) lives left" self.showingWrongAnswerAlert = true } } }