五子棋的判断输赢规则代码 完整优化版
一前言
之前浏览过很多网上的方法, 但总找不到比较完整, 也 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 喜欢点个推荐呗, 有错误还望各位指出, 本人新手, 谢谢!
来源: https://www.cnblogs.com/lrj1009IRET/p/8496299.html