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();
     }
 }
Esempio n. 6
0
        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;
            }
        }