一个连珠五子棋判断是否取胜的方法(二)

        /// <summary>
        /// 是否赢
        /// </summary>
        /// <param name="arrCol">棋盘中的所有棋子</param>
        /// <param name="p">要检索的棋子的位置</param>
        /// <param name="maxNum">返回连续棋子的最大个数</param>
        /// <returns>是否赢</returns>
        public virtual bool Win(Color[,] arrColor, Point p, out int maxNum)
        {
            maxNum = 0;//标识连续白子或者黑子的最大个数,连续五子取胜,连续六子及六子以上视为自杀
            bool bo = false;//标识是否取胜
            int lenX = arrColor.GetLength(0) - 1;//棋盘行边界索引
            int lenY = arrColor.GetLength(1) - 1;//棋盘列边界索引
            int num = 0;//临时标识变量
            Color color = arrColor[p.X, p.Y];//要检索的棋子的颜色


            for (int i = 0; i < 9; i++)//从左上角 到 右下角 的九子范围内检索连续的棋子  连续五子取胜、连续六子及六子以上视为自杀
            {
                //设定要检索的棋子的位置
                int x = p.X - 4 + i;
                int y = p.Y - 4 + i;

                this.TreateMaxNum(new Point(x, y), lenX, lenY, arrColor, color, ref maxNum, ref bo, ref num);//检索连续棋子的最大个数
            }
            num = 0;//归零

            for (int i = 0; i < 9; i++)//从 左下角 到 右上角 的九子范围内检索连续的棋子
            {
                int x = p.X + 4 - i;
                int y = p.Y - 4 + i;
                this.TreateMaxNum(new Point(x, y), lenX, lenY, arrColor, color, ref maxNum, ref bo, ref num);
            }
            num = 0;


            for (int i = 0; i < 9; i++)//从 左 到 右 的九子范围内检索连续的棋子
            {
                int x = p.X - 4 + i;
                int y = p.Y;
                this.TreateMaxNum(new Point(x, y), lenX, lenY, arrColor, color, ref maxNum, ref bo, ref num);
            }
            num = 0;

            for (int i = 0; i < 9; i++)//从 上 到 下 的九子范围内检索连续的棋子
            {
                int x = p.X;
                int y = p.Y - 4 + i;
                this.TreateMaxNum(new Point(x, y), lenX, lenY, arrColor, color, ref maxNum, ref bo, ref num);
            }
            return bo;
        }


        /// <summary>
        /// 检索连续的最大值
        /// 
        /// 这个方法的参数太多了,我记得有人说过方法的参数最好不要超过五个,请问各位前辈、这种情况该怎么处理呀?
        /// </summary>
        /// <param name="p">要检索的棋子的位置</param>
        /// <param name="lenX">棋盘的横向边界</param>
        /// <param name="lenY">棋盘的竖向边界</param>
        /// <param name="arrCol">棋盘所有棋子</param>
        /// <param name="col">要检索的棋子的颜色</param>
        /// <param name="maxNum">标识连续白子或者黑子的最大个数,连续五子取胜,连续六子及六子以上视为自杀</param>
        /// <param name="bo">是否取胜</param>
        /// <param name="num">中间变量</param>
        private void TreateMaxNum(Point p, int lenX, int lenY, Color[,] arrCol, Color col, ref int maxNum, ref bool bo, ref int num)
        {
            if (p.X < 0 || p.X > lenX || p.Y < 0 || p.Y > lenY)// 索引出界
                return;
            if (arrCol[p.X, p.Y] == col)//是否与要检索的棋子的颜色一致
            {
                num++;//颜色一致、连续棋子的个数加一
                if (num == 5)//标识连续五子胜
                {
                    if (num > maxNum)//(*****)
                    {
                        maxNum = num;//将连续棋子的个数赋值于maxNum
                    }
                    bo = true;//取胜
                }
                else if (num > 5)//标识六子及六子以上自杀
                {
                    if (num > maxNum)//(*****)
                    {
                        maxNum = num;//将连续棋子的个数赋值于maxNum
                    }
                    bo = false;//此时为自杀
                }
            }
            else//***//
            {
                num = 0;//归零
            }
        }

posted @ 2010-07-16 10:27  把爱延续  阅读(615)  评论(0编辑  收藏  举报