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);
            }
        }
Exemplo n.º 2
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 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;
            }
        }