#开始
最近在忙着做一个基于酷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. 有宝贵的建议请留言 谢谢