关于五子棋五子连珠判定问题
五子棋判断哪一方胜利
引入
五子棋大家都知道吧,不再写多余的描述,本文只介绍一个自己想出来的判断双方哪一方胜利的算法。
注意:本文算法均为本人自创,没有借鉴任何人的文章与帮助,如有雷同,纯属巧合!未经允许,禁止搬运文章。
下面所举例均使用Java,别的语言应该也可以做到
正文
把你想象成正在玩棋的人,怎么判断五颗棋子已经相连?一台机器又该怎么判断?
博主这是第四次写这篇文章了,已经很无奈,不多解释了…QWQ自动保存不知哪里。
索引
在一个没有胜利者的棋局下,只有放下一颗棋子才有可能产生胜利者,所以只要检索这一颗棋子周围是否达成五子连珠即可。
算法介绍
检索这个索引,看它周围有没有连成5颗或以上棋子,则产生胜者。那么总共有3种方式获胜
- 横排
- 竖排
- 斜排,又分为从左上到右下,从右上到左下
再引用一个棋子,首棋子,默认赋值为索引
算法
以横排为例子:
- 判断首棋子左侧是否有同色棋子,如果有,则首棋子赋值为其左侧的棋子,重复此句直至其左侧没有同色棋子。
- 计算重复次数,如果大于或等于5,则五子连珠,胜者产生,结束下面判断。
- 判断首棋子右侧是否有同色棋子(与上面所有语句衔接,不是单独的语句),如果有,则首棋子赋值为其右侧的棋子,重复此句,直至其右侧没有同色棋子。
- 判断重复次数是否大于或等于5,则五子连珠,否则无获胜者。
算法解释
下面左右1,2,3,4分别为上文的步骤
1,2是判断五子连珠最基本的方法,而1还有一个功能,将首棋子归位。
首棋子是某一端最靠两段某一边的棋子。因为从 一段相连同色棋子 中,以中间一颗棋子做索引,向两边判断太费事,还容易出错,所以1是将首棋子归位到横排最左侧,但如果向左已经有5颗了,就不用多余计算从左到右的颗数,执行2进行判断。3是用来判断从最左端到最右端共有几颗棋子,每重复一次就有几颗棋子,4同2,不解释。
演示代码Java
//判断哪一方胜利public Chess.Color judgeWinner(final Chess index) {Chess first;int winNum = 1;//五子连珠个数for(int i, j, k = 0;k <= 3;k++) {first = index;switch(k) {case 0 : i = 1;j = 0;break;case 1 :i = 0;j = 1;break;case 2 :i = -1;j = -1;break;case 3 :i = 1;j = 1;break;default :i = j = 0;//这一句没有任何用处,只是强迫症犯了}for(;;) {Chess t = new Chess(first.getX() - i, first.getY() - j, first.getColor());if(chesses.contains(t)) {first = t;if(++winNum >= ChessBoard.WIN_QUANTITY) return index.getColor();continue;}break;}winNum = 1;for(;;) {Chess t = new Chess(first.getX() + i, first.getY() + j, first.getColor());if(chesses.contains(t)) {first = t;if(++winNum >= ChessBoard.WIN_QUANTITY) return index.getColor();continue;}break;}winNum = 1;}//下文为博主测试所写,已经作废/*for(int i, j, k = 0;k <= 3;k++) {switch(k) {case 0 : i = -1;j = 0;break;case 1 :i = 0;j = -1;break;case 2 :i = -1;j = -1;break;case 3 :i = 1;j = 1;break;default :i = j = 0;}int winNum = 1;Chess first = index;boolean testtest;for(Chess ct = new Chess(first.getX() + i, first.getY() + j, first.getColor());testtest = chesses.contains(ct);) {winNum++;if(winNum >= WIN_QUANTITY) return ct.getColor();first = ct;ct = new Chess(ct.getX() - i, ct.getY() - j, ct.getColor());}winNum = 1;for(Chess ct = new Chess(first.getX() - i, first.getY() - j, first.getColor());chesses.contains(ct);) {winNum++;if(winNum >= WIN_QUANTITY) return ct.getColor();first = ct;ct = new Chess(ct.getX() + i, ct.getY() + j, ct.getColor());}//本文作者x0710}*/return null;}
contains()为List的方法,检查集合中是否包含此元素。
演示代码解释
刚刚说了,胜利的方式有3种,其中斜排又有2种。
刚刚介绍的算法只是针对于横排判断,还有其他3种,算法相同,上文switch就是针对这4种不同方式的。
判断左就是x - 1, y - 0,对不对
判断右就是x - (-1), y - 0,对不
判断上x - 0, y - (-1)
判断下x - 0, y - 1
(如果你数学没有学好…看不懂我写的,就写冗余代码即可)
从左上到右下x - 1, y - 1
从左下到右上x - (-1), y - (-1)
不就这几种吗,发现规律了吗?思考一下。
发现它们减的数有规律,那么设置一个变量进行加减不就好了,这就是我switch的用法!
关于五子棋五子连珠判定问题相关推荐
- 用Java写的简单五子棋游戏(原创五子连珠算法)
源码jar包(已安装jdk环境可直接运行) 下载地址:http://download.csdn.net/detail/eguid_1/9532912 五子连珠算法为自创算法,对于五子棋该算法性能足以. ...
- NowCoder最近爱上了五子棋,现在给你一个棋局,请你帮忙判断其中有没有五子连珠(超过五颗也算)。
NowCoder最近爱上了五子棋,现在给你一个棋局,请你帮忙判断其中有没有五子连珠(超过五颗也算). 解析: import java.util.*; public class Main {static ...
- 五子棋判断 五子连珠
题目链接:https://ac.nowcoder.com/acm/contest/331/B 题目大意: 思路:因为N太大.二维数组肯定是开不下.所以用map存就可以了. 当时就去写了二百多行的代码, ...
- java 连珠五子棋.现代职业_用Java写的简单五子棋游戏(原创五子连珠算法)
源码jar包(已安装jdk环境可直接运行) 五子连珠算法为自创算法,对于五子棋该算法性能足以. 该算法原理是这样的: 根据当前下子位置获取该位置上的4条直线8个方向的与当前棋子同色的棋子连珠数量,如果 ...
- c语言五子棋怎么判断五子连珠,五子棋 输赢判断算法
我们以一个二位数组表示五子棋,通过x.y坐标,表示一个棋子的位置. 1.基本原理: 五子棋判断输赢,其实就是一个二维坐标上,判断上下.左右.两个45度直线,是否有五个相同的直连棋子. 2.判断时机: ...
- c语言五子棋怎么判断五子连珠,分享一个 五子棋 输赢 的 判断逻辑。C#脚本
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 欢迎指出哪里需要改进.头有点晕,想了半天 实现的. 首先棋盘是由二维数组qipan[,]实现. 然后0是没有下子的状态.1是白子,2是黑子. 直接每次下完 ...
- [从零开始unity3D]“五子连珠”游戏实现,网格数组的创建(1)
大概是一周前,在知乎上偶然看见一位前辈提供的意见,他认为在一个立志于进入游戏行业发展的程序员在大学期间应该多动手,亲自去完成一些项目,在遇到坑,填补坑的过程中快速的提升技术水平.想来我虽然已经入职游戏 ...
- 计算机游戏五子连珠怎么出来,五子连珠游戏程序流程图
满意答案 五子连珠介绍:玩家只需依照五子棋的基础规则进行相应怪物击杀凑成五子连珠,便能获得丰厚的通关奖励.脑力与战斗力的紧密结合,相信能带给你不一样的五子棋心得.玩家每天可以在五子连珠活动开启时间内进 ...
- 计算机游戏五子连珠怎么出来,Flash游戏制作--五子连珠(一)
五子连珠,在民间俗称"五子棋",是一种流传很广的益智棋类游戏,游戏规则非常简单,适合各个年龄段的朋友玩,相信大家以前也一定玩过此游戏,传统的玩法是两玩家在围棋棋盘上进行比赛,这里玩 ...
最新文章
- vc下c语言网络编程,用VC编写C/S消息传送程序
- SQL with(unlock)与with(readpast) (转)
- 安卓APP_ Fragment(2)—— Activity与Fragment的通信
- 【数据库】数据库系统工程师(软考中级)——学习过程总结
- Javaweb重要知识点总结(六)常见的前端框架
- labwindows随机数生成c语言,LabWindows/CVI虚拟仪器设计技术基本控件使用之:回调函数...
- P1551 亲戚 (并查集)
- 三维触控测试软件,解读苹果3D touch三维触控技术
- Android Handler机制(一) 为什么设计Handler
- iconv的使用方法
- 网络摄像头100万至500万分辨率多少?传输带宽占用多少?存储空间是多少?
- 运行BOA报错 Could not open mime.types file, /etc/mime.types, for reading
- Swift4 2 UITextView基本用法
- Bitwarden报错:Cannot read properties of nul(reading ‘iterations‘)
- python毕业设计作品基于django框架个人博客系统毕设成品(6)开题答辩PPT
- ArcGIS自制符号库、兴趣点符号库、poi符号库
- html注释的爱情故事,才女李清照的爱情故事:才下眉头,却上心头
- android 输入法 确定按钮,Android项目:输入法软键盘显示/隐藏的监听和控制,InputMethodManager用法研究...
- 幼儿python培训
- 地理模块化施工的优点_河南省郑州市2018届高三下学期第三次模拟考试文综地理试题...
热门文章
- 新东方回应员工吐槽歌曲走红:我们初心不变 未来可期
- pytorch多GPU分布式训练代码编写
- Grocery Problem(翻译)
- 资源变现小程序开通微信官方小商店教程
- Exceptional C++ 读书笔记
- Android中Notification设置setSmallIcon、setLargeIcon无效的问题,仍显示安卓自带的机器人图标(小米10手机)
- PointNet系列代码复现详解(1)—PointNet分类部分
- 两个半月的业余时间用Flutter做了个app-技术篇
- Effects特效包之“上帝之光”Sun Shafts 光线特效
- 标 题: 又灌水-反(调试/跟踪/脱壳) 技术集锦