gpt4 book ai didi

Swift:可能的逻辑错误

转载 作者:搜寻专家 更新时间:2023-11-01 05:35:59 26 4
gpt4 key购买 nike

我正在尝试创建一个简单的井字游戏。不需要人工智能。我已经到了可以单击 UI 中的按钮并且它们每次都会切换的地步。我还创建了一个 checkScore() 函数。但是,我认为我的 checkScore() 函数在某处有错误的逻辑,我花了两天时间试图弄清楚。如果用户连续获得三个,它应该在获胜的地方运行 winnerMessage() 函数。我的变量名很容易解释。

我的问题是,除非我注释掉 checkScore() 函数中的所有“else if”语句,否则 winnerMessage 会在第一次单击面板时运行。请帮忙!谢谢。

定义变量。

    var player1 = "❌"
var player2 = "⭕️"
var currentPlayer = "❌"

let originalValue = ""

let winnerMessageTopHorizontal = "We have a winner across the top!"
let winnerMessageCenterHorizontal = "We have a winner across the center!"
let winnerMessageBottomHorizontal = "We have a winner across the bottom!"
let winnerMessageLeftVertical = "We have a winner on the left side!"
let winnerMessageCenterVertical = "We have a winner down the center!"
let winnerMessageRightVertical = "We have a winner on the right side!"
let winnerMessageDiagonal1 = "We have a winner diagonally!"
let winnerMessageDiagonal2 = "We have a winner diagonally!"

这是我创建的 changePlayer() 函数。

/* function that changes from player1 to player2 (switching from X to O and O to X)*/
func changePlayer(){

if currentPlayer == player1{
print ("\(player1)")
currentPlayer = player2
}



else if currentPlayer == player2{
print ("\(player2)")
currentPlayer = player1
}


else{
NSLog ("Error. Please reset the game.")
}

}

这是我一直遇到问题的 checkScore() 函数。如果您注释掉除第一行之外的所有函数行,那么您可以看到第一步按预期工作。

func checkScore(){



if topLeftOutlet.currentTitle == topCenterOutlet.currentTitle && topLeftOutlet.currentTitle == topRightOutlet.currentTitle && topLeftOutlet.currentTitle != ""{
announcementArea.text = winnerMessageTopHorizontal
}

else if leftCenterOutlet.currentTitle == centerOutlet.currentTitle && leftCenterOutlet.currentTitle == rightCenterOutlet.currentTitle && leftCenterOutlet.currentTitle != ""{
announcementArea.text = winnerMessageCenterHorizontal
}
else if bottomLeftOutlet.currentTitle == bottomCenterOutlet.currentTitle && bottomLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && bottomLeftOutlet.currentTitle != ""{
announcementArea.text = winnerMessageBottomHorizontal
}
else if topLeftOutlet.currentTitle == leftCenterOutlet.currentTitle && topLeftOutlet.currentTitle == bottomLeftOutlet.currentTitle && topLeftOutlet.currentTitle != ""{
announcementArea.text = winnerMessageLeftVertical
}
else if topCenterOutlet.currentTitle == centerOutlet.currentTitle && topCenterOutlet.currentTitle == bottomCenterOutlet.currentTitle && topCenterOutlet.currentTitle != ""{
announcementArea.text = winnerMessageCenterVertical
}
else if topRightOutlet.currentTitle == rightCenterOutlet.currentTitle && topRightOutlet.currentTitle == bottomRightOutlet.currentTitle && topRightOutlet.currentTitle != ""{
announcementArea.text = winnerMessageRightVertical
}
else if topLeftOutlet.currentTitle == centerOutlet.currentTitle && topLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && topLeftOutlet.currentTitle != ""{
announcementArea.text = winnerMessageDiagonal1
}
else if topRightOutlet.currentTitle == centerOutlet.currentTitle && topRightOutlet.currentTitle == bottomLeftOutlet.currentTitle && topLeftOutlet.currentTitle != ""{
announcementArea.text = winnerMessageDiagonal2
}

else{
NSLog ("Keep going")
}




}
@IBOutlet weak var announcementArea: UITextField!

板上按钮的操作和 socket 。操作是当用户单击按钮时它会变为 X 或 O。导出用于下面的重置功能,将值重置为空。

    @IBAction func topLeft(sender: UIButton) {
sender.setTitle(currentPlayer, forState: .Normal)
changePlayer()
checkScore()
}
@IBOutlet weak var topLeftOutlet: UIButton!

@IBAction func topCenter(sender: UIButton) {
sender.setTitle(currentPlayer, forState: .Normal)
changePlayer()
checkScore()
}
@IBOutlet weak var topCenterOutlet: UIButton!

@IBAction func topRight(sender: UIButton) {
sender.setTitle(currentPlayer, forState: .Normal)
changePlayer()
checkScore()
}
@IBOutlet weak var topRightOutlet: UIButton!

@IBAction func leftCenter(sender: UIButton) {
sender.setTitle(currentPlayer, forState: .Normal)
changePlayer()
checkScore()
}
@IBOutlet weak var leftCenterOutlet: UIButton!

@IBAction func center(sender: UIButton) {
sender.setTitle(currentPlayer, forState: .Normal)
changePlayer()
checkScore()
}
@IBOutlet weak var centerOutlet: UIButton!

@IBAction func rightCenter(sender: UIButton) {
sender.setTitle(currentPlayer, forState: .Normal)
changePlayer()
checkScore()
}
@IBOutlet weak var rightCenterOutlet: UIButton!

@IBAction func bottomLeft(sender: UIButton) {
sender.setTitle(currentPlayer, forState: .Normal)
changePlayer()
checkScore()
}

@IBOutlet weak var bottomLeftOutlet: UIButton!

@IBAction func bottomCenter(sender: UIButton) {
sender.setTitle(currentPlayer, forState: .Normal)
changePlayer()
checkScore()
}
@IBOutlet weak var bottomCenterOutlet: UIButton!

@IBAction func bottomRight(sender: UIButton) {
sender.setTitle(currentPlayer, forState: .Normal)
changePlayer()
checkScore()
}
@IBOutlet weak var bottomRightOutlet: UIButton!

这个按钮目前没用:

    @IBAction func startGame(sender: UIButton) {
NSLog ("Player Started Game")
}

resetButton() 函数,当玩家点击重置按钮时重置棋盘

    @IBAction func resetGame(sender: UIButton) {
NSLog ("Player Reset Game")
topLeftOutlet.setTitle(originalValue, forState: .Normal)
topCenterOutlet.setTitle(originalValue, forState: .Normal)
topRightOutlet.setTitle(originalValue, forState: .Normal)
leftCenterOutlet.setTitle(originalValue, forState: .Normal)
centerOutlet.setTitle(originalValue, forState: .Normal)
rightCenterOutlet.setTitle(originalValue, forState: .Normal)
bottomLeftOutlet.setTitle(originalValue, forState: .Normal)
bottomCenterOutlet.setTitle(originalValue, forState: .Normal)
bottomRightOutlet.setTitle(originalValue, forState: .Normal)
}


}

非常感谢您的关注。我不希望它是完美的。我只需要另一只眼睛看看我是否漏掉了一些明显的东西!

最佳答案

我弄清楚了你的问题。问题出在 changeScore 方法中,你的按钮在开始时包含 nil 值,但你将它们与“”字符串进行比较,这就是为什么每次你的条件总是为真并显示获胜者消息。你只需要替换所有你 != ""和 != nil 的条件是这样的

   if topLeftOutlet.currentTitle == topCenterOutlet.currentTitle && topLeftOutlet.currentTitle == topRightOutlet.currentTitle && topLeftOutlet.currentTitle != nil{
announcementArea.text = winnerMessageTopHorizontal
}

else if leftCenterOutlet.currentTitle == centerOutlet.currentTitle && leftCenterOutlet.currentTitle == rightCenterOutlet.currentTitle && leftCenterOutlet.currentTitle != nil{
announcementArea.text = winnerMessageCenterHorizontal
}
else if bottomLeftOutlet.currentTitle == bottomCenterOutlet.currentTitle && bottomLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && bottomLeftOutlet.currentTitle != nil{
announcementArea.text = winnerMessageBottomHorizontal
}
else if topLeftOutlet.currentTitle == leftCenterOutlet.currentTitle && topLeftOutlet.currentTitle == bottomLeftOutlet.currentTitle && topLeftOutlet.currentTitle != nil{
announcementArea.text = winnerMessageLeftVertical
}
else if topCenterOutlet.currentTitle == centerOutlet.currentTitle && topCenterOutlet.currentTitle == bottomCenterOutlet.currentTitle && topCenterOutlet.currentTitle != nil{
announcementArea.text = winnerMessageCenterVertical
}
else if topRightOutlet.currentTitle == rightCenterOutlet.currentTitle && topRightOutlet.currentTitle == bottomRightOutlet.currentTitle && topRightOutlet.currentTitle != nil{
announcementArea.text = winnerMessageRightVertical
}
else if topLeftOutlet.currentTitle == centerOutlet.currentTitle && topLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && topLeftOutlet.currentTitle != nil{
announcementArea.text = winnerMessageDiagonal1
}
else if topRightOutlet.currentTitle == centerOutlet.currentTitle && topRightOutlet.currentTitle == bottomLeftOutlet.currentTitle && topLeftOutlet.currentTitle != nil{
announcementArea.text = winnerMessageDiagonal2
}

else{
NSLog ("Keep going")
}

同时在重置方法中的按钮标题中设置 nil。我希望它能解决您的问题

关于Swift:可能的逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39907284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com