五子棋的判断输赢规则代码 —— 完整优化版
一、前言
之前浏览过很多网上的方法,但总找不到比较完整,也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、转发请注原文地址,谢谢。