macOS swift下使用贝塞尔曲线制作五子棋盘(2)

  • 落子
    • 黑白子交替
    • 计算落子的point
  • 功能
    • 判断当前落点是否有相同棋子,并保存
    • 判断输赢
    • 分析
      • 左右分析
      • 上下分析
      • 斜向分析
    • 悔棋
    • 重开游戏
  • demo链接

上一篇我们实现了绘制棋盘格子以及棋子的功能,这一篇我们来实现黑白子交替落子和判断胜负。

落子

黑白子交替

//我们定义一个bool值,因为五子棋里总是黑子落地切换白子,白子落地切换黑子,所以每当执行完一次落子,就应该取反bool值
var isblackOrWhite: Bool = true

计算落子的point

//我们定义一个结构体,point代表当前子的横竖列坐标,isblackOrWhite代表当前子为黑子还是摆子
struct Piece {let point: NSPointlet isblackOrWhite: Bool
}
//我们在鼠标落下来捕捉当前鼠标点击区域
override func mouseDown(with event: NSEvent) {super.mouseDown(with: event)//获取鼠标在当前窗口的位置let mousePoint = event.locationInWindowprint("x: \(mousePoint.x), y: \(mousePoint.y)")//如果鼠标超出了我们固定的棋盘大小,则丢弃此次点击时间if (mousePoint.x + 23) > 500 || (mousePoint.y + 23) > 500 {return}//判断触摸的位置在棋盘的交叉点var xPoint: Intvar yPoint: Int//刚好获取列行点xPoint = Int((mousePoint.x)/30)yPoint = Int((mousePoint.y)/30)if containsDuplicate(NSPoint(x: xPoint, y: yPoint)) { return }//刷新棋盘,此时会出发draw方法,重绘棋盘needsDisplay = true
}

功能

判断当前落点是否有相同棋子,并保存

    //判断是否有相同坐标棋子并保存,相同坐标棋子则不做处理private func containsDuplicate(_ point: NSPoint) -> Bool {//判断是否有相同棋子for p in points {let x = p.point.x - point.xlet y = p.point.y - point.y//判断相同点if abs(x * x + y * y) < 0.00001 {return true}}}
    //构建棋子结构体struct Piece {let point: NSPointlet isblackOrWhite: Bool}//储存棋子数组var points: Array<Piece> = []//保存棋子let piece = Piece.init(point: point, isblackOrWhite: isblackOrWhite)points.append(piece)return false

判断输赢

五子棋的输赢极好判断,上下左右及斜边满足五个相同类型棋子就可以获胜,如图所示:

分析

左右分析

右边来讲,棋子x+1,左边来讲棋子x-1。

上下分析

上边来讲,棋子y+1,下边来讲棋子y-1。

斜向分析

左上:棋子x-1,y+1
左下:棋子x-1,y-1
右上:棋子x+1,y+1
右下:棋子x+1,y-1
获得这些信息后,我们可以计算出

override func mouseDown(with event: NSEvent) {super.mouseDown(with: event)let mousePoint = event.locationInWindowprint("x: \(mousePoint.x), y: \(mousePoint.y)")if (mousePoint.x + 23) > 500 || (mousePoint.y + 23) > 500 {return}//判断触摸的位置在棋盘的交叉点var xPoint: Intvar yPoint: IntxPoint = Int((mousePoint.x)/30)yPoint = Int((mousePoint.y)/30)if containsDuplicate(NSPoint(x: xPoint, y: yPoint)) { return }needsDisplay = true//判断输赢if chess_horizontal(xPoint, yPoint, isblackOrWhite) == 5 || chess_vertical(xPoint, yPoint, isblackOrWhite) == 5 || chess_oblique(xPoint, yPoint, isblackOrWhite) == 5 {let alert = NSAlert()alert.addButton(withTitle: "确定")alert.informativeText = "\(isblackOrWhite ? "黑棋" : "白棋")你赢了"alert.messageText = ""alert.alertStyle = .informationalalert.beginSheetModal(for: self.view.window!) { handler inif handler == NSApplication.ModalResponse.alertFirstButtonReturn { }}//置空棋盘isblackOrWhite = truepoints.removeAll()needsDisplay = true}//轮到另一位选手isblackOrWhite = !isblackOrWhite
}private func containsDuplicate(_ point: NSPoint) -> Bool {//判断是否有相同棋子for p in points {let x = p.point.x - point.xlet y = p.point.y - point.yif abs(x * x + y * y) < 0.00001 {return true}}let piece = Piece.init(point: point, isblackOrWhite: isblackOrWhite)points.append(piece)return false
}private func chess_horizontal(_ chessX: Int ,_ chessY: Int, _ isblackOrWhite: Bool) -> Int {var count = 0 //定义一个棋子的判断器var pieces: Array<Piece> = []for p in points {if p.isblackOrWhite == isblackOrWhite && Int(p.point.y) == chessY { pieces.append(p) }}for i in 0..<5 {//向右判断for piece in pieces {if chessX+i == Int(piece.point.x) {count += 1if count == 5 {return count}}}}for i in 1..<5 {//向左判断for piece in pieces {if chessX-i == Int(piece.point.x) {count += 1if count == 5 {return count}}}}return 0
}private func chess_vertical(_ chessX: Int ,_ chessY: Int, _ isblackOrWhite: Bool) -> Int {var count = 0 //定义一个棋子的判断器var pieces: Array<Piece> = []for p in points {if p.isblackOrWhite == isblackOrWhite && Int(p.point.x) == chessX { pieces.append(p) }}for i in 0..<5 {//向上判断for piece in pieces {if chessY+i == Int(piece.point.y) {count += 1if count == 5 {return count}}}}for i in 1..<5 {//向左判断for piece in pieces {if chessY-i == Int(piece.point.y) {count += 1if count == 5 {return count}}}}return 0
}private func chess_oblique(_ chessX: Int ,_ chessY: Int, _ isblackOrWhite: Bool) -> Int{var count = 0 //定义一个棋子的判断器var pieces: Array<Piece> = []for p in points {if p.isblackOrWhite == isblackOrWhite { pieces.append(p) }}for i in 0..<5 {//右上方向判断for piece in pieces {if chessX+i == Int(piece.point.x) && chessY+i == Int(piece.point.y) {count += 1if count == 5 {return count}}}}for i in 1..<5 {//右下判断for piece in pieces {if chessX+i == Int(piece.point.x) && chessY-i == Int(piece.point.y) {count += 1if count == 5 {return count}}}}for i in 1..<5 {//左上判断for piece in pieces {if chessX-i == Int(piece.point.x) && chessY+i == Int(piece.point.y) {count += 1if count == 5 {return count}}}}for i in 1..<5 {//左下判断for piece in pieces {if chessX-i == Int(piece.point.x) && chessY-i == Int(piece.point.y) {count += 1if count == 5 {return count}}}}return 0
}
//合并判断方法
//判断输赢
if chess_horizontal(xPoint, yPoint, isblackOrWhite) == 5 || chess_vertical(xPoint, yPoint, isblackOrWhite) == 5 || chess_oblique(xPoint, yPoint, isblackOrWhite) == 5 {let alert = NSAlert()alert.addButton(withTitle: "确定")alert.informativeText = "\(isblackOrWhite ? "黑棋" : "白棋")你赢了"alert.messageText = ""alert.alertStyle = .informationalalert.beginSheetModal(for: self.view.window!) { handler inif handler == NSApplication.ModalResponse.alertFirstButtonReturn { }}//置空棋盘isblackOrWhite = truepoints.removeAll()needsDisplay = true
}

悔棋

    //撤销上一步动作@IBAction func undoAction(_ sender: Any) {if points.count != 0 {//如果棋子数组不为0,删除最后一个棋子并刷新棋盘points.removeLast()needsDisplay = true//记住撤销上一部动作后,白黑棋子必须交替。isblackOrWhite = !isblackOrWhite}else {let alert = NSAlert()alert.addButton(withTitle: "确定")alert.informativeText = "没有棋子,无法悔棋"alert.messageText = ""alert.alertStyle = .informationalalert.beginSheetModal(for: self.view.window!) { handler inif handler == NSApplication.ModalResponse.alertFirstButtonReturn { }}}}

重开游戏

    @IBAction func reStartAction(_ sender: Any) {if points.count == 0 { return }let alert = NSAlert()alert.addButton(withTitle: "确定")alert.addButton(withTitle: "取消")alert.informativeText = "重开游戏"alert.messageText = ""alert.alertStyle = .informationalalert.beginSheetModal(for: self.view.window!) { [self] handler inif handler == NSApplication.ModalResponse.alertFirstButtonReturn {//清空所有棋子并刷新棋盘points.removeAll()isblackOrWhite = trueneedsDisplay = true}}}

demo链接

链接: 五子棋

macOS swift下使用贝塞尔曲线制作五子棋盘(2)相关推荐

  1. macOS swift下使用贝塞尔曲线制作五子棋盘(1)

    Mac OS下的五子棋盘 制作棋盘 画棋盘线 画横线 画竖线 画棋子 棋盘最终效果 END 制作棋盘 首先需要制作一个简单的500x500的棋盘窗口,这里使用xib来布局 下一步创建棋盘类,关联xib ...

  2. 使用贝塞尔曲线制作网页手鼓猫

    使用贝塞尔曲线制作网页手鼓猫 效果图 CSS代码 HTML代码 JS代码部分 总结 效果图 一只简易版的网页手鼓猫 CSS代码 <style>*{margin: 0;padding: 0; ...

  3. Unity之使用贝塞尔曲线制作图片轮播

    一.效果图 1.效果1 2.效果2 二.贝塞尔曲线 关于贝塞尔曲线的学习大家可以看这个文章进行学习https://blog.csdn.net/qq_39162826/article/details/1 ...

  4. Linux下使用dd命令制作启动盘

    date: 2018-09-25 10:39:41+00:00 原标题: Linux下使用dd命令制作启动盘 原链接: https://www.dreamoftime0.com/2018/09/25/ ...

  5. Unity 贝塞尔曲线制作迁徙图

    效果图: 实现该效果图所需的知识点: 1.贝塞尔曲线 贝塞尔曲线是图形学中非常重要的参数曲线,在此不做详细介绍,这里我们用到的是二次方公式: using UnityEngine; using Syst ...

  6. 贝塞尔曲线开发的艺术

    贝塞尔曲线开发的艺术 一句话概括贝塞尔曲线:将任意一条曲线转化为精确的数学公式. 很多绘图工具中的钢笔工具,就是典型的贝塞尔曲线的应用,这里的一个网站可以在线模拟钢笔工具的使用: http://bez ...

  7. android波浪动画简书,Android贝塞尔曲线————波浪效果(大波浪)

    Hello大家好,很高兴又一次与大家见面,今天是农历丁酉鸡年(大年初四),现在跟大家拜年有点晚,算是拜晚年,祝大家晚年幸福. 这么快大伙都到了晚年了,Android贝塞尔曲线我也准备以一个大波浪来结束 ...

  8. HTML5 JS Canvas利用贝塞尔曲线绘制圆角矩形

    啥也不说,先上示例代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  9. 多视角探析贝塞尔曲线匀速化技术、实现及其应用

    概述 就在三年前,我于CSDN博客上发布了一篇题为<贝塞尔曲线运动n阶追踪方程的数学原理及其匀速化方法和应用>的博客文章,主要探讨的是贝塞尔曲线由一阶至n阶在数学层面的生成过程,以及匀速化 ...

最新文章

  1. zabbix监控快速搭建--云平台技术栈10
  2. 11.C++: cin、cin.get()、cin.getline()、getline()、gets()
  3. c 窗体程序 mysql_C\C++开发MySQL程序简介(下)
  4. freemarker的空值和默认值
  5. python浓缩(14)执行环境
  6. JSON和XML:它们如何比较?
  7. python井字棋如何判断输赢_井字棋判断输赢的两种方法
  8. CToolBarCtrl工具栏设置总结(转)
  9. getprivateprofilestring读不到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾
  10. [leetcode]70. 爬楼梯
  11. EJB JBOSS的安装
  12. Haskell分解质因数
  13. linux服务器之LVS、Nginx和HAProxy负载均衡器对比
  14. [书籍翻译]12周撰写期刊文章 学术出版成功指南——第 12周:文章投稿
  15. 2.心理学家-威廉.詹姆斯
  16. 5G+如何改变社会--读书有感
  17. selenium+java打开新标签页方法
  18. 最好用的 8 款 React Datepicker 时间日期选择器测评推荐
  19. Web.config配置错误页
  20. 手机内存卡照片删了怎么恢复

热门文章

  1. Flutter 中 pdf 文件阅读器
  2. 交叉编译出现提示 plugin needed to handle lto object
  3. python决策树可视化——graphviz报错
  4. Java毕设项目家校通管理系统(java+VUE+Mybatis+Maven+Mysql)
  5. 必应词典android版的一个bug
  6. 44Pin测试夹具封装
  7. 【单元测试】pytest:配置|断言|参数化|夹具|装饰器|插件
  8. 2022年养老产业市场分析
  9. 用python怎么赚钱-Python躺赚大法!月入1W外快不在话下!!
  10. 在美团的八年,学到了这些