Swift check for tie game logic


i have finished game of tic tac toe mpc class , works great except handlepotentialtie function. there 0 errors , crashes logic behaves oddly when board full. without handlepotentialtie function game works perfectly. added function later on , it's towards bottom. have included code , screenshot of behaviour. i'm totally new programming , insanely appreciated. in advance.


code:
//  //  viewcontroller.swift  //  tic tac toe    import uikit  import multipeerconnectivity    class viewcontroller: uiviewcontroller, mcbrowserviewcontrollerdelegate {        @iboutlet var fields: [tttimageview]!      var currentplayer: string!        var appdelegate:appdelegate!            var turn:string!            override func viewdidload() {          super.viewdidload()          appdelegate = uiapplication.sharedapplication().delegate appdelegate          appdelegate.mpchandler.setuppeerwithdisplayname(uidevice.currentdevice().name)          appdelegate.mpchandler.setupsession()          appdelegate.mpchandler.advertiseself(true)                    nsnotificationcenter.defaultcenter().addobserver(self, selector: "peerchangedstatewithnotification:", name: "mpc_didchangestatenotification", object: nil)                nsnotificationcenter.defaultcenter().addobserver(self, selector: "handlereceiveddatawithnotification:", name: "mpc_didreceivedatanotification", object: nil)                    setupfield()          currentplayer = "letterx"          turn = "yourturn"      }              @ibaction func connectwithplayer(sender: anyobject) {          if appdelegate.mpchandler.session != nil{              appdelegate.mpchandler.setupbrowser()              appdelegate.mpchandler.browser.delegate = self                            self.presentviewcontroller(appdelegate.mpchandler.browser, animated: true, completion: nil)          }      }                        func peerchangedstatewithnotification(notification:nsnotification){          let userinfo = nsdictionary(dictionary: notification.userinfo!)                    let state = userinfo.objectforkey("state") int                    if state != mcsessionstate.connecting.rawvalue{              self.navigationitem.title = "connected"          }                }                  func handlereceiveddatawithnotification(notification:nsnotification){          let userinfo = notification.userinfo! dictionary          let receiveddata:nsdata = userinfo["data"] nsdata                let message = nsjsonserialization.jsonobjectwithdata(receiveddata, options: nsjsonreadingoptions.allowfragments, error: nil) nsdictionary          let senderpeerid:mcpeerid = userinfo["peerid"] mcpeerid          let senderdisplayname = senderpeerid.displayname          println(message)                   if message.objectforkey("string")?.isequaltostring("new game") == true{              turn = "yourturn"              let alert = uialertcontroller(title: "tic tac toe", message: "\(senderdisplayname) has started new game", preferredstyle: uialertcontrollerstyle.alert)                            alert.addaction(uialertaction(title: "ok", style: uialertactionstyle.default, handler: { (alert:uialertaction!) -> void in                  self.resetfield()              }))                            self.presentviewcontroller(alert, animated: true, completion: nil)                                      }else if message.objectforkey("turnstring")?.isequaltostring("devicea") == true{                            turn = "devicea"                            var field:int? = message.objectforkey("field")?.integervalue              var player:string? = message.objectforkey("player")as? string                            if field != nil && player != nil{                  fields[field!].player = player                  fields[field!].setplayer(player!)                                    if player == "letterx"{                      currentplayer = "lettero"                  }else{                      currentplayer = "letterx"                  }                                    checkresults()                                }                    }               }                  func fieldtapped(recognizer:uitapgesturerecognizer){          let tappedfield = recognizer.view tttimageview //                              if turn == "devicea" || turn == "yourturn"{              tappedfield.setplayer(currentplayer)              let messagedict = ["field":tappedfield.tag, "player":currentplayer, "turnstring":"devicea"]                            let messagedata = nsjsonserialization.datawithjsonobject(messagedict, options: nsjsonwritingoptions.prettyprinted, error: nil)                            let data = messagedata              // returned data              var error: nserror?              appdelegate.mpchandler.session.senddata(data, topeers: appdelegate.mpchandler.session.connectedpeers, withmode: mcsessionsenddatamode.unreliable, error:&error)                            if error != nil{                  println("error:\(error?.localizeddescription)")              }          }                    checkresults()          turn = "deviceb"      }            func setupfield(){          index in 0...fields.count - 1{              let gesturerecognizer = uitapgesturerecognizer(target: self, action: "fieldtapped:")              gesturerecognizer.numberoftapsrequired = 1                            fields[index].addgesturerecognizer(gesturerecognizer)                        }      }            func resetfield(){          index in 0...fields.count - 1 {              fields[index].image = nil              fields[index].activated = false              fields[index].player = ""          }                    currentplayer = "letterx"      }            @ibaction func newgame(sender: anyobject) {          resetfield()                    let messagedict = ["string":"new game"]                    let messagedata = nsjsonserialization.datawithjsonobject(messagedict, options: nsjsonwritingoptions.prettyprinted, error: nil)                    var error:nserror?                    appdelegate.mpchandler.session.senddata(messagedata, topeers: appdelegate.mpchandler.session.connectedpeers, withmode: mcsessionsenddatamode.reliable, error: &error)                    if error != nil{              println("error: \(error?.localizeddescription)")          }                          }                          func checkresults(){          var winner = ""                    if fields[0].player == "letterx" && fields[1].player == "letterx" && fields[2].player == "letterx"{              winner = "letterx"          }else if fields[0].player == "lettero" && fields[1].player == "lettero" && fields[2].player == "lettero"{              winner = "lettero"          }else if fields[3].player == "letterx" && fields[4].player == "letterx" && fields[5].player == "letterx"{              winner = "letterx"          }else if fields[3].player == "lettero" && fields[4].player == "lettero" && fields[5].player == "lettero"{              winner = "lettero"          }else if fields[6].player == "letterx" && fields[7].player == "letterx" && fields[8].player == "letterx"{              winner = "letterx"          }else if fields[6].player == "lettero" && fields[7].player == "lettero" && fields[8].player == "lettero"{              winner = "lettero"          }else if fields[0].player == "letterx" && fields[3].player == "letterx" && fields[6].player == "letterx"{              winner = "letterx"          }else if fields[0].player == "lettero" && fields[3].player == "lettero" && fields[6].player == "lettero"{              winner = "lettero"          }else if fields[1].player == "letterx" && fields[4].player == "letterx" && fields[7].player == "letterx"{              winner = "letterx"          }else if fields[1].player == "lettero" && fields[4].player == "lettero" && fields[7].player == "lettero"{              winner = "lettero"          }else if fields[2].player == "letterx" && fields[5].player == "letterx" && fields[8].player == "letterx"{              winner = "letterx"          }else if fields[2].player == "lettero" && fields[5].player == "lettero" && fields[8].player == "lettero"{              winner = "lettero"          }else if fields[0].player == "letterx" && fields[4].player == "letterx" && fields[8].player == "letterx"{              winner = "letterx"          }else if fields[0].player == "lettero" && fields[4].player == "lettero" && fields[8].player == "lettero"{              winner = "lettero"          }else if fields[2].player == "letterx" && fields[4].player == "letterx" && fields[6].player == "letterx"{              winner = "letterx"          }else if fields[2].player == "lettero" && fields[4].player == "lettero" && fields[6].player == "lettero"{              winner = "lettero"          }                                  if winner != ""{              let alert = uialertcontroller(title: "tic tac toe", message: "the winner \(winner)", preferredstyle: uialertcontrollerstyle.alert)              alert.addaction(uialertaction(title: "ok", style: uialertactionstyle.default, handler: { (alert:uialertaction!) -> void in                  self.resetfield()              }))                            self.presentviewcontroller(alert, animated: true, completion: nil)                   }           // area don't know how code.  // looking  //  //              func handlepotentialtie() -> bool {              if contains(fields, { $0.player == "" }) {                  // empty field: game isn't over.                  return false                                } else {                  contains(fields, { $0.player != "" })                  // no empty fields: game on , must tie.                  // end game , announce tie.                                    let alert = uialertcontroller(title: "tic tac toe", message: "tie game", preferredstyle: uialertcontrollerstyle.alert)                  alert.addaction(uialertaction(title: "ok", style: uialertactionstyle.default, handler: { (alert:uialertaction!) -> void in                      self.resetfield()                  }))                                    self.presentviewcontroller(alert, animated: true, completion: nil)                                                      return true              }                        }                      }                             func browserviewcontrollerdidfinish(browserviewcontroller: mcbrowserviewcontroller!) {          appdelegate.mpchandler.browser.dismissviewcontrolleranimated(true, completion: nil)      }            func browserviewcontrollerwascancelled(browserviewcontroller: mcbrowserviewcontroller!) {          appdelegate.mpchandler.browser.dismissviewcontrolleranimated(true, completion: nil)      }                        override func didreceivememorywarning() {          super.didreceivememorywarning()          // dispose of resources can recreated.      }      }  
 

make simplified test case. run in timeline (or whatever tools swift has debugging).

test case should first fill playing board (i.e. fields array) known tie game. should call checkresults() function. should trace through call of checkresults , see branch being executed.

creating , running test cases 1 of fundamental tools of debugging. test cases embody debugging principle "confirm expectations". test case programmed statement of expected.


if first non-trivial swift program, need learn how debug non-trivial swift programs.

if you've never used swift's debugging tools before, learn use them now, because you'll need know them if intend write else.


benefit learning factoring (break things down), can left thread. brief exercise, commonalities see in if/else chain? think how you'd write code express commonality of things, few smaller functions , less overt repetition.

also, huge if/else chain doesn't diagonal win in positions {2,4,6}, possibly due sheer size , complexity of reading if/else chain.
 


Forums iPhone, iPad, and iPod Touch iOS Programming


  • iPhone
  • Mac OS & System Software
  • iPad
  • Apple Watch
  • Notebooks
  • iTunes
  • Apple ID
  • iCloud
  • Desktop Computers
  • Apple Music
  • Professional Applications
  • iPod
  • iWork
  • Apple TV
  • iLife
  • Wireless

Comments

Popular posts from this blog

Pasco WA. Cops Killing A Homeless Man while running away

Gold Apple Watch Buyers to Get Special Purchasing Experience With 30 Minute Appointments

Transferring URLS