#開始
最近在忙着做一個基於酷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. 有寶貴的建議請留言 謝謝