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

发表于:2018-3-05 09:46  作者:弹琴不谈情   来源:博客园

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: 软件开发 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、后续有空我会把我想到的一个最优化的算法分析图放上来,判断的运行时间更短。
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。


【大佬说】测试员跳槽时,如何高效地准备面试?

评 论

论坛新帖

顶部 底部


建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海瀛东律师事务所 张楠律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2019, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道