五子棋的判断输赢规则代码 —— 完整优化版

  一、前言

    之前浏览过很多网上的方法,但总找不到比较完整,也get不到其他大神的思路,就直接画图分析,分析了之后就有了如下的代码,当然还想到更加优化的一种,只不过,还在完善中,后续再发上来分享。

   二、分析

    1、分析图水平方向,以传入的 X 坐标作为分割线,Y 坐标为偏移点左右遍历。

         2、分析图垂直方向,以传入的 Y 坐标作为分割线,X 坐标为偏移点上下遍历。

    3、分析图左上右下方向,以传入的 坐标点上的与对角线平行的线作为分割线,按箭头方向左右遍历。

      4、分析图右下左上方向,以传入的 坐标点上的与对角线平行的线作为分割线,按箭头方向左右遍历。

  

    请理解分析图在看代码-------------------------------------------------------------------------------------------------------------------------------

  三、代码

    1、方法说明:判断是否五子连线

     2、参数:坐标:x,y;棋子颜色

     3、返回类型:boolean

 public boolean isWon2(int x, int y, char color) {
int count = 1; //本身一点为 1
int posX = 0;
int posY = 0;
/**判断水平方向上的胜负
/* 将水平方向以传入的点x上的y轴作为分隔线分为两部分
* 先向左边遍历,判断到的相同的连续的点 count++
*/
for(posX = x - 1; posX > 0 ; posX--) {
if (board[posX][y] == color) {
count++;
if (count >= 5) {
return true;
}
}else {
break;
}
} //向右边遍历
for(posX = x + 1; posX <= 15; posX++) {
if (board[posX][y] == color) {
count++;
if (count >= 5) {
return true;
}
}else {
break;
}
}
/**判断垂直方向上的胜负
/* 将垂直方向以传入的点y上的x轴作为分隔线分为两部分
* 先向上遍历,判断到的相同的连续的点 count++
*/
for(posY = y - 1; posY > 0; posY--) {
if (board[x][posY] == color) {
count++;
if (count >= 5) {
return true;
}
}else {
break;
}
}//向下遍历
for(posY = y + 1; posY <= 15; posY++) {
if (board[x][posY] == color) {
count++;
if (count >= 5) {
return true;
}
}else {
break;
}
}
/**判断左上右下方向上的胜负
* 以坐标点为分割线,将棋盘分为左右两个等腰三角形
* 先判断左边的
*/
for(posX = x - 1, posY = y - 1; posX > 0 && posY > 0; posX--, posY--) {
if (board[posX][posY] == color) {
count++;
if (count >= 5) {
count = 1;
return true;
}
}else {
break;
}
}//判断右边的
for(posX = x + 1, posY = y + 1; posX <= 15 && posY <= 15; posX++, posY++) {
if (board[posX][posY] == color) {
count++;
if (count >= 5) {
count = 1;
return true;
}
}else {
break;
}
}
/**判断右下左下方向上的胜负
* 以坐标点为分割线,将棋盘分为左右两个等腰三角形
* 先判断左边的
*/
for(posX = x + 1, posY = y - 1; posX <= 15 && posY > 0; posX++, posY--) {
if (board[posX][posY] == color) {
count++;
if (count >= 5) {
return true;
}
}else {
break;
}
}//判断右边的
for(posX = x - 1, posY = y + 1; posX > 0 && posY <= 15; posX--, posY++) {
if (board[posX][posY] == color) {
count++;
if (count >= 5) {
return true;
}
}else {
break;
}
}
return false;
}

  四、后续

    1、这个算法原理也是很简单的,不过比全部遍历法要优化很多,而且规范

    2、后续有空我会把我想到的一个最优化的算法分析图放上来,判断的运行时间更短。

    3、喜欢点个推荐呗,有错误还望各位指出,本人新手,谢谢!

    4、转发请注原文地址,谢谢。

五子棋的判断输赢规则 -- java编程(简单优化完整版)的更多相关文章

  1. 五子棋的斜对角方向上的规则 -- java编程(简单粗暴版)

    五子棋判断输赢规则 --- 斜对角线方向上 一.左上右下方向上 1.分析图 2.代码 /**判断左上右下方向上是否有连续五颗相同颜色的棋子 * 全部遍历法 */ int loop = 0; boole ...

  2. JAVA在线观看视频教程完整版

    今天给大家介绍一下JAVA在线观看视频教程完整版,我们知道Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语 ...

  3. 剑指offer】Java版代码(完整版)

    转自:剑指offer]Java版代码(完整版) 转自:[剑指offer] JAVA版题解(完整版)

  4. Java编程性能优化

    1尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资 ...

  5. Java编程性能优化一

    转自:http://my.oschina.net/xianggao/blog/77224 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著 ...

  6. Java编程性能优化一些事儿【转】

    原文出处: 陶邦仁 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1. 尽量在合适的场合使用单例 使用单例可以减轻加载 ...

  7. Liferay7 BPM门户开发之11: Activiti工作流程开发的一些统一规则和实现原理(完整版)

    注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: ident ...

  8. A011 Activiti工作流程开发的一些统一规则和实现原理(完整版)

    注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: ident ...

  9. 【剑指offer】Java版代码(完整版)

    原文地址:https://blog.csdn.net/baiye_xing/article/details/78428561 一.引言 <剑指offer>可谓是程序猿面试的神书了,在面试中 ...

随机推荐

  1. python装饰器的用法

    def logger(func):    def inner(*args, **kwargs): #1         print "Arguments were: %s, %s" ...

  2. JS正则表达式的基础用法

    RegExp(正则表达式)对象 正则表达式是一个描述字符模式的对象,可以处理更复杂的字符串.进行匹配替换. 常用的修饰符: i/m/g 使用方法: [声明方法一: new RegExp(value)] ...

  3. Calendar使用方法

    Calendar类的静态方法getInstance()可以初始化一个日历对象: Calendar now = Calendar.getInstance(); 可以使用下面三个方法把日历定到任何一个时间 ...

  4. IO (二)

    1 字符流的缓冲区 缓冲区的出现提高了对数据的读写效率. 对应的类: BufferedWriter BufferedReader 缓冲区要结合流才能使用. 在流的基础上对流的功能进行了增强. 2 Bu ...

  5. TP手册学习第三天

    命令行先在cmd进入项目目录,再执行命令 生成index模块的Blog控制器类库文件:php think make:controller index/Blog 如果仅仅生成空的控制器则可以使用:php ...

  6. jenkins构建自由风格项目[四]

    标签(linux): jenkins 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 构建一个php项目 创建一个新的项目 选择从git获取源码 配置gitlab ...

  7. 浏览器解析js的顺序

    浏览器在读取HTML文件的时候,只有当遇到

  8. jQuery选择器概述

    1.基本选择器:1) #id : 根据给定的id匹配一个元素:2) .class: 根据给定的类名匹配元素:3)element: 根据给定的元素名匹配元素:4)* : 匹配所有元素:5)selecto ...

  9. Effective Java 之-----精确的答案与double&float

    题目: 假设你口袋里有1$,看到货架上有一排美味的糖果,标价分别为0.10$,0.20$,0.30$...1$,你打算从标价为0.10$的糖果开始买起,每种买一颗,一直到不能支付货架上下一种价格的糖果 ...

  10. CF 741D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [dsu on tree 类似点分治]

    D. Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths CF741D 题意: 一棵有根树,边上有字母a~v,求每个子树中最长的边,满 ...