五子棋的判断输赢规则代码 —— 完整优化版
一、前言
之前浏览过很多网上的方法,但总找不到比较完整,也get不到其他大神的思路,就直接画图分析,分析了之后就有了如下的代码,当然还想到更加优化的一种,只不过,还在完善中,后续再发上来分享。
二、分析
1、分析图水平方向,以传入的 X 坐标作为分割线,Y 坐标为偏移点左右遍历。
2、分析图垂直方向,以传入的 Y 坐标作为分割线,X 坐标为偏移点上下遍历。
3、分析图左上右下方向,以传入的 坐标点上的与对角线平行的线作为分割线,按箭头方向左右遍历。
4、分析图右下左上方向,以传入的 坐标点上的与对角线平行的线作为分割线,按箭头方向左右遍历。
请理解分析图在看代码-------------------------------------------------------------------------------------------------------------------------------
三、代码
1、方法说明:判断是否五子连线
2、参数:坐标:x,y;棋子颜色
3、返回类型:boolean
1 public boolean isWon2(int x, int y, char color) { 2 int count = 1; //本身一点为 1 3 int posX = 0; 4 int posY = 0; 5 /**判断水平方向上的胜负 6 /* 将水平方向以传入的点x上的y轴作为分隔线分为两部分 7 * 先向左边遍历,判断到的相同的连续的点 count++ 8 */ 9 for(posX = x - 1; posX > 0 ; posX--) { 10 if (board[posX][y] == color) { 11 count++; 12 if (count >= 5) { 13 return true; 14 } 15 }else { 16 break; 17 } 18 } //向右边遍历 19 for(posX = x + 1; posX <= 15; posX++) { 20 if (board[posX][y] == color) { 21 count++; 22 if (count >= 5) { 23 return true; 24 } 25 }else { 26 break; 27 } 28 } 29 /**判断垂直方向上的胜负 30 /* 将垂直方向以传入的点y上的x轴作为分隔线分为两部分 31 * 先向上遍历,判断到的相同的连续的点 count++ 32 */ 33 for(posY = y - 1; posY > 0; posY--) { 34 if (board[x][posY] == color) { 35 count++; 36 if (count >= 5) { 37 return true; 38 } 39 }else { 40 break; 41 } 42 }//向下遍历 43 for(posY = y + 1; posY <= 15; posY++) { 44 if (board[x][posY] == color) { 45 count++; 46 if (count >= 5) { 47 return true; 48 } 49 }else { 50 break; 51 } 52 } 53 /**判断左上右下方向上的胜负 54 * 以坐标点为分割线,将棋盘分为左右两个等腰三角形 55 * 先判断左边的 56 */ 57 for(posX = x - 1, posY = y - 1; posX > 0 && posY > 0; posX--, posY--) { 58 if (board[posX][posY] == color) { 59 count++; 60 if (count >= 5) { 61 count = 1; 62 return true; 63 } 64 }else { 65 break; 66 } 67 }//判断右边的 68 for(posX = x + 1, posY = y + 1; posX <= 15 && posY <= 15; posX++, posY++) { 69 if (board[posX][posY] == color) { 70 count++; 71 if (count >= 5) { 72 count = 1; 73 return true; 74 } 75 }else { 76 break; 77 } 78 } 79 /**判断右下左下方向上的胜负 80 * 以坐标点为分割线,将棋盘分为左右两个等腰三角形 81 * 先判断左边的 82 */ 83 for(posX = x + 1, posY = y - 1; posX <= 15 && posY > 0; posX++, posY--) { 84 if (board[posX][posY] == color) { 85 count++; 86 if (count >= 5) { 87 return true; 88 } 89 }else { 90 break; 91 } 92 }//判断右边的 93 for(posX = x - 1, posY = y + 1; posX > 0 && posY <= 15; posX--, posY++) { 94 if (board[posX][posY] == color) { 95 count++; 96 if (count >= 5) { 97 return true; 98 } 99 }else { 100 break; 101 } 102 } 103 return false; 104 }
四、后续
1、这个算法原理也是很简单的,不过比全部遍历法要优化很多,而且规范
2、后续有空我会把我想到的一个最优化的算法分析图放上来,判断的运行时间更短。
3、喜欢点个推荐呗,有错误还望各位指出,本人新手,谢谢!
4、转发请注原文地址,谢谢。