五子棋 输赢判断算法
我们以一个二位数组表示五子棋,通过x、y坐标,表示一个棋子的位置。
1、基本原理:
五子棋判断输赢,其实就是一个二维坐标上,判断上下、左右、两个45度直线,是否有五个相同的直连棋子。
2、判断时机:
一般情况下,我们可以通过遍历棋盘的每个点,从这个点出发,判断是否有五连子。但是实际上,我们并不需要这样做,因为我们在落子时,肯定当前其他地方没有五连子。我们要做的,就是从当前落子的位置判断,4个方向上是否有五连子。
3、算法实现:
private boolean checkByStep(Point p, List<Point> array, int xdiff, int ydiff) {Point tmp = new Point(0, 0);int i;int cnt = 0;//向反方向找到颜色相同的点for (i = 1; i < 5; i++){tmp.x = p.x - xdiff * i;tmp.y = p.y - ydiff * i;if (!array.contains(tmp))break;cnt++;}Log.e(TAG, "checkByStep: reverse cnt = " + cnt);
// Log.e(TAG, "checkByStep: reverse i = " + i + " begin (" + tmp.x + ", " + tmp.y + ")" + " diff = (" + xdiff + ", " + ydiff + ")");int x = tmp.x;int y = tmp.y;for (i = 1; i < 5; i++){tmp.x = p.x + xdiff * i;tmp.y = p.y + ydiff * i;if (!array.contains(tmp))break;cnt++;}Log.e(TAG, "checkByStep: no reverse cnt = " + cnt);if (cnt >= 4)return true;return false;}private boolean checkWin(Point p, boolean isWhite) {Log.e(TAG, "checkWin: Now is x = " + p.x + " y = " + p.y + " node color = " + (isWhite ? "white" : "black"));List<Point> array;if (isWhite) {array = mWhiteArray;} else{array = mBlackArray;}for (Point pt : array) {Log.i(TAG, "checkWin: " + (isWhite ? "white" : "black") + " array:(" + pt.x +", "+ pt.y + ")");}if (checkByStep(p, array, 0, 1)) //上下直线判断return true;if (checkByStep(p, array, 1, 0)) //左右直线判断return true;if (checkByStep(p, array, 1, 1)) //右朝上直线判断return true;if (checkByStep(p, array, -1, 1)) //右朝下直线判断return true;Log.i(TAG, "checkWin: false");return false;}
4、代码解释:
1)首先,我们通过两个Point的ListArray存储黑白双方已经下了的棋子位置
2)在CheckWin方法中,我们传入了当前的落子位置,同时传入了当前是黑子还是白子
3)通过isWhite参数,我们取出当前黑或者白子的ListArray,然后调用checkByStep函数进行某一个直线方向的判断
4)checkByStep函数,实现了从某一个方向上进行的五连子判断,入参有xdiff和ydiff,表示了该直线的方向。如xdiff=0,ydiff=1,表示了一条垂直的直线方向;xdiff=1,ydiff=0,表示了一条水平的直线方向;xdiff=1,ydiff=1,表示了斜向上的直线方向;xdiff=-1、ydiff=1,表示了斜向下的直线方向
5)在checkByStep函数中,从当前节点,按照xdiff、ydiff,向两个方向进行了遍历,找到两个方向上的相连棋子个数,如果除当前棋子外,直线两个方向还有4个以上的相同棋子,则认为五子连珠,该棋子方获胜
项目源码:
https://github.com/ChenneyChan/wuziqi_andriod
五子棋 输赢判断算法相关推荐
- c语言五子棋怎么判断五子连珠,五子棋 输赢判断算法
我们以一个二位数组表示五子棋,通过x.y坐标,表示一个棋子的位置. 1.基本原理: 五子棋判断输赢,其实就是一个二维坐标上,判断上下.左右.两个45度直线,是否有五个相同的直连棋子. 2.判断时机: ...
- JAVA中计算五子棋平局的算法_输入五子棋棋盘判断输赢或平局—程序设计(C语言)...
输入五子棋棋盘判断输赢或平局-程序设计(C语言) 输入五子棋棋盘判断输赢或平局-程序设计(C语言) 输入五子棋棋盘判断输赢或平局-程序设计(C语言) ??做这道题实在没有思路参考了这位作者的代码: h ...
- Java程序验证五子棋先手必胜_五子棋的判断输赢规则 -- java编程(简单优化完整版)...
五子棋的判断输赢规则代码 -- 完整优化版 一.前言 之前浏览过很多网上的方法,但总找不到比较完整,也get不到其他大神的思路,就直接画图分析,分析了之后就有了如下的代码,当然还想到更加优化的一种,只 ...
- 用java实现简易五子棋小游戏,双人+输赢判断
游戏开始截图 游戏进行中截图 游戏结束截图 小游戏代码如下 public class Qi{public static void main(String[] args) {Scanner sc = n ...
- 五子棋java判断平局_2020-10-03 Java初级项目——从零开始制作一个简易五子棋游戏...
一.棋盘的绘制 使用JFrame容器制作五子棋的窗体 创建一个类--UI,如下: public class UI { private JFrame frame = new JFrame(); publ ...
- 组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战
来源 | MyEncyclopedia 上一篇我们从原理层面解析了AlphaGo Zero如何改进MCTS算法,通过不断自我对弈,最终实现从零棋力开始训练直至能够打败任何高手.在本篇中,我们在已有的N ...
- C++magic number幻数的判断算法(附完整源码)
C++magic number幻数的判断算法 C++magic number幻数的判断算法完整源码(定义,实现,main函数测试) C++magic number幻数的判断算法完整源码(定义,实现,m ...
- 【CV系列】基于直方图的白天夜晚场景判断算法
DATE: 2019-7-6 简单的白天夜晚场景判断算法: 基于直方图,不够准确,容易出现误判,对于那些亮度很高的夜晚场景或者亮度很低的白天场景会出现误判. int day_night_estimat ...
- 素数判断算法(高效率)
chuanbindeng 的 素数判断算法 关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法.看了以后相信 对大家一定有帮助. 正如大家都知道 ...
最新文章
- 人和人之间是需要沟通的
- 江西理工大学c语言程序设计,C语言程序设计
- WinForm下的键盘事件(KeyPress、KeyDown)及如何处理不响应键盘事件
- HDU 4609 FFT
- ORA-27101 shared memory realm does not exist 错误处理
- vlan跨交换机 udp广播_网络交换VLAN基础入门
- Quartz2D简单绘制之饼状图
- 知识付费的时代,我们如何应对:这8个干货,免费送给你!
- LNMP架构 源码安装nginx+mysql+php+memcache+论坛
- android 定时开关机,android 定时关机
- 基于医院信息管理系统案例的软件构造分析
- 你不知道的网络招聘与求职潜规则
- ❤ ❤html canvas面向对象的彩色小球❤ ❤
- NKOJ 5140 大吉大利 晚上吃鸡
- .net framework 官方下载地址
- Unity初级(十二)
- Algorithms and Data Structures I
- CocosCreator之微信小游戏的聊天/提示气泡制作
- SQLite sqlite_master
- linksys 打印软件_如何使用Linksys Smart Wi-Fi设置媒体和文件服务器