public virtual void Dispose() { if (TheGeneralGame != null) { TheGeneralGame.Dispose(); } }
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 void Dispose() { foreach (IGeneralGamePlayer generalGamePlayer in Players) { generalGamePlayer.Dispose(); } if (TheGeneralGame != null) { TheGeneralGame.Dispose(); } }
public List <Move> GetNextMoves(IEnumerable <Move> previousMoves) { var tasks = new List <Task <string> >(); var nextMoves = new List <Move>(); try { var roleTaskIds = new Dictionary <string, int?>(); foreach (var _player in Players) { var player = _player; Task <string> newTask; if (previousMoves.Any()) { var previousMovesAsString = String.Empty.JoinAdvanced("(", ") ", previousMoves.Select(n => n.TheMove).ToArray()); newTask = new Task <string>(() => player.PlayAsync(MatchId, "(" + previousMovesAsString + ")")); } else { newTask = new Task <string>(() => player.PlayAsync(MatchId, PlayerManagerProtocolConstants.NilReplyString)); } roleTaskIds.Add(player.Role, newTask.Id); tasks.Add(newTask); newTask.Start(); } Task.WaitAll(tasks.ToArray()); foreach (string _role in TheGeneralGame.FindRoles()) { var role = _role; var task = tasks.Where(n => n.Id == roleTaskIds[role]).First(); nextMoves.Add(new Move(role, task.Result)); } return(nextMoves); } catch (AggregateException ex) { ex.Handle(_ => false); } catch (Exception) { throw; } return(nextMoves); }
public override void Dispose() { try { if (TheGeneralGame != null) { TheGeneralGame.Dispose(); } } catch (Exception) { throw; } finally { base.Dispose(); } }
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 void StartAllPlayers() { var tasks = new List <Task <string> >(); try { var roles = TheGeneralGame.FindRoles().ToArray(); int roleCount = 0; foreach (var _player in Players) { var player = _player; string tmpRoleString = roles[roleCount++].ToString(); #if DO_SERIAL var foo = player.StartAsync(MatchId, tmpRoleString, TheGeneralGame.Description, StartClock, PlayClock); #else var newTask = new Task <string>(() => player.StartAsync(MatchId, tmpRoleString, TheGeneralGame.Description, StartClock, PlayClock)); tasks.Add(newTask); newTask.Start(); #endif } //Task.WaitAll(tasks.ToArray(), StartClock*1000); Task.WaitAll(tasks.ToArray()); } catch (AggregateException ex) { ex.Handle(_ => false); } catch (Exception) { throw; } }
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; } }