Java 判斷五子棋五子相連


#開始

  最近在忙着做一個基於酷Q的QQ機器人,想到了做游戲,第一個想到的霸氣點的游戲就是五子棋啊  ` _>`  

  因為沒有圖形界面的原因 所有核心就是判斷是否在棋盤上出現了五個棋子連在一起的情況 然后我想到了三種搜索方式 在這里展示出來

 

#效果

 

 

#判斷五子代碼

  

  1     public static int dudgeWin(int[][] qipan,int y,int x) //判斷是否五個棋子連在一起了 如果0是黑棋贏了 -1是白棋贏了 
  2     {
  3         int c = 0; //計數
  4         int qi = qipan[y][x];
  5         //上下
  6         for(int i= 0 ;i<11;i++) //在所在的列中暴力搜索
  7         {
  8             if(qi == qipan[i][x])
  9             {
 10                 c++;    //遇到相同的棋子就加一
 11                 if(c>=5)
 12                 {
 13                     return qi;
 14                 }
 15             }else
 16             {
 17                 c = 0;    //如果出現一個不同的 那就歸一
 18             }
 19         }
 20         
 21         c = 0; //下面開始左右搜索
 22         for(int i= 0 ;i<11;i++) //在所在的行中暴力搜索
 23         {
 24             if(qi == qipan[y][i])
 25             {
 26                 c++;    //遇到相同的棋子就加一
 27                 if(c>=5)
 28                 {
 29                     return qi;
 30                 }
 31             }else
 32             {
 33                 c = 0;    //如果出現一個不同的 那就歸一
 34             }
 35         }
 36         
 37         c = 0;     // 平行於主對角線
 38         if(x>y) //主對角線上
 39         {
 40             for(int i=0,j=x-y;i<11 && j<11;i++,j++)
 41             {
 42                 if(qipan[i][j] == qi)
 43                 {
 44                     c++;
 45                     if(c >= 5)
 46                     {
 47                         return qi;
 48                     }
 49                 }else
 50                 {
 51                     c = 0;
 52                 }
 53             }
 54         }else if(x<y) //主對角線下
 55         {
 56             for(int i=y-x,j=0;i<11 && j<11;i++,j++)
 57             {
 58                 if(qipan[i][j] == qi)
 59                 {
 60                     c++;
 61                     if(c >= 5)
 62                     {
 63                         return qi;
 64                     }
 65                 }else
 66                 {
 67                     c = 0;
 68                 }
 69             }
 70         }else //在主對角線上
 71         {
 72             for(int i=0,j=0;i<11 && j<11;i++,j++)
 73             {
 74                 if(qipan[i][j] == qi)
 75                 {
 76                     c++;
 77                     if(c >= 5)
 78                     {
 79                         return qi;
 80                     }
 81                 }else
 82                 {
 83                     c = 0;
 84                 }
 85             }
 86         }
 87         
 88         c = 0;     //平行於副對角線的搜索
 89         for(int i=y,j=x;i>=0 && j<11;i--,j++)
 90         {
 91             if(qipan[i-1][j+1] == qi)
 92             {
 93                 c++;
 94                 if(c >= 5)
 95                 {
 96                     return qi;
 97                 }
 98             }else
 99             {
100                 break;
101             }
102         }
103         
104         for(int i=y,j=x;i<11 && j>=0;i++,j--)
105         {
106             if(qipan[i][j] == qi)
107             {
108                 c++;
109                 if(c >= 5)
110                 {
111                     return qi;
112                 }
113             }else
114             {
115                 break;
116             }
117         }
118         return -2; //沒有勝利 那就是返回-2
119     }

  1. 水平和垂直方向都是搜索整列的方式 定義了個int c; 用來計數.

  2. 其實平行於對角線方向的判斷也和水平方向差不多 只不過是傾斜的判斷 依舊是搜索一整排 所以應該算作一種方法

  3. 平行於副對角線方向的這個搜索方法應該是效率最高的了吧 以副對角線為例  先依次判斷右上角方向上的棋子 出現空位或者與當前下載的棋子的類型不一樣的,那就結束判斷,開始判斷左下角方向上的棋子 遇到空位或者不同類型的棋子就退出計數

 

#備注

  1. 上面的代碼僅僅提供思路 切記不要直接復制到自己的代碼中 因為不一定合適

  2. 對完整的QQ機器人源碼感興趣的同學可以到這里查看源碼: https://github.com/LonelySinging/new_QQRobot.git

  3. 上面的代碼還不支持人機模式

  4. 有寶貴的建議請留言 謝謝


免責聲明!

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



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