Search code examples
iosswiftslideruisliderdice

how to update the maximum value of a slider?


I have an app where you have a certain amount you can bet. you use a slider to determine how much to bet.

Upon each turn (dice toss), your total treasure is updated (whether win or loss). The maximum value of the slider is the same value as the treasure.

I would like for the slider to update its maximum value after each dice toss (i.e. each time the total treasure is updated).

it is a very short app, so I am copying the whole code


class ViewController: UIViewController {
    @IBOutlet weak var gains: UILabel!
    @IBOutlet weak var dicePlayer: UIImageView!
    @IBOutlet weak var diceComputer: UIImageView!

    //slider et label approprié
    @IBOutlet weak var slider: UIView!

    @IBOutlet weak var sliderValueLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        // on appelle le generateur de gains ici
        gainsAleatoires()
        // et on genere aleatoirement les dés
        //lancerDeDes()

    }

    //MARK: - Variables pour l'application
    //tableau qui contient le nom des differents dés
    let des: Array = ["one", "two", "three", "four", "five", "six"]

    // tableau qui genere les gains
    var generateurDeGains = Int.random(in: 100 ... 1000)

    // deux variables qui vont simuler les lancers pour le joueur et l'ordinateur
    var lancerJoueur: Int = 1
    var lancerOrdinateur: Int = 1

    // deux variables pour enregistrer le tresor initial ainsi que le tresor mis a jour
    var initialGains = 0




    //MARK: - Gestion lancer de dés

    @IBAction func boutonLancerDes(_ sender: UIButton) {
        // on appelle la fonction lancer de dés
        lancerDeDes()

    }
    //MARK: - Gestion reinitialisation du jeu et des gains

    @IBAction func boutonReinitialisation(_ sender: UIBarButtonItem) {
        // on appelle de nouveau la fonction gains aleatoires
        gainsAleatoires()
        // on change la valeur du slider
        //sliderValueLabel.text = "0"
    }

    //MARK: - Fonction qui genere un gain aleatoire entre 100 et 1000
    func gainsAleatoires () {
        gains.text = String(generateurDeGains)

    }
    //MARK: - Bouton pour changer la valeur de la somme que le joueur parie
    @IBAction func sliderValueChanged(_ sender: UISlider) {
        // on s'assure que la valeur du slider est affichée dans le label correspondant
        let currentValue = Int(sender.value)
        sliderValueLabel.text = String(currentValue)

        // on donne la valeur maximale du slider qui est celle des gains générés aleatoirement
        sender.maximumValue = Float(generateurDeGains)
    }


    //MARK:- Fonction qui gere le lancer des deux dés
    func lancerDeDes() {
        //on rend aleatoire les lancers du joeur et de l'ordinateur
        self.lancerJoueur = Int.random(in: des.indices) + 1 // code qui rend les erreurs plus faciles a detecter
        //autre ecriture : self.lancerJoueur = Int.random(in: 1...6)
        self.lancerOrdinateur = Int.random(in: des.indices) + 1

        UIView.animate(withDuration: 0.5) {
            self.dicePlayer.image = UIImage(named: self.des[self.lancerJoueur - 1])
            self.diceComputer.image = UIImage(named: self.des[self.lancerOrdinateur - 1])

        }
        // on appelle la fonction qui gere les scores
        gestionDesScores()
    }

    //MARK: - Fonction qui gere les scores pour le joueur et l'ordinateur

    func gestionDesScores() {
        // 2 switch statements

        //on appelle ici la fonction qui va donner une alerte en fonction du resultat du lancer
        alertesEnFonctionDuResultat()
    }

    //MARK: - Fonction qui gere les resultats
    func alertesEnFonctionDuResultat() {
        // si le joueur gagne
        if lancerJoueur > lancerOrdinateur {
            // on recupere la valeur actuelle des gains
            initialGains = generateurDeGains
            // on appelle l'alerte
            alerteSucces()
            // on met a jour la valeur des gains initiale
            initialGains = generateurDeGains + Int(sliderValueLabel.text!)!
            //on change la valeur totale des gains
            gains.text = String(initialGains)
            // et on change la valeur maximale du slider


        } // si l'ordinateur gagne
        else if lancerJoueur < lancerOrdinateur {
            //idem
            initialGains = generateurDeGains
            alerteEchec()
            initialGains = generateurDeGains - Int(sliderValueLabel.text!)!
            gains.text = String(initialGains)
        } // en cas de parité
        else {
            alerteParite()
        }
        // fin de partie
        if gains.text == "0" {
            //on appelle la fonction fin de partie
            finDeLaPartie()

        }

    }

    //MARK: - Fonction avec alerte en cas de succès du joueur
    func alerteSucces() {
        let alert = UIAlertController(title: "Votre lancer est supérieur !", message: "Vous gagnez votre mise", preferredStyle: .actionSheet)
        let action = UIAlertAction(title: "Continuer", style: .default, handler: nil)
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    }

    //MARK: - Fonction avec alerte en cas d'echec du joueur
    func alerteEchec() {
        let alert = UIAlertController(title: "Votre lancer est inférieur !", message: "Vous perdez votre mise", preferredStyle: .actionSheet)
        let action = UIAlertAction(title: "Continuer", style: .default, handler: nil)
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    }

    //MARK: - Fonction en cas de parité entre joueur et ordinateur
    func alerteParite() {
        let alert = UIAlertController(title: "Vos lancers sont égaux !", message: "Vous devez de nouveau lancer les dés", preferredStyle: .actionSheet)
        let action = UIAlertAction(title: "Continuer", style: .default, handler: nil)
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    }

    //MARK: - Fonction qui gere le cas où on n'a plus de tresor et donc il faut reinitialiser
    func finDeLaPartie() {
        let alert = UIAlertController(title: "Vous n'avez plus d'argent !", message: "Réinitialisez ou secouez l'appareil pour débuter une nouvelle partie", preferredStyle: .alert)
        let action = UIAlertAction(title: "Compris", style: .default, handler: nil)
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    }


}

Solution

  • In your alertesEnFonctionDuResultat(), after you update gain, you can add:

    // et on change la valeur maximale du slider
    yourSlider.maximumValue = Float(initialGains)
    

    Anyway I think you should think again at what you are doing in your app... For example, why here you use a text and not the value of your slider?

    // on met a jour la valeur des gains initiale
    initialGains = generateurDeGains + Int(sliderValueLabel.text!)!
    

    And again, why here you update your slider maximumValue every time the slider move?

    // on donne la valeur maximale du slider qui est celle des gains générés aleatoirement
    sender.maximumValue = Float(generateurDeGains)