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
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); }