swift一周小结(2)
来源:互联网 发布:多益网络策划笔试 编辑:程序博客网 时间:2024/06/05 22:32
上一篇,我们把连连看的布局给显示出来,这一篇主要来连连的逻辑
1 按钮的点击事件
// MARK: 点击事件 func chessBtnClicked(sender: ChessBtn?){ if sender == nil { if self._selectChess != nil { //判断是否第二次点击了按钮 self.normalChess(self._selectChess!) //动画回复正常方法 self._selectChess = nil } return } if self._selectChess == nil{ // 第一次点击棋子 self._selectChess = sender //动画把按钮变大方法 self.bigChess(self._selectChess!) } else { let lastChess = sender! let nowChess = self._selectChess! /第一次点击的按钮 //点击第二个棋子 let canEat = self.canChessEat(nowChess, chess2: lastChess)//判断是否可以消除方法 if canEat {//如果可以的话 self.chessEat(nowChess, chessBtn2: lastChess)//消除方法 if self.checkExistPath() == nil{//没有选择按钮 self.resum(nil)//重新开始 } self.checkWin()//赢了 return } self.normalChess(self._selectChess!) self._selectChess = sender self.bigChess(self._selectChess!) } }
2 按钮变大变小的动画
// MARK: - 棋子动画 // 让棋子变大 func bigChess(sender: UIButton){ UIView.animateWithDuration(0.25) { () -> Void in sender.transform = CGAffineTransformMakeScale(kBigScale, kBigScale) } self.chessView.bringSubviewToFront(sender) } // 让棋子恢复正常大小 func normalChess(sender: UIButton){ UIView.animateWithDuration(0.25) { () -> Void in sender.transform = CGAffineTransformIdentity } }
3 检查是否存在可消去的棋子
func checkExistPath()->(chess1:ChessBtn, chess2:ChessBtn)?{ var lifingChesses = self._lifingChesses while lifingChesses.count>0 { let c1 = lifingChesses[0] for c2 in lifingChesses{ if (c1.tag==c2.tag) && (c1 != c2){ if self.canChessEat(c1, chess2: c2){ return (c1,c2) }else{ lifingChesses.removeAtIndex(lifingChesses.indexOf(c1)!) lifingChesses.removeAtIndex(lifingChesses.indexOf(c2)!) break } } } } return nil }
4.判断棋子是否能消去
func canChessEat(chess1:ChessBtn , chess2:ChessBtn) -> Bool{ if chess1.isEqual(chess2) {return false} // 判断是否同一个按钮,是的话不做处理 if chess1.tag != chess2.tag {return false} // 图片是否同一样,如果不是就是图片不一样的图片,不做处理 var canEat:Bool = false let chess1Path = self.pathCanGo(chess1) let chess2Path = self.pathCanGo(chess2) canEat = self.oneLine(chess1.center, point2: chess2.center)//判断直线上是否可以消除 if !canEat { canEat = self.twoLine(chess1Path, chess2Path: chess2Path)//直角线是否可以消除 if !canEat { canEat = self.threeLine(chess1Path, chess2Path: chess2Path) } } return canEat}5 返回chess在x,y轴上能走的路径,路径不包含chess所 func pathCanGo(chessBtn:ChessBtn) ->(ChessPath){ if self._lifingChesses.count < 0 { return ([],[])} let minX = self._beginX - self._normalWidth let minY = self._beginY - self._normalHeight let maxX = minX + CGFloat(kCount_colum)*self._normalWidth + self._normalWidth let maxY = minY + CGFloat(kCount_row)*self._normalHeight + self._normalHeight let originX = chessBtn.center.x let originY = chessBtn.center.y var x1Arr:Array<CGPoint> = [] var x1 = originX - self._normalWidth while x1 + kMinOffset >= minX{ let point = CGPointMake(x1, originY) if isIdlePoint(point){ x1Arr.append(point) }else{ break } x1 -= self._normalWidth } var x2Arr:Array<CGPoint> = [] var x2 = originX + self._normalWidth while x2 - kMinOffset <= maxX{ let point = CGPointMake(x2, originY) if isIdlePoint(point){ x2Arr.append(point) }else{ break } x2 += self._normalWidth } var y1Arr:Array<CGPoint> = [] var y1 = originY - self._normalHeight while y1 + kMinOffset >= minY { let point = CGPointMake(originX, y1) if isIdlePoint(point){ y1Arr.append(point) }else{ break } y1 -= self._normalHeight } var y2Arr:Array<CGPoint> = [] var y2 = originY + self._normalHeight while y2 - kMinOffset <= maxY { let point = CGPointMake(originX, y2) if isIdlePoint(point){ y2Arr.append(point) }else{ break } y2 += self._normalHeight } let chessPath = ChessPath(x1Arr+x2Arr,y1Arr+y2Arr) return chessPath }
6 判断是否可以通过线消除
// 判断能否通过 1 条线吃掉func oneLine(point1:CGPoint, point2:CGPoint)->Bool{ if abs(point1.x - point2.x)<kMinOffset { // 判断y轴上能否连在一起 let count:Int = Int(abs((point2.y-point1.y)/self._normalHeight)+0.5) let padding = point2.y > point1.y ? self._normalHeight : -self._normalHeight var isLine = true if count == 0 {return false} for i in 1...count { let y = point1.y + padding*CGFloat(i) let point = CGPoint(x: point1.x, y: y) if i == 1 { // 1.距离为1表示相连 if pointEqualToPoint(point, point2: point2){ isLine = true break } } if i == count { // 2.距离为count不用判断 break } // 3.判断中间是否都是空闲的 if self.isIdlePoint(point) == false { // 无法直连 isLine = false break } } return isLine } if abs(point1.y - point2.y)<kMinOffset { // 判断x轴上能否连在一起 let count:Int = Int(abs((point2.x-point1.x)/self._normalWidth)+0.5) let padding = point2.x > point1.x ? self._normalWidth : -self._normalWidth var isLine = true for i in 1...count { let x = point1.x + padding*CGFloat(i) let point = CGPoint(x: x, y: point1.y) if i == 1 { // 1.相连 if pointEqualToPoint(point, point2: point2){ isLine = true break } } if i == count { // 2.距离为count不用判断 break } // 3.判断中间是否都是空闲的 if self.isIdlePoint(point) == false { // 无法直连 isLine = false break } } return isLine } return false} // 判断能否通过 2 条线吃掉func twoLine(chess1Path:ChessPath, chess2Path:ChessPath)->Bool{ // chess1的x轴路线交与chesss2的y轴路线 for i in 0 ..< chess1Path.xArr.count { let xPoint = chess1Path.xArr[i] for j in 0 ..< chess2Path.yArr.count { let yPoint = chess2Path.yArr[j] if pointEqualToPoint(xPoint, point2: yPoint) {return true} } } // chess1的y轴路线交与chesss2的x轴路线 for i in 0 ..< chess1Path.yArr.count { let yPoint = chess1Path.yArr[i] for j in 0 ..< chess2Path.xArr.count { let xPoint = chess2Path.xArr[j] if pointEqualToPoint(yPoint, point2: xPoint) {return true} } } return false}// 判断能否通过 3 条线吃掉func threeLine(chess1Path:ChessPath, chess2Path:ChessPath)->Bool{ // chess1的x轴路径与chess2的x轴路径有直连线存在 for i in 0 ..< chess1Path.xArr.count { let chess1Point:CGPoint = chess1Path.xArr[i] for j in 0 ..< chess2Path.xArr.count { let chess2Point:CGPoint = chess2Path.xArr[j] let xOffset = abs(chess1Point.x - chess2Point.x) if xOffset < kMinOffset { // x坐标相同的2点,判断此2点能否直连 if self.oneLine(chess1Point, point2: chess2Point) { return true } } } } // chess1的y轴路径与chess2的y轴路径有直连线存在 for i in 0 ..< chess1Path.yArr.count { let chess1Point:CGPoint = chess1Path.yArr[i] for j in 0 ..< chess2Path.yArr.count { let chess2Point:CGPoint = chess2Path.yArr[j] let yOffset = abs(chess1Point.y - chess2Point.y) if yOffset < kMinOffset { // y坐标相同的2点,判读此2点能否直连 if self.oneLine(chess1Point, point2: chess2Point) { return true } } } } return false}
7 判断两点是否相等 func pointEqualToPoint(point1:CGPoint, point2:CGPoint)->Bool{ let xSet = point2.x - point1.x let ySet = point2.y - point1.y var isEqual:Bool = false if abs(xSet)<kMinOffset && abs(ySet)<kMinOffset { isEqual = true } return isEqual }
8 消去相同的棋子
func chessEat(chessBtn:ChessBtn,chessBtn2:ChessBtn){ if chessBtn.isEqual(chessBtn2) {return} if chessBtn.tag != chessBtn2.tag {return} self._selectChess = nil let index1 = self._lifingChesses.indexOf(chessBtn2) self._lifingChesses.removeAtIndex(index1!) let index2 = self._lifingChesses.indexOf(chessBtn) self._lifingChesses.removeAtIndex(index2!) self._deadChesses.append(chessBtn2) self._deadChesses.append(chessBtn) self.normalChess(chessBtn) self.normalChess(chessBtn2) chessBtn2.frame = CGRectZero chessBtn.frame = CGRectZero chessBtn.enabled = false chessBtn.enabled = false}
// 9 判断两点是否相等
func pointEqualToPoint(point1:CGPoint, point2:CGPoint)->Bool{ let xSet = point2.x - point1.x let ySet = point2.y - point1.y var isEqual:Bool = false if abs(xSet)<kMinOffset && abs(ySet)<kMinOffset { isEqual = true } return isEqual }
10 判断point上是否有其他棋子
func isIdlePoint(point:CGPoint)->Bool{ var isIdle = true for chessbtn in self._lifingChesses{ let chessPoint = chessbtn.center isIdle = !pointEqualToPoint(point, point2: chessPoint) if isIdle == false {break} } return isIdle }
11 赢了
func checkWin(){ if self._lifingChesses.count == 0{ self._timer?.invalidate() self._timer = nil self._isOnGame = false // 提示 if #available(iOS 8.0, *) { let winAlert = UIAlertController(title: "连连看", message: "恭喜通过!", preferredStyle: UIAlertControllerStyle.Alert) winAlert.addAction(UIAlertAction(title: "确定", style: UIAlertActionStyle.Cancel, handler: { (action:UIAlertAction) -> Void in self.resetChess() })) self.presentViewController(winAlert, animated: true, completion: nil) } else { let winAlert = UIAlertView(title: "连连看", message: "恭喜通过!", delegate: self, cancelButtonTitle: "确定") winAlert.show() } } }
12 输了
func gameFail(){ self.darkLifingChess() self.start.enabled = true self._selectChess = nil self._timer?.invalidate() self._timer = nil self._isOnGame = false // 提示 if #available(iOS 8.0, *) { let failAlert = UIAlertController(title: "连连看", message: "没有时间啦!", preferredStyle: UIAlertControllerStyle.Alert) failAlert.addAction(UIAlertAction(title: "确定", style: UIAlertActionStyle.Cancel, handler: { (action:UIAlertAction) -> Void in })) self.presentViewController(failAlert, animated: true, completion: nil) } else { let failAlert = UIAlertView(title: "连连看", message: "没有时间啦!", delegate: nil, cancelButtonTitle: "确定") failAlert.show() } }
13 重置棋盘
func resetChess(){
self.timerProgress.setProgress(1.0, animated: true)
self._timer?.invalidate()
self._timer = nil
self.start.enabled = true self._lifingChesses = self._lifingChesses + self._deadChesses self._deadChesses = [] self.darkLifingChess() self.setUpPosition(random: true)}
14 定时器的任务
func timerTask(timer:NSTimer){ if self.timerProgress.progress <= 0 { // 游戏结束了 self.gameFail() return } var progress = self.timerProgress.progress - 1/Float(kTimeSecond) progress = progress>=0 ? progress : 0 self.timerProgress.setProgress(progress, animated: true) if self.timerProgress.progress <= 0 { // 游戏结束了 self.gameFail() return } }
开始
@IBAction func start(sender: UIButton!) { self._lifingChesses = self._lifingChesses + self._deadChesses self._deadChesses = [] self.lightLifingChess() self.resum(nil) sender.enabled = false self._isOnGame = true self.timerProgress.setProgress(1.0, animated: true) self._timer?.invalidate() self._timer = nil self._timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("timerTask:"), userInfo: nil, repeats: true) }
//暂停
@IBAction func pasue(sender: UIButton!) { if self._isOnGame == false {return} let title = sender.titleForState(UIControlState.Normal)! if title == "暂停" { // 暂停游戏,用来调试 self._timer?.invalidate() self._timer = nil self.darkLifingChess() self.pasue.setTitle("继续", forState: UIControlState.Normal) }else if title == "继续" { // 继续游戏 self._timer?.invalidate() self._timer = nil self.lightLifingChess() self._timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("timerTask:"), userInfo: nil, repeats: true) self.pasue.setTitle("暂停", forState: UIControlState.Normal) } }
重新开始
@IBAction func resum(sender:UIButton!) { self.chessBtnClicked(nil) UIView .animateWithDuration(0.5, animations: { () -> Void in self.setUpPosition(random: true) }) { (stop) -> Void in // 检查是否有可消路径 if self.checkExistPath() == nil{ self.resum(nil) } } }
代码基本上都就这,我会把代码放在github上,之后会把连接发上来
0 0
- swift一周小结(2)
- Swift 第一周小结(1)
- 一周小结(2)
- 一周小结(1)
- 一周小结(3)
- 一周初识swift(一)
- 一周初识swift(二)
- Swift语言小结2
- 一周小结
- 一周小结
- 一周小结
- 一周小结
- 一周小结
- 一周小结(你不要小看业务)
- Android学习小结(第一周)
- 一周小结(2017/03/05 Sun)
- swift 小结
- 一周工作小结
- 利用 LeakCanary 来检查 Android 内存泄漏
- 9-20网页尺寸scrollHeight
- git push遇到的Permission denied (publickey).
- /AndroidRuntime(11765): android.view.InflateException: Binary XML file line #19: Error inflating cla
- 关于加载网络图面内存溢出的问题处理方法
- swift一周小结(2)
- 配置activity-alias别名,更改app图标和名字
- spring-AOP基本概念
- java8 lambda排序
- usb摄像头视频数据抓取初探
- 9-21网页尺寸offsetHeight
- KindEditor编辑器中的class自动过滤了
- 常见C/C++ XML解析器比较
- QT对话框实现