简体   繁体   中英

How do I refresh the question to the user?

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM