2017-02-24 6 views
0

Ich arbeite an einem Tic Tac Toe Projekt, aber es funktioniert nicht. Das Problem, das ich damit erhielt, ist auf let space = sender.tag. Was passiert, wenn ich auf eine Tic-Tac-Toe-Box klicke, um es zu testen, gibt es mir "exc_bad_inst". Kann mir jemand helfen?EXC_BAD_INST Fehler beim Ausführen meiner iOS App

import UIKit 

class ViewController: UIViewController { 
    @IBOutlet weak var buttonOne: UIButton! 
    @IBOutlet weak var buttonTwo: UIButton! 
    @IBOutlet weak var buttonThree: UIButton! 
    @IBOutlet weak var buttonFour: UIButton! 
    @IBOutlet weak var buttonFive: UIButton! 
    @IBOutlet weak var buttonSix: UIButton! 
    @IBOutlet weak var buttonSeven: UIButton! 
    @IBOutlet weak var buttonEight: UIButton! 
    @IBOutlet weak var buttonNine: UIButton! 

    @IBOutlet weak var gameResult: UILabel! 

    var gameState = ["","","", 
        "","","", 
        "","","" 
        ] 

    let winningCombos = [[0, 1, 2], [3, 4, 5], [6, 7, 8], //horizontal 
         [0, 3, 6], [1, 4, 7], [2, 5, 8], //vertical 
         [0, 4, 8], [2, 4, 6]] //diagonals 

    var gameOver = false 
    var turnCount = 0 
    var currentPlayer: String! 

    func pickFirstPlayer() -> String { 
     if arc4random_uniform(2) == 0 { 
      currentPlayer = "o" 
     } else { 
      currentPlayer = "x" 
     } 
     return currentPlayer 
    } 

    func toggleNextPlayer() { 
     if currentPlayer == "o" { 
      currentPlayer = "x" 
     } else { 
      currentPlayer = "o" 
     } 
    } 

    @IBAction func makeMove(sender: AnyObject) { 
     let space = sender.tag 
     if (gameState[space] == "" && gameOver == false) { 
      let turnImage = UIImage(named: "\(self.currentPlayer).png") 
      sender.setImage(turnImage!, forState: .Normal) 
      gameState[space] = self.currentPlayer 
      self.toggleNextPlayer() 
      self.turnCount++ 
      self.checkForWinner() 
     } 
    } 

    func checkForWinner() { 
     var winner = "" 
     for combo in winningCombos { 
      var row: [String] = [] 
      for space in combo { 
       row.append(gameState[space]) 
      } 
      if (row[0] == row[1] && row[1] == row[2] && row[0] != "") { 
       gameOver = true 
       winner = row[0].uppercaseString 
       gameResult.text = "\(winner) is the winner!" 

      } 
     } 
     if (turnCount == 9 && winner == "") { 
      gameResult.text = "It's a tie!" 
      gameOver = true 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     pickFirstPlayer() 
    } 
} 

Antwort

-1

Das sollte nicht kompilieren. Sie haben Ihre Aktion so eingerichtet, dass sie einen Parameter von sender: AnyObject verwendet.

Versuchen Sie den Typ Ihres Senders Parameter UIButton Wechsel:

@IBAction func makeMove(sender: UIButton) { 

Dann wird wissen, Compiler, dass Absender eine Schaltfläche enthält, und das Tasten, um eine Tag-Eigenschaft haben.

Wie rufen Sie Ihre makeMove-Methode auf?

+0

Dank für die Info, geht über das so schnell wie möglich –

0

Anstatt die func Definition zu ändern, möchten Sie if let verwenden zu werfen sender zu einem UIButton:

@IBAction func makeMove(sender: AnyObject) { 
    if let btn = sender as? UIButton { 
     let space = btn.tag 
     if (gameState[space] == "" && gameOver == false) { 
      let turnImage = UIImage(named: "\(self.currentPlayer).png") 
      sender.setImage(turnImage!, forState: .Normal) 
      gameState[space] = self.currentPlayer 
      self.toggleNextPlayer() 
      self.turnCount++ 
      self.checkForWinner() 
     } 
    } else { 
     // something else called this function 
    } 
} 
Verwandte Themen