我们以一个二位数组表示五子棋,通过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

五子棋 输赢判断算法相关推荐

  1. c语言五子棋怎么判断五子连珠,五子棋 输赢判断算法

    我们以一个二位数组表示五子棋,通过x.y坐标,表示一个棋子的位置. 1.基本原理: 五子棋判断输赢,其实就是一个二维坐标上,判断上下.左右.两个45度直线,是否有五个相同的直连棋子. 2.判断时机: ...

  2. JAVA中计算五子棋平局的算法_输入五子棋棋盘判断输赢或平局—程序设计(C语言)...

    输入五子棋棋盘判断输赢或平局-程序设计(C语言) 输入五子棋棋盘判断输赢或平局-程序设计(C语言) 输入五子棋棋盘判断输赢或平局-程序设计(C语言) ??做这道题实在没有思路参考了这位作者的代码: h ...

  3. Java程序验证五子棋先手必胜_五子棋的判断输赢规则 -- java编程(简单优化完整版)...

    五子棋的判断输赢规则代码 -- 完整优化版 一.前言 之前浏览过很多网上的方法,但总找不到比较完整,也get不到其他大神的思路,就直接画图分析,分析了之后就有了如下的代码,当然还想到更加优化的一种,只 ...

  4. 用java实现简易五子棋小游戏,双人+输赢判断

    游戏开始截图 游戏进行中截图 游戏结束截图 小游戏代码如下 public class Qi{public static void main(String[] args) {Scanner sc = n ...

  5. 五子棋java判断平局_2020-10-03 Java初级项目——从零开始制作一个简易五子棋游戏...

    一.棋盘的绘制 使用JFrame容器制作五子棋的窗体 创建一个类--UI,如下: public class UI { private JFrame frame = new JFrame(); publ ...

  6. 组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战

    来源 | MyEncyclopedia 上一篇我们从原理层面解析了AlphaGo Zero如何改进MCTS算法,通过不断自我对弈,最终实现从零棋力开始训练直至能够打败任何高手.在本篇中,我们在已有的N ...

  7. C++magic number幻数的判断算法(附完整源码)

    C++magic number幻数的判断算法 C++magic number幻数的判断算法完整源码(定义,实现,main函数测试) C++magic number幻数的判断算法完整源码(定义,实现,m ...

  8. 【CV系列】基于直方图的白天夜晚场景判断算法

    DATE: 2019-7-6 简单的白天夜晚场景判断算法: 基于直方图,不够准确,容易出现误判,对于那些亮度很高的夜晚场景或者亮度很低的白天场景会出现误判. int day_night_estimat ...

  9. 素数判断算法(高效率)

    chuanbindeng 的 素数判断算法 关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法.看了以后相信 对大家一定有帮助. 正如大家都知道 ...

最新文章

  1. 人和人之间是需要沟通的
  2. 江西理工大学c语言程序设计,C语言程序设计
  3. WinForm下的键盘事件(KeyPress、KeyDown)及如何处理不响应键盘事件
  4. HDU 4609 FFT
  5. ORA-27101 shared memory realm does not exist 错误处理
  6. vlan跨交换机 udp广播_网络交换VLAN基础入门
  7. Quartz2D简单绘制之饼状图
  8. 知识付费的时代,我们如何应对:这8个干货,免费送给你!
  9. LNMP架构 源码安装nginx+mysql+php+memcache+论坛
  10. android 定时开关机,android 定时关机
  11. 基于医院信息管理系统案例的软件构造分析
  12. 你不知道的网络招聘与求职潜规则
  13. ❤ ❤html canvas面向对象的彩色小球❤ ❤
  14. NKOJ 5140 大吉大利 晚上吃鸡
  15. .net framework 官方下载地址
  16. Unity初级(十二)
  17. Algorithms and Data Structures I
  18. CocosCreator之微信小游戏的聊天/提示气泡制作
  19. SQLite sqlite_master
  20. linksys 打印软件_如何使用Linksys Smart Wi-Fi设置媒体和文件服务器

热门文章

  1. Linux微信1001无标题,微信个性签名1001无标题
  2. 360°详解去耦电容,真正的理解及在真正工程中的使用!
  3. 初认识Java调用SPSS统计软件
  4. 安装CMS一站式建站
  5. pyHook pyHook3 区别_英雄联盟手游和端游区别-lol手游手游和端游区别一览
  6. 基于springboot农产品交易平台的设计与实现
  7. 小谈Springcloud中的几个主流熔断器
  8. matlab 随机整数函数,MATLAB的简单随机生成函数
  9. ubuntu术后那些事儿
  10. React框架之对Dva和Umi的简单理解