黑马程序员技术交流社区

标题: 练习编程,五子棋,判断赢得棋局的算法 [打印本页]

作者: wyasln    时间: 2015-11-25 20:51
标题: 练习编程,五子棋,判断赢得棋局的算法
练习编程,五子棋,写了个判断是否赢得棋局的算法,大家看看对不对,有什么改进的还没运行,不知道有错没,待会看结果

//每次落子后判断是否赢得棋局
        public boolean isWin(int x,int y,char cc)
        {
                //棋手输入的坐标为1-15,转换0-14
                int xPos = x - 1;
                int yPos = y - 1;

                //横向检测
                int x1 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘
                        if((xPos - i) < 0)
                        {
                                //结束左横向检测
                                break;
                        }
                        //统计相同棋子数
                        if(board[xPos - i][yPos] == cc)
                        {
                                x1++;
                        }
                }
                for(int i = 1;i < 5-x1 ;i++)
                {
                        //超出棋盘
                        if(xPos + i > 14)
                        {
                                //结束右横向检测
                                break;
                        }
                        if(board[xPos + i][yPos] == cc)
                        {
                                x1++;
                        }
                }
                if(x1 >= 4)
                {
                        return true;
                }

                //纵向检测
                int x2 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘
                        if((yPos - i) < 0)
                        {
                                //结束上纵向检测
                                break;
                        }
                        //统计相同棋子数
                        if(board[xPos][yPos - i] == cc)
                        {
                                x2++;
                        }
                }
                for(int i = 1;i < 5-x2 ;i++)
                {
                        //超出棋盘
                        if(yPos + i > 14)
                        {
                                //结束下纵向检测
                                break;
                        }
                        if(board[xPos][yPos + i] == cc)
                        {
                                x2++;
                        }
                }
                if(x2 >= 4)
                {
                        return true;
                }


                //斜下检测
                int x3 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘
                        if((xPos - i) < 0 || (yPos - i) < 0)
                        {
                                //结束上斜下向检测
                                break;
                        }
                        //统计相同棋子数
                        if(board[xPos - i][yPos - i] == cc)
                        {
                                x3++;
                        }
                }
                for(int i = 1;i < 5-x3;i++)
                {
                        //超出棋盘
                        if(xPos + i > 14 || (yPos + i) > 14)
                        {
                                //结束下斜下向检测
                                break;
                        }
                        if(board[xPos + i][yPos + i] == cc)
                        {
                                x3++;
                        }
                }
                if(x3 >= 4)
                {
                        return true;
                }


                //斜上检测
                int x4 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘
                        if((xPos + i) >14 || (yPos - i) < 0)
                        {
                                //结束上斜上向检测
                                break;
                        }
                        //统计相同棋子数
                        if(board[xPos + i][yPos - i] == cc)
                        {
                                x4++;
                        }
                }
                for(int i = 1;i < 5-x4;i++)
                {
                        //超出棋盘
                        if(xPos - i < 0 || (yPos + i) > 14)
                        {
                                //结束下斜下向检测
                                break;
                        }
                        if(board[xPos - i][yPos + i] == cc)
                        {
                                x4++;
                        }
                }
                if(x4 >= 4)
                {
                        return true;
                }
                return false;
        }




作者: wyasln    时间: 2015-11-25 23:43
晕,没人看啊,改到现在,终于完成了,能再cmd里正常下五子棋了
//每次落子后判断是否赢得棋局
        public boolean isWin(int x,int y,char cc)
        {
                //棋手输入的坐标为1-15,转换0-14
                int xCo = y - 1;
                int yCo = x - 1;
                //横向检测
                int x1 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘
                        if((yCo - i) < 0)
                        {
                                //结束左横向检测
                                break;
                        }
                        //统计相同棋子数
                        if(board[xCo][yCo - i] == BLACK)
                        {
                                x1++;
                        }
                }
                int j1 = x1;
                for(int i = 1;i < 5-j1 ;i++)
                {
                        //超出棋盘
                        if(yCo + i > 14)
                        {
                                //结束右横向检测
                                break;
                        }
                        if(board[xCo][yCo+i] == BLACK)
                        {
                                x1++;
                        }
                }
                if(x1 >= 4)
                {
                        return true;
                }

                //纵向检测
                int x2 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘
                        if((xCo - i) < 0)
                        {
                                //结束上纵向检测
                                break;
                        }
                        //统计相同棋子数
                        if(board[xCo - i][yCo] == cc)
                        {
                                x2++;
                        }
                }
                int j2 = x2;
                for(int i = 1;i < 5-j2 ;i++)
                {
                        //超出棋盘
                        if(xCo + i > 14)
                        {
                                //结束下纵向检测
                                break;
                        }
                        if(board[xCo + i][yCo] == cc)
                        {
                                x2++;
                        }
                }
                if(x2 >= 4)
                {
                        return true;
                }



                //斜下检测
                int x3 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘
                        if((xCo - i) < 0 || (yCo - i) < 0)
                        {
                                //结束上斜下向检测
                                break;
                        }
                        //统计相同棋子数
                        if(board[xCo - i][yCo - i] == cc)
                        {
                                x3++;
                        }
                }
                int j3 = x3;
                for(int i = 1;i < 5-j3;i++)
                {
                        //超出棋盘
                        if(xCo + i > 14 || (yCo + i) > 14)
                        {
                                //结束下斜下向检测
                                break;
                        }
                        if(board[xCo + i][yCo + i] == cc)
                        {
                                x3++;
                        }
                }
                if(x3 >= 4)
                {
                        return true;
                }


                //斜上检测
                int x4 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘
                        if((yCo + i) >14 || (xCo - i) < 0)
                        {
                                //结束上斜上向检测
                                break;
                        }
                        //统计相同棋子数
                        if(board[xCo - i][yCo + i] == cc)
                        {
                                x4++;
                        }
                }
                int j4 = x4;
                for(int i = 1;i < 5-j4;i++)
                {
                        //超出棋盘
                        if((yCo - i) < 0 || (xCo + i) > 14)
                        {
                                //结束下斜下向检测
                                break;
                        }
                        if(board[xCo + i][yCo - i] == cc)
                        {
                                x4++;
                        }
                }
                if(x4 >= 4)
                {
                        return true;
                }

                return false;
        }
作者: wyasln    时间: 2015-11-25 23:45
自己想的判断赢得棋局的算法,功能正常,不知道有没有更简便的算法
和计算机下的,每个计算机的落子写算法,完全随机
作者: wyasln    时间: 2015-11-26 09:32
论坛貌似不支持直接贴图片
程序运行截图贴不出来,时间有限,以后改改增加电脑的AI
作者: Camwly    时间: 2015-11-26 11:27
不错,加油
作者: wyasln    时间: 2015-11-26 19:41
还是有bug的比如● ●●●●
最后落第二子的时候判断赢了,虽然前面有空的,修改了算法
//每次落子后判断是否赢得棋局
        public boolean isWin(int x,int y,char cc)
        {
                //棋手输入的坐标为1-15,转换0-14
                int xCo = y - 1;
                int yCo = x - 1;
                //横向检测
                int x1 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘
                        if((yCo - i) < 0 || board[xCo][yCo - i] != cc)
                        {
                                //结束左横向检测
                                break;
                        }
                        x1++;
                }
                int j1 = x1;
                for(int i = 1;i < 5-j1 ;i++)
                {
                        //超出棋盘或者没棋子
                        if(yCo + i > 14 || board[xCo][yCo+i] != cc)
                        {
                                //结束右横向检测
                                break;
                        }               
                        x1++;
                }
                if(x1 >= 4)
                {
                        return true;
                }

                //纵向检测
                int x2 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘或者没棋子
                        if((xCo - i) < 0 || board[xCo - i][yCo] != cc)
                        {
                                //结束上纵向检测
                                break;
                        }
                        x2++;
                }
                int j2 = x2;
                for(int i = 1;i < 5-j2 ;i++)
                {
                        //超出棋盘或者没棋子
                        if(xCo + i > 14 || board[xCo + i][yCo] != cc)
                        {
                                //结束下纵向检测
                                break;
                        }
                        x2++;
                }
                if(x2 >= 4)
                {
                        return true;
                }

                //右斜检测
                int x3 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘或者没棋子
                        if((xCo - i) < 0 || (yCo - i) < 0 || board[xCo - i][yCo - i] != cc)
                        {
                                //结束上斜下向检测
                                break;
                        }
                    x3++;
                }
                int j3 = x3;
                for(int i = 1;i < 5-j3;i++)
                {
                        //超出棋盘或者没棋子
                        if(xCo + i > 14 || (yCo + i) > 14 || board[xCo + i][yCo + i] != cc)
                        {
                                //结束下斜下向检测
                                break;
                        }
                    x3++;
                }
                if(x3 >= 4)
                {
                        return true;
                }


                //左斜检测
                int x4 = 0;
                for(int i = 1;i < 5;i++)
                {
                        //超出棋盘或者没棋子
                        if((yCo + i) >14 || (xCo - i) < 0 || board[xCo - i][yCo + i] != cc)
                        {
                                //结束上斜上向检测
                                break;
                        }
                        x4++;
                }
                int j4 = x4;
                for(int i = 1;i < 5-j4;i++)
                {
                        //超出棋盘或者没棋子
                        if((yCo - i) < 0 || (xCo + i) > 14 || board[xCo + i][yCo - i] != cc)
                        {
                                //结束下斜下向检测
                                break;
                        }
                        x4++;
                }
                if(x4 >= 4)
                {
                        return true;
                }

                return false;
        }

作者: yuhongzhen    时间: 2015-11-26 19:59
继续努力吧,我还写不了这样的代码呢
作者: eddy1820    时间: 2015-11-26 20:03
不錯喔,感謝分享
作者: 超级宝贝乐爷    时间: 2015-11-26 20:26
辣么多 ,完全看不懂了!!!!!!!!!!!!!!!!!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2