码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-03-03 14:03:30      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:font   ++   play   div   lock   完整   规则   nbsp   bsp   

 

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

 

  一、前言

    之前浏览过很多网上的方法,但总找不到比较完整,也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、转发请注原文地址,谢谢。

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

标签:font   ++   play   div   lock   完整   规则   nbsp   bsp   

原文地址:https://www.cnblogs.com/lrj1009IRET/p/8496299.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!