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


 

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

 

  一、前言

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM