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