macOS swift下使用贝塞尔曲线制作五子棋盘(2)
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)相关推荐
- macOS swift下使用贝塞尔曲线制作五子棋盘(1)
Mac OS下的五子棋盘 制作棋盘 画棋盘线 画横线 画竖线 画棋子 棋盘最终效果 END 制作棋盘 首先需要制作一个简单的500x500的棋盘窗口,这里使用xib来布局 下一步创建棋盘类,关联xib ...
- 使用贝塞尔曲线制作网页手鼓猫
使用贝塞尔曲线制作网页手鼓猫 效果图 CSS代码 HTML代码 JS代码部分 总结 效果图 一只简易版的网页手鼓猫 CSS代码 <style>*{margin: 0;padding: 0; ...
- Unity之使用贝塞尔曲线制作图片轮播
一.效果图 1.效果1 2.效果2 二.贝塞尔曲线 关于贝塞尔曲线的学习大家可以看这个文章进行学习https://blog.csdn.net/qq_39162826/article/details/1 ...
- Linux下使用dd命令制作启动盘
date: 2018-09-25 10:39:41+00:00 原标题: Linux下使用dd命令制作启动盘 原链接: https://www.dreamoftime0.com/2018/09/25/ ...
- Unity 贝塞尔曲线制作迁徙图
效果图: 实现该效果图所需的知识点: 1.贝塞尔曲线 贝塞尔曲线是图形学中非常重要的参数曲线,在此不做详细介绍,这里我们用到的是二次方公式: using UnityEngine; using Syst ...
- 贝塞尔曲线开发的艺术
贝塞尔曲线开发的艺术 一句话概括贝塞尔曲线:将任意一条曲线转化为精确的数学公式. 很多绘图工具中的钢笔工具,就是典型的贝塞尔曲线的应用,这里的一个网站可以在线模拟钢笔工具的使用: http://bez ...
- android波浪动画简书,Android贝塞尔曲线————波浪效果(大波浪)
Hello大家好,很高兴又一次与大家见面,今天是农历丁酉鸡年(大年初四),现在跟大家拜年有点晚,算是拜晚年,祝大家晚年幸福. 这么快大伙都到了晚年了,Android贝塞尔曲线我也准备以一个大波浪来结束 ...
- HTML5 JS Canvas利用贝塞尔曲线绘制圆角矩形
啥也不说,先上示例代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 多视角探析贝塞尔曲线匀速化技术、实现及其应用
概述 就在三年前,我于CSDN博客上发布了一篇题为<贝塞尔曲线运动n阶追踪方程的数学原理及其匀速化方法和应用>的博客文章,主要探讨的是贝塞尔曲线由一阶至n阶在数学层面的生成过程,以及匀速化 ...
最新文章
- zabbix监控快速搭建--云平台技术栈10
- 11.C++: cin、cin.get()、cin.getline()、getline()、gets()
- c 窗体程序 mysql_C\C++开发MySQL程序简介(下)
- freemarker的空值和默认值
- python浓缩(14)执行环境
- JSON和XML:它们如何比较?
- python井字棋如何判断输赢_井字棋判断输赢的两种方法
- CToolBarCtrl工具栏设置总结(转)
- getprivateprofilestring读不到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾
- [leetcode]70. 爬楼梯
- EJB JBOSS的安装
- Haskell分解质因数
- linux服务器之LVS、Nginx和HAProxy负载均衡器对比
- [书籍翻译]12周撰写期刊文章 学术出版成功指南——第 12周:文章投稿
- 2.心理学家-威廉.詹姆斯
- 5G+如何改变社会--读书有感
- selenium+java打开新标签页方法
- 最好用的 8 款 React Datepicker 时间日期选择器测评推荐
- Web.config配置错误页
- 手机内存卡照片删了怎么恢复
热门文章
- Flutter 中 pdf 文件阅读器
- 交叉编译出现提示 plugin needed to handle lto object
- python决策树可视化——graphviz报错
- Java毕设项目家校通管理系统(java+VUE+Mybatis+Maven+Mysql)
- 必应词典android版的一个bug
- 44Pin测试夹具封装
- 【单元测试】pytest:配置|断言|参数化|夹具|装饰器|插件
- 2022年养老产业市场分析
- 用python怎么赚钱-Python躺赚大法!月入1W外快不在话下!!
- 在美团的八年,学到了这些