Swift:可能的逻辑错误
我正在尝试创建一个简单的井字游戏。不需要人工智能。我已经到了可以在我的UI中点击按钮的地步,它们每次都会切换。我还创建了一个checkScore()函数。然而,我认为我的checkScore()函数在某些地方有错误的逻辑,我花了两天的时间试图找出它。如果用户连续获得三个,则应在win所在的位置运行WinneMessage()函数。我的变量名很容易解释 我这里的问题是,除非我注释掉checkScore()函数中的所有“else if”语句,否则winnerMessage将在第一次单击棋盘时运行。请帮忙!谢谢 定义变量Swift:可能的逻辑错误,swift,logic,Swift,Logic,我正在尝试创建一个简单的井字游戏。不需要人工智能。我已经到了可以在我的UI中点击按钮的地步,它们每次都会切换。我还创建了一个checkScore()函数。然而,我认为我的checkScore()函数在某些地方有错误的逻辑,我花了两天的时间试图找出它。如果用户连续获得三个,则应在win所在的位置运行WinneMessage()函数。我的变量名很容易解释 我这里的问题是,除非我注释掉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!
板上按钮的操作和插座。当用户单击按钮时,操作将更改为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值,但您将它们与“”字符串进行比较,这就是为什么每次您的条件变为始终为true并显示赢家消息的原因。您只需替换所有您的条件!=“和我不喜欢这样
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")
}
在重置方法的按钮标题中也设置为零。
我希望它能解决您的问题Sumit给我的答案是解决方案的一部分。谢谢你帮我找到了正确的方向!使其工作的方法是,checkScore()函数需要这样编写:
func checkScore(){
if (topLeftOutlet.currentTitle == topCenterOutlet.currentTitle && topLeftOutlet.currentTitle == topRightOutlet.currentTitle && topLeftOutlet.currentTitle != originalValue && topLeftOutlet.currentTitle != nil){
announcementArea.text = winnerMessageTopHorizontal
}
if (leftCenterOutlet.currentTitle == centerOutlet.currentTitle && centerOutlet.currentTitle == rightCenterOutlet.currentTitle && leftCenterOutlet.currentTitle != originalValue && leftCenterOutlet.currentTitle != nil) {
announcementArea.text = winnerMessageCenterHorizontal
}
if (bottomLeftOutlet.currentTitle == bottomCenterOutlet.currentTitle && bottomLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && bottomLeftOutlet.currentTitle != originalValue && bottomLeftOutlet.currentTitle != nil){
announcementArea.text = winnerMessageBottomHorizontal
}
if (topLeftOutlet.currentTitle == leftCenterOutlet.currentTitle && topLeftOutlet.currentTitle == bottomLeftOutlet.currentTitle && topLeftOutlet != originalValue && topLeftOutlet.currentTitle != nil){
announcementArea.text = winnerMessageLeftVertical
}
if (topCenterOutlet.currentTitle == centerOutlet.currentTitle && topCenterOutlet.currentTitle == bottomCenterOutlet.currentTitle && topCenterOutlet.currentTitle != originalValue && topCenterOutlet.currentTitle != nil){
announcementArea.text = winnerMessageCenterVertical
}
if (topRightOutlet.currentTitle == rightCenterOutlet.currentTitle && topRightOutlet.currentTitle == bottomRightOutlet.currentTitle && topRightOutlet.currentTitle != originalValue && topRightOutlet.currentTitle != nil){
announcementArea.text = winnerMessageRightVertical
}
if (topLeftOutlet.currentTitle == centerOutlet.currentTitle && topLeftOutlet.currentTitle == bottomRightOutlet.currentTitle && topLeftOutlet.currentTitle != originalValue && topLeftOutlet.currentTitle != nil){
announcementArea.text = winnerMessageDiagonal1
}
if (topRightOutlet.currentTitle == centerOutlet.currentTitle && topRightOutlet.currentTitle == bottomLeftOutlet.currentTitle && topRightOutlet.currentTitle != originalValue && topRightOutlet.currentTitle != nil){
announcementArea.text = winnerMessageDiagonal2
}
}
每个“if”语句都需要检查按钮标题是否不等于我创建的空字符串变量originalValue。此外,正如Sumit提到的,它需要检查按钮标题是否不等于nil 仅供参考-您可以使用单个按钮操作来处理每个按钮,因为您现有的9个按钮处理程序中的所有代码都是相同的。但这与你的问题无关。只是一个建议。当调用您的
checkScore
方法时,哪一行错误地宣布了获胜者?使用调试器并逐行执行,看看会发生什么。感谢您的建议!引入的checkScore()函数的第二行将导致单击任意按钮,在文本字段@IBOutlet弱var announcementArea:UITextField!中显示winnerMessage!查看checkScore()
中的最后一个else if
子句,并查看它正在检查哪些按钮。我不明白您为什么不想使用else if语句。我不认为我的答案是解决方案的一部分,它完全是正确的答案