五子棋判斷輸贏規則 --- 斜對角線方向上
一、左上右下方向上
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;
因此,外部循環就是遍歷斜線的條數。
其他的根據第二個代碼去理解就行了。
反正這是我想到的最好理解的一種判斷方法。(不喜勿噴,本人非計算機專業)
---------------------------------------------------------------------------------------------------------------
有空我再編輯優化版的。轉發請注原文鏈接,謝謝!