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

  一、前言

    之前浏览过很多网上的方法,但总找不到比较完整,也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. intellij-项目目录隐藏无用的文件和文件夹

    File-->Editor-->File Types

  2. cmd 指令

    dir  展示当前文件夹内的文件 mkdir 创建文件夹 c:  访问C盘 (d: f:) cd\ 返回主文件 cd .. 返回上一文件夹 cd test  打开文件夹 访问文件夹 rd 删除文件夹 ...

  3. Servlet--ServletInputStream类,ServletOutputStream类

    ServletInputStream类 定义 public abstract class ServletInputStream extends InputStream 这个类定义了一个用来读取客户端的 ...

  4. Android Studio库依赖问题

    Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > com.android. ...

  5. js按位运算符及其妙用

    大多数语言都提供了按位运算符,恰当的使用按位运算符有时候会取得的很好的效果. 在我看来按位运算符应该有7个: 1.& 按位与 &是二元运算符,它以特定的方式的方式组合操作数中对应的位, ...

  6. CURL处理POST、GET请求

    Curl是一个库,它允许你通过各种协议和各种不同的服务器进行连接和通讯 a.php <?php function curlRequest($url,$data=''){ $ch=curl_ini ...

  7. java 数组与集合(list)相互转化

    上代码 package com.core.array2collection; import java.util.ArrayList; import java.util.Arrays; import j ...

  8. Python CRM项目六

    自定义Django Admin的action 在Django Admin中,可以通过action来自定义一些操作,其中默认的action的功能是选中多条数据来进行删除操作 我们在king_admin中 ...

  9. ansible playbook实践(一)-基础环境安装

    1 介绍 Ansible 是一个系统自动化工具,用来做系统配管理,批量对远程主机执行操作指令. 2 实验环境 ip 角色 192.168.40.71 ansible管控端 192.168.40.72 ...

  10. Java锁概念基础

    Java中的锁不管是Lock还是synchronized都可以分为互斥锁和非互斥锁. 互斥锁只能被一个线程持有,其他线程只能等待锁的释放.synchronized,ReentrantLock,Read ...