public override string PlayAsync(string id, string moves) { DebugAndTraceHelper.WriteTraceLine("\n\n\n*************************** moves ", Role); DebugAndTraceHelper.WriteTraceLine(moves, Role); var nextState = TheGeneralGame.ApplyMoves(moves, false, role: Role); DebugAndTraceHelper.WriteTraceLine(String.Format("({0}) Next state is {1}", Role, nextState), Role); //DebugAndTraceHelper.WriteTraceLine("*************************** after moves applied ", Role); //string clauseDump = this.GetPrologEngine().ListAllFacts(); //DebugAndTraceHelper.WriteTraceLine(clauseDump, Role); var nextMove = TheGeneralGame.FindRandomLegal(Role); if (nextMove != null) { DebugAndTraceHelper.WriteTraceLine(String.Format("({0}) Next move is {1}", Role, nextMove), Role); return(nextMove.TheMove); } else { return(String.Empty); } }
public override string PlayAsync(string id, string moves) { DebugAndTraceHelper.WriteTraceLine("\n\n\n*************************** moves ", Role); DebugAndTraceHelper.WriteTraceLine(moves, Role); var nextState = TheGeneralGame.ApplyMoves(moves, false, role: Role); DebugAndTraceHelper.WriteTraceLine(String.Format("({0}) Next state is {1}", Role, nextState), Role); //DebugAndTraceHelper.WriteTraceLine("*************************** after moves applied ", Role); //string clauseDump = this.GetPrologEngine().ListAllFacts(); //DebugAndTraceHelper.WriteTraceLine(clauseDump, Role); Move nextMove = null; var legalMovesWithEval = TheGeneralGame.FindLegalsWithEval(Role); int? maxEval = legalMovesWithEval.Max(n => n.Tag as int?); int? minEval = legalMovesWithEval.Min(n => n.Tag as int?); if (legalMovesWithEval.Any()) { if (maxEval != minEval) { nextMove = legalMovesWithEval.Where(n => n.Tag as int? == maxEval.Value).First(); } else { nextMove = TheGeneralGame.FindRandomLegal(Role); } } if (nextMove != null) { DebugAndTraceHelper.WriteTraceLine(String.Format("({0}) Next move is {1} with eval {2}", Role, nextMove, maxEval.Value), Role); return(nextMove.TheMove); } else { return(String.Empty); } }
public virtual string StopAsync(string id, string moves) { TheGeneralGame.ApplyMoves(moves, false, role: Role); return(PlayerManagerProtocolConstants.DoneReplyString); }
public bool Play() { IEnumerable <HornClause> satisfiedTerminalClauses; try { if (!CheckIfAllPlayersAreUpAndRunning()) { return(false); } var traceListener = DebugAndTraceHelper.GetListeners(DebugAndTraceHelper.StateChannelId).FirstOrDefault(); var ieWebBrowserListener = traceListener as IEWebBrowserListener; // show this in the game manager's web browser var initialStateAsXML = TheGeneralGame.GetStateAsCompleteXML(); DebugAndTraceHelper.WriteTraceLine(initialStateAsXML, DebugAndTraceHelper.StateChannelId); TurnRecord initialTurnRecord = new TurnRecord(); initialTurnRecord.IsInitialState = true; initialTurnRecord.GameState.GameStateAsXML = initialStateAsXML; //initialTurnRecord.GameState.GameStateAsHTML = ieWebBrowserListener == null ? "" : ieWebBrowserListener.ieWebBrowser.DocumentText; TurnRecords.Add(initialTurnRecord); IFormatter formatter = new BinaryFormatter(); var historyFileName = DebugAndTraceHelper.CustomLocation + DebugAndTraceHelper.BaseFileName + "_" + (DateTime.Now.ToShortDateString() + "_" + DateTime.Now.ToLongTimeString()).Replace(" ", "_").Replace(@"/", "-").Replace(":", "-") + ".his"; DebugAndTraceHelper.WriteTraceLine("Starting Players...", DebugAndTraceHelper.StatusStripChannelId); StartAllPlayers(); var prevMoves = new List <Move>(); DebugAndTraceHelper.WriteTraceLine("Checking for game termination...", DebugAndTraceHelper.StatusStripChannelId); bool gameHasTerminated = TheGeneralGame.FindTerminal(out satisfiedTerminalClauses); Move terminalMove = null; while (!gameHasTerminated) { DebugAndTraceHelper.WriteTraceLine("Waiting for next moves...", DebugAndTraceHelper.StatusStripChannelId); var nextMoves = GetNextMoves(prevMoves); RecordMoves(nextMoves); DebugAndTraceHelper.WriteTraceLine("**** moves ****", DebugAndTraceHelper.ManagerChannelId); foreach (Move nextMove in nextMoves) { DebugAndTraceHelper.WriteTraceLine(nextMove.Role + " makes move " + nextMove.TheMove, DebugAndTraceHelper.ManagerChannelId); } // ToDo: DebugAndTraceHelper.WriteTraceLine("Checking for game termination...", DebugAndTraceHelper.StatusStripChannelId); TheGeneralGame.ApplyMoves(nextMoves); if (TheGeneralGame.FindTerminal(out satisfiedTerminalClauses)) { gameHasTerminated = true; DebugAndTraceHelper.WriteTraceLine( String.Format("******** Game Ended for reason(s) {0} ********", String.Join(", ", satisfiedTerminalClauses)), DebugAndTraceHelper.ManagerChannelId); terminalMove = nextMoves.Where(n => !n.IsNoop()).FirstOrDefault(); } var stateAsXML = TheGeneralGame.GetStateAsCompleteXML(); DebugAndTraceHelper.WriteTraceLine(stateAsXML, DebugAndTraceHelper.StateChannelId); prevMoves = nextMoves; // serialize the history information TurnRecord thisTurnRecord = new TurnRecord(); thisTurnRecord.Turn = TheGeneralGame.CurrentTurn; thisTurnRecord.GameState.GameStateAsXML = stateAsXML; thisTurnRecord.GameState.GameStateFromProlog = TheGeneralGame.PrologEngine.ListAll(sortAlphabetically: false).Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).ToList(); thisTurnRecord.Moves = nextMoves; //thisTurnRecord.GameState.GameStateAsHTML = ieWebBrowserListener == null ? "" : ieWebBrowserListener.ieWebBrowser.DocumentText; thisTurnRecord.IsTerminalState = gameHasTerminated; TurnRecords.Add(thisTurnRecord); using (FileStream s = File.Create(historyFileName)) { formatter.Serialize(s, TurnRecords); } if (gameHasTerminated) { DebugAndTraceHelper.WriteTraceLine("Game has ended", DebugAndTraceHelper.StatusStripChannelId); } else { if (StartNextMoveEvent != null && (!AllowFreeRunningOfTurnsWithNoPlayerMoves || nextMoves.Where(n => !n.IsTheRandomRole() && !n.IsNoop()).Any())) { DebugAndTraceHelper.WriteTraceLine("Please click next turn button to go to next turn...", DebugAndTraceHelper.StatusStripChannelId); StartNextMoveEvent.WaitOne(); } else { if (MilliSecondsBetweenFreeRunningMoves >= 0) { if (AllowFreeRunningOfTurnsWithNoPlayerMoves && !nextMoves.Where(n => !n.IsTheRandomRole() && !n.IsNoop()).Any()) { Thread.Sleep(MilliSecondsBetweenFreeRunningMoves / 4); } else { Thread.Sleep(MilliSecondsBetweenFreeRunningMoves); } } } } } var scores = TheGeneralGame.FindScores(); DebugAndTraceHelper.WriteTraceLine("**** scores ****", DebugAndTraceHelper.ManagerChannelId); foreach (Score score in scores) { DebugAndTraceHelper.WriteTraceLine(score, DebugAndTraceHelper.ManagerChannelId); } StopAllPlayers(terminalMove); return(true); } catch (Exception ex) { throw; } }