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

  一、前言

    之前浏览过很多网上的方法,但总找不到比较完整,也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. Django_xadmin后台全局设置

    如何使用xadmin主题功能? 在ursersa app下的adminx.py文件下,注册一个基础设置类BaseSetting,并注册 import xadminfrom xadmin import ...

  2. java.lang.ClassNotFoundException: com.radiadesign.catalina.session.RedisSessionHandlerValve

    org.apache.tomcat.util.digester.Digester.startElement Begin event threw exception java.lang.ClassNot ...

  3. Linxu指令--crond

    前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个 ...

  4. maven依赖问题

    我的一个maven项目A依赖于我的另一个maven项目B,但是maven dependencies中显示的是文件.如下图: 而且项目A部署的时候,部署到tomcat容器的时候也是直接部署的B的编译后的 ...

  5. 远程服务调用(RMI)

    模块概念的引入,是本框架的一大优势,而跨JVM的远程服务调用则是另一个最有价值的功能. <本地服务调用>一文中我们讲解了跨模块间的服务调用可以是这样的: ServiceHelper.inv ...

  6. Spark 读写hive 表

    spark 读写hive表主要是通过sparkssSession 读表的时候,很简单,直接像写sql一样sparkSession.sql("select * from xx") 就 ...

  7. dfs 与 dijkstra 总结

    Dijkstra: //寻求加权图起始点到各个节点的最短路径 for i <- 1:n do distance[i] <- INF; distance[0] <- 0;//起始节点距 ...

  8. spring之setter注入

    setter注入分为2种 第一:普通属性注入 <bean id="userAction" class="com.xx.action.UserAction" ...

  9. jQuery选择器概述

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

  10. IE7、IE8不兼容js trim函数的解决方法

    IE兼容,有时候让人头疼,但又不得不去解决. 先看看一下代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xh ...