五子棋的判断输赢规则 -- java编程(简单优化完整版)

时间:2023-03-09 15:04:58
五子棋的判断输赢规则 -- java编程(简单优化完整版)

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

  一、前言

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

   二、分析

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

五子棋的判断输赢规则 -- java编程(简单优化完整版)

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

五子棋的判断输赢规则 -- java编程(简单优化完整版)

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

五子棋的判断输赢规则 -- java编程(简单优化完整版)

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

  五子棋的判断输赢规则 -- java编程(简单优化完整版)

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

  三、代码

    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、转发请注原文地址,谢谢。