示例#1
0
        public Move FindBestMove(Game game)
        {
            FSharpFunc <Game, bool> gameOver = FuncConvert.FromFunc <Game, bool>(GameOver);
            FSharpFunc <Game, FSharpFunc <Player, int> > heuristic = FuncConvert.FromFunc <Game, Player, int>(Heuristic);
            FSharpFunc <Game, Player> getTurn = FuncConvert.FromFunc <Game, Player>(GetTurn);
            FSharpFunc <Game, IEnumerable <Move> >      moveGenerator = FuncConvert.FromFunc <Game, IEnumerable <Move> >(MoveGenerator);
            FSharpFunc <Game, FSharpFunc <Move, Game> > applyMove     = FuncConvert.FromFunc <Game, Move, Game>(ApplyMove);

            OptimizedClosures.FSharpFunc <int, int, Game, Player, Tuple <FSharpOption <Move>, int> > mini =
                (OptimizedClosures.FSharpFunc <int, int, Game, Player, Tuple <FSharpOption <Move>, int> >)GameTheory.MiniMaxWithAlphaBetaPruningGenerator(heuristic,
                                                                                                                                                          getTurn, gameOver, moveGenerator, applyMove);

            NodeCounter.Reset();
            Tuple <FSharpOption <Move>, int> best = mini.Invoke(int.MinValue, int.MaxValue, game, game.Turn);
            Move move = best.Item1.Value;

            return(move);
        }
 public override TTerm Invoke(TAfterString afterLeftString, TAfterString afterRightString,
                              TTerm leftTerm, TTerm middleTerm, TTerm rightTerm)
 {
     return(Mapping.Invoke(leftTerm, middleTerm, rightTerm));
 }
示例#3
0
     protected Reply <TResult> ParseRestOfString(CharStream <TUserState> stream, char firstChar, ErrorMessageList error)
     {
 #if LOW_TRUST
         var sb = new StringBuilder(16);
         sb.Append(firstChar);
 #else
         _16CharBuffer buffer_; // produces more efficient code than stackalloc char[16]
         char *        buffer = (char *)(&buffer_);
         buffer[0] = firstChar;
         char[] chars = null;
         uint   n     = 1;
 #endif
         for (;;)
         {
             var tag    = stream.StateTag;
             var eReply = EndParser.Invoke(stream);
             if (eReply.Status == ReplyStatus.Error && tag == stream.StateTag)
             {
                 var reply = CharParser.Invoke(stream);
                 if (reply.Status == ReplyStatus.Ok)
                 {
                     if (tag == stream.StateTag)
                     {
                         throw Internal.ParserCombinatorInInfiniteLoopHelper.CreateException("manyCharsTill", stream);
                     }
                     error = reply.Error;
             #if LOW_TRUST
                     sb.Append(reply.Result);
             #else
                     var i = n % 16;
                     if (i != 0)
                     {
                         buffer[i] = reply.Result;
                         ++n;
                     }
                     else
                     {
                         if (chars == null)
                         {
                             chars = new char[32];
                         }
                         else if (n == chars.Length)
                         {
                             var newChars = new char[2 * chars.Length];
                             Array.Copy(chars, newChars, chars.Length);
                             chars = newChars;
                         }
                         for (i = 0; i < 16; ++i)
                         {
                             chars[n - 16 + i] = buffer[i];
                         }
                         buffer[0] = reply.Result;
                         ++n;
                     }
             #endif
                 }
                 else
                 {
                     error = tag == stream.StateTag
                         ? ErrorMessageList.Merge(ErrorMessageList.Merge(error, eReply.Error), reply.Error)
                         : reply.Error;
                     return(new Reply <TResult> {
                         Status = reply.Status, Error = error
                     });
                 }
             }
             else if (eReply.Status == ReplyStatus.Ok)
             {
                 string str;
         #if LOW_TRUST
                 str = sb.ToString();
         #else
                 if (n <= 16)
                 {
                     str = new String(buffer, 0, (int)n);
                 }
                 else
                 {
                     for (uint i = (n - 1) & 0x7ffffff0; i < n; ++i)
                     {
                         chars[i] = buffer[i % 16];
                     }
                     str = new string(chars, 0, (int)n);
                 }
         #endif
                 var result = Mapping.Invoke(str, eReply.Result);
                 error = tag == stream.StateTag
                     ? ErrorMessageList.Merge(error, eReply.Error)
                     : eReply.Error;
                 return(new Reply <TResult> {
                     Status = ReplyStatus.Ok, Result = result, Error = error
                 });
             }
             else
             {
                 error = tag == stream.StateTag
                     ? ErrorMessageList.Merge(error, eReply.Error)
                     : eReply.Error;
                 return(new Reply <TResult> {
                     Status = eReply.Status, Error = error
                 });
             }
         }
     }