Exemple #1
0
        private bool FindBestFivePointsAndFormAStackElement(int gobangColor, ref StackElement tempStackElement)//寻找最佳的五个点,并形成栈元素,若一个也找不到返回false
        {
            int[,] gobangPower = new int[15, 15];
            bool blnHaveFound;
            int  x, y, i, max;

            tempStackElement.pointsCount = 0;
            for (x = 0; x < 15; x++)
            {
                for (y = 0; y < 15; y++)
                {
                    gobangPower[x, y] = GetGobangPower(gobangColor, x, y);
                }
            }
            for (i = 0; i < 5; i++)
            {//求第i个最佳点
                max = 0;
                for (x = 0; x < 15; x++)
                {
                    for (y = 0; y < 15; y++)
                    {
                        if (max < gobangPower[x, y])
                        {
                            max = gobangPower[x, y];
                        }
                    }
                }
                for (x = 0; x < 15; x++)
                {
                    blnHaveFound = false;
                    for (y = 0; y < 15; y++)
                    {
                        if (max == gobangPower[x, y])
                        {
                            tempStackElement.bestFivePoints[i] = new Point(x, y);
                            tempStackElement.pointsCount++;
                            gobangPower[x, y] = -1;
                            blnHaveFound      = true;
                            break;
                        }
                    }
                    if (blnHaveFound)
                    {
                        break;
                    }
                }
            }
            if (tempStackElement.pointsCount == 0)
            {
                return(false);
            }
            else
            {
                tempStackElement.gobangColor = gobangColor;
                tempStackElement.pointNumber = 0;
                return(true);
            }
        }//寻找最佳的五个点,并形成栈元素,若一个也找不到返回false
Exemple #2
0
        private bool FindBestPoint(ref Point bestPoint)
        {
            Conclution   totalConclution = Conclution.lose;
            int          i, bestStepNumber = 0;
            StackElement tempStackElement = new StackElement();

            if (!FindBestFivePointsAndFormAStackElement(computerGobangColor, ref tempStackElement))
            {
                return(false);
            }
            backTrackStack.Push(tempStackElement);
            while (backTrackStack.Count > 0)//栈非空
            {
                tempStackElement = (StackElement)backTrackStack.Pop();
                if (tempStackElement.pointNumber < tempStackElement.pointsCount)
                {
                    //在虚拟棋盘上下一棋
                    virtualGobangBoard[tempStackElement.bestFivePoints[tempStackElement.pointNumber].X, tempStackElement.bestFivePoints[tempStackElement.pointNumber].Y] = tempStackElement.gobangColor;
                    if (Win(tempStackElement.gobangColor, tempStackElement.bestFivePoints[tempStackElement.pointNumber]))
                    {//赢棋,不在继续探测
                        tempStackElement.theConclution[tempStackElement.pointNumber] = Conclution.win;
                        tempStackElement.stepNumber[tempStackElement.pointNumber]    = backTrackStack.Count + 1;
                        //在虚拟棋盘上退一棋
                        virtualGobangBoard[tempStackElement.bestFivePoints[tempStackElement.pointNumber].X, tempStackElement.bestFivePoints[tempStackElement.pointNumber].Y] = background;
                        tempStackElement.pointNumber++;
                        backTrackStack.Push(tempStackElement);
                    }
                    else if (backTrackStack.Count == M - 1)
                    {//将此元素压入栈后栈满,不在继续探测
                        tempStackElement.theConclution[tempStackElement.pointNumber] = Conclution.equal;
                        tempStackElement.stepNumber[tempStackElement.pointNumber]    = M;
                        //在虚拟棋盘上退一棋
                        virtualGobangBoard[tempStackElement.bestFivePoints[tempStackElement.pointNumber].X, tempStackElement.bestFivePoints[tempStackElement.pointNumber].Y] = background;
                        tempStackElement.pointNumber++;
                        backTrackStack.Push(tempStackElement);
                    }
                    else
                    {//另一方继续下棋向下探测
                        tempStackElement.pointNumber++;
                        backTrackStack.Push(tempStackElement);
                        FindBestFivePointsAndFormAStackElement(-tempStackElement.gobangColor, ref tempStackElement);
                        backTrackStack.Push(tempStackElement);
                    }
                }    //end if
                else //栈顶元素无点或点均已试过
                {
                    if (tempStackElement.pointsCount == 0)//栈顶元素无点,且弹出后栈必非空
                    {
                        tempStackElement = (StackElement)backTrackStack.Pop();
                        tempStackElement.theConclution[tempStackElement.pointNumber - 1] = Conclution.win;
                        tempStackElement.stepNumber[tempStackElement.pointNumber - 1]    = backTrackStack.Count + 1;
                        //在虚拟棋盘上退一棋
                        virtualGobangBoard[tempStackElement.bestFivePoints[tempStackElement.pointNumber - 1].X, tempStackElement.bestFivePoints[tempStackElement.pointNumber - 1].Y] = background;
                        backTrackStack.Push(tempStackElement);
                    }
                    else//栈顶元素中点均已试过
                    {
                        //寻找栈顶元素中点的最好结局
                        totalConclution = tempStackElement.theConclution[0];
                        for (i = 0; i < tempStackElement.pointsCount; i++)
                        {
                            if (totalConclution < tempStackElement.theConclution[i])
                            {
                                totalConclution = tempStackElement.theConclution[i];
                            }
                        }
                        //寻找最佳步数
                        if (totalConclution == Conclution.win)
                        {
                            bestStepNumber = M + 2;
                            for (i = 0; i < tempStackElement.pointsCount; i++)
                            {
                                if (totalConclution == tempStackElement.theConclution[i] && bestStepNumber > tempStackElement.stepNumber[i])
                                {
                                    bestStepNumber = tempStackElement.stepNumber[i];
                                }
                            }
                        }
                        else//totalConclution==Conclution.equal或lose
                        {
                            bestStepNumber = 0;
                            for (i = 0; i < tempStackElement.pointsCount; i++)
                            {
                                if (totalConclution == tempStackElement.theConclution[i] && bestStepNumber < tempStackElement.stepNumber[i])
                                {
                                    bestStepNumber = tempStackElement.stepNumber[i];
                                }
                            }
                        }
                        if (backTrackStack.Count > 0)//栈非空
                        {
                            tempStackElement = (StackElement)backTrackStack.Pop();
                            tempStackElement.theConclution[tempStackElement.pointNumber - 1] = (Conclution)(0 - totalConclution);
                            tempStackElement.stepNumber[tempStackElement.pointNumber - 1]    = bestStepNumber;
                            //在虚拟棋盘上退一棋
                            virtualGobangBoard[tempStackElement.bestFivePoints[tempStackElement.pointNumber - 1].X, tempStackElement.bestFivePoints[tempStackElement.pointNumber - 1].Y] = background;
                            backTrackStack.Push(tempStackElement);
                        }
                    } //end else
                }     //end else
            }         //end while
            //栈已空
            for (i = 0; i < tempStackElement.pointsCount; i++)
            {
                if (totalConclution == tempStackElement.theConclution[i] && bestStepNumber == tempStackElement.stepNumber[i])
                {
                    break;
                }
            }
            bestPoint = tempStackElement.bestFivePoints[i];
            return(true);
        }