I'm currently working through 100 days of code in Swift UI and I'd like to think I'm 99% complete on my day 25 challenge. However, my brain is now a pink mush and I'm stumped.
I'm trying to refresh (or redraw) two Text views that present the user with two pieces of information. I thought about shuffling (.shuffled()) the rock, paper, scissors array but as my if statements use array positions that would make my logic invalid for the following rounds I believe.
So I'm trying to rewrite the Int.random(int...int) to the variables aiChooses and playerShould when the user dismisses the alert, but I'm running into all kinds of issues.
Any help/ideas greatly appreciated.
import SwiftUI
struct ContentView: View {
let rockPaperScissors = ["Rock", "Paper", "Scissors"]
let winLose = ["Win", "Lose"]
var aiChooses = Int.random(in: 0...2)//<-- trying to update when user dismisses alert
var playerShould = Int.random(in: 0...1)//<-- trying to update when user dismisses alert
@State private var userAnswer = 0
@State private var alertVisible = false
@State private var score = 0
@State private var scoreTitle = ""
@State private var moreInfo = ""
var body: some View {
VStack {
Spacer()
Text("I choose \(rockPaperScissors[aiChooses])") //<-- Trying to get this to pull in a new value when alert dismissed
Text("You should \(winLose[playerShould])") //<-- Trying to get this to pull in a new value when alert dismissed
Spacer()
HStack {
Spacer()
Section {
Button(action: {
// your action here
self.playerTapped(playerChose: 0, winning: self.playerShould)
}) {
Text("Rock")
}
Spacer()
Button(action: {
// your action here
self.playerTapped(playerChose: 1, winning: self.playerShould)
}) {
Text("Paper")
}
Spacer()
Button(action: {
// your action here
self.playerTapped(playerChose: 2, winning: self.playerShould)
}) {
Text("Scissors")
}
Spacer()
}
.alert(isPresented: $alertVisible) {
Alert(title: Text(scoreTitle), message: Text(moreInfo), dismissButton: .default(Text("Ok")) {
self.nextRound() //<--- call func (below) to refresh starting question
})
}
}
// Picker("Choose Win or Lose", selection: $userAnswer){
// ForEach(0..<rockPaperScissors.count){
// Text(self.rockPaperScissors[$0])
// }
// }
// .pickerStyle(SegmentedPickerStyle())
Spacer()
Text("Score: \(score)")
}
}
func playerTapped(playerChose: Int, winning: Int) {
let aiChose = aiChooses
let rock = 0
let paper = 1
let scissors = 2
if winning == 0 {
if playerChose == aiChose {
// score == score
scoreTitle = "Draw!"
moreInfo = "You seleted the same as me!"
}
else if playerChose == rock && aiChose == paper {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You seleted Rock, I picked Paper!"
}
else if playerChose == rock && aiChose == scissors {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You seleted Rock, I picked Scissors!"
}
else if playerChose == paper && aiChose == scissors {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You seleted Paper, I picked Scissors!"
}
else if playerChose == paper && aiChose == rock {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected Paper, I selected Rock!"
}
else if playerChose == scissors && aiChose == paper {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You seleted Scissors, I picked Paper!"
}
else if playerChose == scissors && aiChose == rock {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You selected Scissors, I selected Rock!"
}
// trying to lose
else if winning == 1 {
if playerChose == aiChose {
// score == score
scoreTitle = "DRAW!"
moreInfo = "You seleted the same as me!"
}
else if playerChose == rock && aiChose == paper {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == rock && aiChose == scissors {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == paper && aiChose == scissors {
score += 1
scoreTitle = "CORRECT"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == paper && aiChose == rock {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You selected the right answer, which is WRONG!"
}
else if playerChose == scissors && aiChose == paper {
score += 1
scoreTitle = "CORRECT"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == scissors && aiChose == rock {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
}
}
alertVisible = true
}
func nextRound() { // <-- when alert is dismissed, update vars for top two text views to update
aiChooses = Int.random(in: 0...2)
playerShould = Int.random(in: 0...1)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
If you want SwiftUI to update/redraw a view when a property changes, you need to make it a @State
property:
@State var aiChooses = Int.random(in: 0...2)
@State var playerShould = Int.random(in: 0...1)