2017-08-14 86 views
0

所以我是新来的编码,我一直在做练习游戏,这样才能建立我的技能。我已经创建了这个猜字游戏,我试图让游戏在所有猜测已经用完之后展示这个单词。但是,程序不会读取我写入的代码来设置标签以显示答案。这里是我到目前为止已经编写的代码:如何让游戏显示所有猜测已经用完的单词?

class ViewController: UIViewController { 
    var listOfWords = ["ladybug", "program", "computer", "language", "glorious", "incandescent"] 
    let incorrectMovesAllowed = 7 

    var totalWins = 0 { 
     didSet { 
      newRound() 
     } 
    } 

    var totalLosses = 0 { 
     didSet { 
      newRound() 
     } 
    } 

    @IBOutlet var letterButtons: [UIButton]! 
    @IBAction func buttonPressed(_ sender: UIButton) { 
    sender.isEnabled = false 
     let letterString = sender.title(for: .normal)! 
     let letter = Character(letterString.lowercased()) 
     currentGame.playerGuessed(letter: letter) 
     updateUI() 
     updateGameState() 

    } 

    @IBOutlet weak var scoreLabel: UILabel! 
    @IBOutlet weak var correctWordLabel: UILabel! 
    @IBOutlet weak var treeImageView: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     newRound() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    func enableLetterButtons (_enable: Bool){ 
     for button in letterButtons { 
      button.isEnabled = _enable 
     } 
    } 

    var currentGame : Game! 

    func newRound() { 
     if !listOfWords.isEmpty{ 
      let newWord = listOfWords.removeFirst() 
      currentGame = Game (word: newWord, incorrectMovesRemaining: incorrectMovesAllowed, guessedLetters: []) 
      enableLetterButtons(_enable: true) 
      updateUI() 
     } else { 
      enableLetterButtons (_enable: false) 
     } 

    } 

    func updateUI() { 
     var letters = [String]() 
     for letter in currentGame.formattedWord.characters { 
      letters.append(String(letter)) 
     } 
     let wordWithSpacing = letters.joined(separator: " ") 
     correctWordLabel.text = wordWithSpacing 
     scoreLabel.text = "Wins: \(totalWins), Losses:\(totalLosses)" 
     treeImageView.image = UIImage (named: "Tree \(currentGame.incorrectMovesRemaining)") 
    } 

    func updateGameState(){ 
     var letters = [String]() 
     for letter in currentGame.word.characters { 
      letters.append(String(letter)) 
     } 
     let theAnswer = letters.joined(separator: " ") 
     if currentGame.incorrectMovesRemaining == 0 { 
      correctWordLabel.text = theAnswer 
      Thread.sleep(forTimeInterval: 3) 
      totalLosses += 1 
     } else if currentGame.word == currentGame.formattedWord { 
      totalWins += 1 
     } else { 
      updateUI() 
     } 
    } 
} 

另外,我有一个是这样写的结构:

import Foundation 
struct Game { 
    var word : String 
    var incorrectMovesRemaining : Int 
    var guessedLetters: [Character] 
    mutating func playerGuessed (letter: Character){ 
     guessedLetters.append(letter) 
     if !word.characters.contains(letter){ 
      incorrectMovesRemaining -= 1 
     } 
    } 
    var formattedWord: String { 
     var guessedWord = "" 
     for letter in word.characters { 
      if guessedLetters.contains(letter) { 
       guessedWord += "\(letter)" 
      } else { 
       guessedWord += "_" 
      } 
     } 
     return guessedWord 
    } 
} 
+0

问题是程序没有改变'label'到你想要的? –

+0

在'updateUI()'函数结束时,您应该调用'self.setNeedsDisplay()'让系统知道您的UI需要重绘。 –

回答

0

您需要重新绘制你的用户界面,这与self.setNeedsDisplay()完成。它通知系统该视图的内容需要重新绘制。在您的updateUI()中,您可以添加此项。 关于setNeedsDisplay你可以得到更多的信息here

class ViewController: UIViewController { 
    var listOfWords = ["ladybug", "program", "computer", "language", "glorious", "incandescent"] 
    let incorrectMovesAllowed = 7 
    var totalWins = 0 { 
     didSet { 
      newRound() 
     } 
    } 

    var totalLosses = 0 { 
     didSet { 
      newRound() 
     } 
    } 

    @IBOutlet var letterButtons: [UIButton]! 
    @IBAction func buttonPressed(_ sender: UIButton) { 
    sender.isEnabled = false 
     let letterString = sender.title(for: .normal)! 
     let letter = Character(letterString.lowercased()) 
     currentGame.playerGuessed(letter: letter) 
     updateUI() 
     updateGameState() 

    } 

    @IBOutlet weak var scoreLabel: UILabel! 
    @IBOutlet weak var correctWordLabel: UILabel! 
    @IBOutlet weak var treeImageView: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     newRound() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    func enableLetterButtons (_enable: Bool){ 
     for button in letterButtons { 
      button.isEnabled = _enable 
     } 
    } 

    var currentGame : Game! 

    func newRound() { 
     if !listOfWords.isEmpty{ 
      let newWord = listOfWords.removeFirst() 
      currentGame = Game (word: newWord, incorrectMovesRemaining: incorrectMovesAllowed, guessedLetters: []) 
      enableLetterButtons(_enable: true) 
      updateUI() 
     } else { 
      enableLetterButtons (_enable: false) 
     } 

    } 

    func updateUI() { 
     var letters = [String]() 
     for letter in currentGame.formattedWord.characters { 
      letters.append(String(letter)) 
     } 
     let wordWithSpacing = letters.joined(separator: " ") 
     correctWordLabel.text = wordWithSpacing 
     scoreLabel.text = "Wins: \(totalWins), Losses:\(totalLosses)" 
     treeImageView.image = UIImage (named: "Tree \(currentGame.incorrectMovesRemaining)") 
     self.setNeedsDisplay() 
    } 

    func updateGameState(){ 
     var letters = [String]() 
     for letter in currentGame.word.characters { 
      letters.append(String(letter)) 
     } 
     let theAnswer = letters.joined(separator: " ") 
     if currentGame.incorrectMovesRemaining == 0 { 
      correctWordLabel.text = theAnswer 
      Thread.sleep(forTimeInterval: 3) 
      totalLosses += 1 
     } else if currentGame.word == currentGame.formattedWord { 
      totalWins += 1 
     } else { 
      updateUI() 
     } 
    } 
} 
0

创建一个变量,它会跟踪你有多少次猜错了。当你猜错误7次,

while numberOfTimesGuessedWrong <= 7{ 

} 
//when you have guessed incorrectly 7 times, the compiler will move here: 
wordLabel.text = "\(correctAnswer)" 

,8号的时候,它就会显示出正确的答案:那你可以这样做:

使用while语句。