コード例 #1
0
 public UnitMoveInfo(SimpleUnit unit, UnitMove unitMove, float distance)
 {
     this.unit     = unit;
     this.unitMove = unitMove;
     this.distance = distance;
 }
コード例 #2
0
ファイル: MiniMax.cs プロジェクト: Dionyzus/HoMM-Like
        int PerformMiniMax(GridState gridState, int depth, int alpha, int beta)
        {
            if (depth == 0 || gridState.IsGameOver())
            {
                return(gridState.Evaluate());
            }

            if (gridState.CurrentSimple.UnitSide == UnitSide.MAX_UNIT)
            {
                List <UnitMove> legalMoves = gridState.GetLegalMoves();
                gridState.EvaluateMoves(legalMoves);

                legalMoves = legalMoves.OrderByDescending(move => move.MoveEvaluation).ToList();

                for (int i = 0, len = legalMoves.Count; i < len; ++i)
                {
                    GridState newGridState = new GridState(gridState);
                    newGridState.MoveUnit(legalMoves[i]);

                    int evaluation = PerformMiniMax(newGridState, depth - 1, alpha, beta);

                    if (evaluation > alpha)
                    {
                        alpha = evaluation;
                        if (depth == depthSearch)
                        {
                            bestUnitMove = legalMoves[i];
                        }
                    }
                    if (beta <= alpha)
                    {
                        break;
                    }
                }
                return(alpha);
            }
            else
            {
                List <UnitMove> legalMoves = gridState.GetLegalMoves();
                gridState.EvaluateMoves(legalMoves);

                legalMoves = legalMoves.OrderByDescending(move => move.MoveEvaluation).ToList();

                for (int i = 0, len = legalMoves.Count; i < len; ++i)
                {
                    GridState newGridState = new GridState(gridState);
                    newGridState.MoveUnit(legalMoves[i]);

                    int evaluation = PerformMiniMax(newGridState, depth - 1, alpha, beta);

                    if (evaluation < beta)
                    {
                        beta = evaluation;
                    }
                    if (beta <= alpha)
                    {
                        break;
                    }
                }
                return(beta);
            }
        }