• 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. 有宝贵的建议请留言 谢谢

  • 相关阅读:
    数据结构化与保存
    使用正则表达式,取得点击次数,函数抽离
    爬取校园新闻首页的新闻
    网络爬虫基础练习
    词频统计
    试题----编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个
    试题---求出现重现次数最多的字母,如有多个重复的则都求出来
    试题----为什么Java的string类要设成immutable(不可变的)
    面试题---题目
    复制文件夹中所有内容到指定位置
  • 原文地址:https://www.cnblogs.com/cjdty/p/9190097.html
Copyright © 2020-2023  润新知