コード例 #1
0
ファイル: MiniMax.cs プロジェクト: say892/Reversi437
    public move miniMaxBetter(PieceColor [,] currentBoard, int depth, bool maximizingPlayer, int alpha, int beta, int i2, int j2)
    {
        //bool breaking = false;

        //print(depth);

        if (depth == 0 && maximizingPlayer)
        {
            move endMove;
            //endMove.value = boardPoints[i2, j2];
            endMove.value  = 0;
            endMove.i      = i2;
            endMove.j      = j2;
            endMove.points = 0;
            return(endMove);
        }
        if (depth == 0 && !maximizingPlayer)
        {
            move endMove;
            //endMove.value = boardPoints[i2, j2];
            endMove.value  = 0;
            endMove.i      = i2;
            endMove.j      = j2;
            endMove.points = 0;
            return(endMove);
        }

        //White Player
        if (maximizingPlayer)
        {
            move bestMove;
            bestMove.value  = -99999;
            bestMove.i      = -1;
            bestMove.j      = -1;
            bestMove.points = -1;
            for (int j = 0; j <= BOARD_SIZE; j++)
            {
                for (int i = 0; i <= BOARD_SIZE; i++)
                {
                    DirectionalPieces dPiece = gmScript.isValidMove(i, j, PieceColor.White, currentBoard);
                    if (dPiece.down || dPiece.left || dPiece.up || dPiece.right || dPiece.leftDown || dPiece.leftUp || dPiece.rightDown || dPiece.rightUp)
                    {
                        currentBoard[i, j] = PieceColor.White;
                        move currentMove = miniMaxBetter(currentBoard, depth - 1, false, alpha, beta, i, j);
                        currentMove.value  += boardPoints[i, j];
                        currentMove.points += dPiece.points;

                        if (currentMove.value > bestMove.value)
                        {
                            bestMove.value  = currentMove.value;
                            bestMove.i      = i;
                            bestMove.j      = j;
                            bestMove.points = currentMove.points;
                        }
                        else if (currentMove.value == bestMove.value)
                        {
                            if (currentMove.points > bestMove.points)
                            {
                                bestMove.value  = currentMove.value;
                                bestMove.i      = i;
                                bestMove.j      = j;
                                bestMove.points = currentMove.points;
                            }
                        }
                        else
                        {
                            //currentMove.value -= boardPoints[i, j];
                        }
                        //undo our moves as we get out of them
                        currentBoard[i, j] = PieceColor.Null;

                        //alpha beta pruning
                        alpha = Mathf.Max(alpha, bestMove.value);

                        if (beta <= alpha)
                        {
                            return(bestMove);
                            //breaking = true; //for double for loop
                            //break;
                        }
                    }
                }
                //if (breaking) break; //double for loop
            }
            return(bestMove);
        }        //end of if statement

        //player's turn
        else
        {
            move bestMove;
            bestMove.value  = 99999;
            bestMove.i      = -1;
            bestMove.j      = -1;
            bestMove.points = -1;
            for (int j = 0; j <= BOARD_SIZE; j++)
            {
                for (int i = 0; i <= BOARD_SIZE; i++)
                {
                    DirectionalPieces dPiece = gmScript.isValidMove(i, j, PieceColor.Black, currentBoard);
                    if (dPiece.down || dPiece.left || dPiece.up || dPiece.right || dPiece.leftDown || dPiece.leftUp || dPiece.rightDown || dPiece.rightUp)
                    {
                        currentBoard[i, j] = PieceColor.Black;
                        move currentMove = miniMaxBetter(currentBoard, depth - 1, true, alpha, beta, i, j);
                        currentMove.value  -= boardPoints[i, j];
                        currentMove.points -= dPiece.points;

                        if (currentMove.value < bestMove.value)
                        {
                            bestMove.value  = currentMove.value;
                            bestMove.i      = i;
                            bestMove.j      = j;
                            bestMove.points = currentMove.points;
                        }
                        else if (currentMove.value == bestMove.value)
                        {
                            if (currentMove.points < bestMove.points)
                            {
                                bestMove.value  = currentMove.value;
                                bestMove.i      = i;
                                bestMove.j      = j;
                                bestMove.points = currentMove.points;
                            }
                        }
                        else
                        {
                            //currentMove.value += boardPoints[i, j];
                        }
                        currentBoard[i, j] = PieceColor.Null;

                        //alpha beta pruning
                        beta = Mathf.Min(beta, bestMove.value);

                        if (beta <= alpha)
                        {
                            return(bestMove);
                            //breaking = true; //for double for loop
                            //break;
                        }
                    }
                }
                //if (breaking) break;
            }
            return(bestMove);
        } //end of else
    }     //end of minimaxbetter