1. 程式人生 > >五子棋的判斷輸贏規則 -- java編程(簡單優化完整版)

五子棋的判斷輸贏規則 -- java編程(簡單優化完整版)

分享圖片 char pub class 完整版 image else http .com

五子棋的判斷輸贏規則代碼 —— 完整優化版

  一、前言

    之前瀏覽過很多網上的方法,但總找不到比較完整,也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、轉發請註原文地址,謝謝。

五子棋的判斷輸贏規則 -- java編程(簡單優化完整版)