zoukankan      html  css  js  c++  java
  • 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. 有宝贵的建议请留言 谢谢

  • 相关阅读:
    错误总结Mapper扫描不到
    Spring项目出现--Error:java: Compilation failed: internal java compiler error
    mybatis-plus自动填充时间
    自定义异常类
    Swagger配置类
    JwtUtils工具类
    MD5加密工具类
    SpringBoot通用返回JSON数据封装类
    使用Swagger测试使传入json数据时出现JSON parse error: Unexpected character (‘}‘ (code 125)): was expecting double
    org.springframework.context.ApplicationContextException: Unable to start web server; nested exceptio
  • 原文地址:https://www.cnblogs.com/cjdty/p/9190097.html
Copyright © 2011-2022 走看看