Java 判断五子棋五子相连

2018/06/16 11:00
阅读数 109

#开始

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

展开阅读全文
c++
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部