• 五子棋的判断输赢规则 -- java编程(简单优化完整版)


    五子棋的判断输赢规则代码 —— 完整优化版

     

      一、前言

        之前浏览过很多网上的方法,但总找不到比较完整,也get不到其他大神的思路,就直接画图分析,分析了之后就有了如下的代码,当然还想到更加优化的一种,只不过,还在完善中,后续再发上来分享。

       二、分析

        1、分析图水平方向,以传入的 X 坐标作为分割线,Y 坐标为偏移点左右遍历。

             2、分析图垂直方向,以传入的 Y 坐标作为分割线,X 坐标为偏移点上下遍历。

        3、分析图左上右下方向,以传入的 坐标点上的与对角线平行的线作为分割线,按箭头方向左右遍历。

          4、分析图右下左上方向,以传入的 坐标点上的与对角线平行的线作为分割线,按箭头方向左右遍历。

      

        请理解分析图在看代码-------------------------------------------------------------------------------------------------------------------------------

      三、代码

        1、方法说明:判断是否五子连线 

         2、参数:坐标:x,y;棋子颜色

         3、返回类型:boolean

      1 public boolean isWon2(int x, int y, char color) {
      2         int count = 1;      //本身一点为 1
      3         int posX = 0;    
      4         int posY = 0;
      5         /**判断水平方向上的胜负
      6         /* 将水平方向以传入的点x上的y轴作为分隔线分为两部分
      7          * 先向左边遍历,判断到的相同的连续的点  count++
      8          */
      9         for(posX = x - 1; posX > 0 ; posX--) {
     10             if (board[posX][y] == color) {
     11                 count++;
     12                 if (count >= 5) {
     13                     return true;
     14                 }
     15             }else {
     16                 break;
     17             }
     18         }    //向右边遍历
     19         for(posX = x + 1; posX <= 15; posX++) {
     20             if (board[posX][y] == color) {
     21                 count++;
     22                 if (count >= 5) {
     23                     return true;
     24                 }
     25             }else {
     26                 break;
     27             }
     28         }
     29         /**判断垂直方向上的胜负
     30         /* 将垂直方向以传入的点y上的x轴作为分隔线分为两部分
     31          * 先向上遍历,判断到的相同的连续的点  count++
     32          */
     33         for(posY = y - 1; posY > 0; posY--) {
     34             if (board[x][posY] == color) {
     35                 count++;
     36                 if (count >= 5) {
     37                     return true;
     38                 }
     39             }else {
     40                 break;
     41             }
     42         }//向下遍历
     43         for(posY = y + 1; posY <= 15; posY++) {
     44             if (board[x][posY] == color) {
     45                 count++;
     46                 if (count >= 5) {
     47                     return true;
     48                 }
     49             }else {
     50                 break;
     51             }
     52         }
     53         /**判断左上右下方向上的胜负
     54          * 以坐标点为分割线,将棋盘分为左右两个等腰三角形 
     55          * 先判断左边的
     56          */
     57         for(posX = x - 1, posY = y - 1; posX > 0 && posY > 0; posX--, posY--) {
     58             if (board[posX][posY] == color) {
     59                 count++;
     60                 if (count >= 5) {
     61                     count = 1;
     62                     return true;
     63                 }
     64             }else {
     65                 break;
     66             }
     67         }//判断右边的
     68         for(posX = x + 1, posY = y + 1; posX <= 15 && posY <= 15; posX++, posY++) {
     69             if (board[posX][posY] == color) {
     70                 count++;
     71                 if (count >= 5) {
     72                     count = 1;
     73                     return true;
     74                 }
     75             }else {
     76                 break;
     77             }
     78         }
     79         /**判断右下左下方向上的胜负
     80          * 以坐标点为分割线,将棋盘分为左右两个等腰三角形 
     81          * 先判断左边的
     82          */
     83         for(posX = x + 1, posY = y - 1; posX <= 15 && posY > 0; posX++, posY--) {
     84             if (board[posX][posY] == color) {
     85                 count++;
     86                 if (count >= 5) {
     87                     return true;
     88                 }
     89             }else {
     90                 break;
     91             }
     92         }//判断右边的
     93         for(posX = x - 1, posY = y + 1; posX > 0 && posY <= 15; posX--, posY++) {
     94             if (board[posX][posY] == color) {
     95                 count++;
     96                 if (count >= 5) {
     97                     return true;
     98                 }
     99             }else {
    100                 break;
    101             }
    102         }
    103         return false;
    104     }

      四、后续

        1、这个算法原理也是很简单的,不过比全部遍历法要优化很多,而且规范

        2、后续有空我会把我想到的一个最优化的算法分析图放上来,判断的运行时间更短。

        3、喜欢点个推荐呗,有错误还望各位指出,本人新手,谢谢!

        4、转发请注原文地址,谢谢。

  • 相关阅读:
    Lucene学习总结之二:Lucene的总体架构
    Lucene学习总结之三:Lucene的索引文件格式(1)
    android开发_SeekBar进度条
    android开发_mp3_player音乐播放器
    Lucene学习总结之一:全文检索的基本原理
    android开发_Intent_requestCode_resultCode页面之间的跳转
    android开发_Location位置定位
    .NET Remoting Basic(7)信道
    .NET Remoting Basic(1)概览
    .NET Remoting Basic(5)多服务器访问和程序集共享
  • 原文地址:https://www.cnblogs.com/lrj1009IRET/p/8496299.html
Copyright © 2020-2023  润新知