0

Trying to make a simple Blackjack app to get comfortable with using Xcode. I've never coded in Swift before and have a little experience in C++. Having an error I don't know how to fix. I'm having trouble applying other answers to similar questions to my situation.

I'm not totally sure what's causing the problem, let alone how to fix it :)


class ViewController: UIViewController {

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

    var balance = 500

    let suits = ["h","d","c","s"]

    //user card declarations
    @IBOutlet weak var userCard1: UIImageView!

    @IBOutlet weak var userCard2: UIImageView!

    @IBOutlet weak var userCard3: UIImageView!

    @IBOutlet weak var userCard4: UIImageView!

    @IBOutlet weak var userCard5: UIImageView!

    @IBOutlet weak var userCard6: UIImageView!

    @IBOutlet weak var userCard7: UIImageView!

    @IBOutlet weak var userCard8: UIImageView!

    @IBOutlet weak var userCard9: UIImageView!

    @IBOutlet weak var userCard10: UIImageView!

    //dealer card declarations
    @IBOutlet weak var dealerCard1: UIImageView!

    @IBOutlet weak var dealerCard2: UIImageView!

    @IBOutlet weak var dealerCard3: UIImageView!

    @IBOutlet weak var dealerCard4: UIImageView!

    @IBOutlet weak var dealerCard5: UIImageView!



    var win = false

    var bet = 0

    //bet label
    @IBOutlet weak var betLabel: UILabel!

    //bet slider
    @IBAction func betSlider(_ sender: UISlider) {
        betLabel.text = String(Int(sender.value))
    }
    @IBOutlet weak var betSliderValue: UISlider!

    var userCardSlot = 3
    var dealerCardSlot = 3

    var userTotal = 0
    var dealerTotal = 0

    //user cards displayed
    var userCardArray = [userCard1, userCard2, userCard3, userCard4, userCard5, userCard6, userCard7, userCard8, userCard9, userCard10]

    //dealer cards displayed
    var dealerCardArray = [dealerCard1, dealerCard2, dealerCard3, dealerCard4, dealerCard5]

    //hit button
    @IBAction func hitTapped(_ sender: Any) {
        var cardNum = Int.random(in: 2...14)
        var cardSuit = Int(arc4random()) % 4
        userCardArray[userCardSlot].image = UIImage(named: "\(cardSuit)card\(cardNum)")
    }

    //stand button
    @IBAction func standTapped(_ sender: Any) {
        for userTotal in userCardArray.reversed() {
            userTotal += cardNum
        }
        for dealerTotal in dealerCardArray {
            dealerTotal += cardNum
        }
        while dealerTotal < 17 {
            dealerCardSlot += 1
            dealerCardArray[dealerCardSlot].image = UIImage(named: "\(cardSuit)card\(cardNum)")
        }
        if dealerTotal <= userTotal {
            win = true
        } else {
            win = false
        }
    }

    @IBAction func newRoundTapped(_ sender: Any) {

        bet = Int(betSliderValue.value)

        userCardArray[0].image = UIImage(named: "\(cardSuit)card\(cardNum)")
        userCardArray[1].image = UIImage(named: "\(cardSuit)card\(cardNum)")

        dealerCardArray[0].image = UIImage(named: "\(cardSuit)card\(cardNum)")
        dealerCardArray[0].image = UIImage(named: "Red_back.jpg")

        //prompt for hit or stand

        if win == true {
            balance += (bet * 2)
        } else {
            balance -= bet
        }

    }


}

Any help's appreciated!

Thomas
  • 11

1 Answers1

-1

You generally cannot use one property to initialize another outside of init, because when you do:

var b = a + 1

the compiler implicitly does:

var b = self.a + 1

but self is not yet available; it's only available during the init.

The only exception is a lazy property initializer:

lazy var b: Int = self.a + 1

In your case, you can move the initialization into init:

var userCardArray: [UIImageView]

init() {
   self.userCardArray = [userCard1, userCard2, ... ]
}
New Dev
  • 48,427
  • 12
  • 87
  • 129