五子棋判断输赢规则 --- 斜对角线方向上
一、左上右下方向上
1、分析图
2、代码
1 /**判断左上右下方向上是否有连续五颗相同颜色的棋子 2 * 全部遍历法 3 */ 4 int loop = 0; 5 boolean istrue = false; 6 for(loop = 0, posX = 1, posY = 12; loop < 21; loop++) { 7 if (posY > 1) { 8 posY --; 9 }else if (posX<15) { 10 posX++; 11 } 12 int bufferX = posX; 13 int bufferY = posY; 14 for(;posY <= 15 && posX <= 15; posX++, posY++) { 15 if (board[posX][posY] == color) { 16 count++; 17 if (count >= 5) { 18 istrue = true; 19 return true; 20 21 } 22 }else { 23 count = 0; 24 } 25 } 26 if (istrue) { 27 break; 28 }else { 29 posX = bufferX; 30 posY = bufferY; 31 } 32 }
二、左下右上方向上
1、分析图
2、代码
1 /**判断左下右上方向上是否有连续五颗相同颜色的棋子 2 * 全部遍历法 3 */ 4 for(loop = 0, posX=1, posY = 5;loop < 21; loop++) { 5 //用于遍历下一斜行 6 if (posY < 15) { 7 posY ++; 8 }else if (posX < 15) { 9 posX++; 10 } 11 //用于保存遍历开始的起始的值 12 int bufferX = posX; 13 int bufferY = posY; 14 //开始遍历每一斜行 15 for(;posY > 1 && posX <= 15; posX++, posY--) { 16 if (board[posX][posY] == color) { 17 count++; 18 if (count >= 5) { 19 istrue = true; 20 return true; //跳出内循环 21 22 } 23 }else { 24 count = 0; 25 } 26 } 27 //跳出循环 28 if (istrue) { 29 break; 30 }else { 31 posX = bufferX; 32 posY = bufferY; 33 } 34 }
后记:
本来想简单粗暴的直接po上网,但限制了字数发不了,容我多说几句,就当解说好了。
解说:
其实这个遍历规则是按照15*15的棋盘来做的,所以如果是不同型号的棋盘,使用时请改动上面的(loop<21)还有各个(跟15比较的数字)的设定。
为什么是数字21?因为斜线上长度小于5的斜线去除后,即15+15-1-(4+4)[小于5的斜线] == 21;
所以棋盘若为30*30,即为30+30-1-(4+4)=31;
因此,外部循环就是遍历斜线的条数。
其他的根据第二个代码去理解就行了。
反正这是我想到的最好理解的一种判断方法。(不喜勿喷,本人非计算机专业)
---------------------------------------------------------------------------------------------------------------
有空我再编辑优化版的。转发请注原文链接,谢谢!