예제 #1
0
    private GameValue Solve(GameStateT state)
    {
        bool winFlag    = false;
        var  serialized = Game.SerializeState(state);

        if (Memory.ContainsKey(serialized))
        {
            return(Memory[serialized]);
        }
        var primitive = Game.PrimitiveValue(state);

        if (primitive != GameValue.Undecided)
        {
            Memory[serialized] = primitive;
            return(primitive);
        }
        foreach (var move in Game.GenerateMoves(state))
        {
            var newState = Game.DoMoveOnState(state, move);
            if (Solve(newState) == GameValue.Lose)
            {
                Memory[serialized] = GameValue.Win;
                winFlag            = true;
            }
        }
        if (!winFlag)
        {
            Memory[serialized] = GameValue.Lose;
        }
        return(winFlag ? GameValue.Win : GameValue.Lose);
    }
예제 #2
0
    public override AbstractGameMove GetMove(AbstractGameState gameState)
    {
        var moveList = Game.GenerateMoves(gameState);

        foreach (var move in moveList)
        {
            var newState = Game.DoMoveOnState(gameState, move);
            if (Memory[Game.SerializeState(newState)] == GameValue.Win)
            {
                return(move);
            }
        }
        return(moveList[0]);
    }
예제 #3
0
    private GameValue Solve(GameStateT state)
    {
        bool winFlag    = false;
        bool tieFlag    = false;
        var  serialized = Game.SerializeState(state);

        if (Memory.ContainsKey(serialized))
        {
            return(Memory[serialized]);
        }
        var primitive = Game.PrimitiveValue(state);

        if (primitive != GameValue.Undecided)
        {
            SetMemoryForAllSymmetry(primitive, Game.SerializeStateList(state));
            return(primitive);
        }
        var moveList = Game.GenerateMoves(state);

        foreach (var move in moveList)
        {
            var newState = Game.DoMoveOnState(state, move);
            var result   = Solve(newState);
            if (result == GameValue.Lose)
            {
                winFlag = true;
                //break;
            }
            else if (result == GameValue.Tie)
            {
                tieFlag = true;
            }
        }
        if (!winFlag)
        {
            if (tieFlag)
            {
                SetMemoryForAllSymmetry(GameValue.Tie, Game.SerializeStateList(state));
                return(GameValue.Tie);
            }
            else
            {
                SetMemoryForAllSymmetry(GameValue.Lose, Game.SerializeStateList(state));
                return(GameValue.Lose);
            }
        }
        SetMemoryForAllSymmetry(GameValue.Win, Game.SerializeStateList(state));
        return(GameValue.Win);
    }