示例#1
0
        /// <summary>
        /// Writes game information to a file including the game board and moves
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="gameInfo"></param>
        public static void Write(this HearthNode state, string filename, bool create = false, bool board = false, bool move = false)
        {
            string newfile = filename;
            string dir     = @"C:\Users\hgore\SabberStone\core-extensions\SabberStoneCoreAi\src\Meta\";
            string path    = dir + newfile + ".json";
            int    count   = 1;

            while (File.Exists(path) && File.GetLastWriteTime(path) + TimeSpan.FromMinutes(3) < DateTime.Now)
            {
                newfile += count++.ToString();
                path     = dir + newfile + ".json";
            }

            using (var sw = new StreamWriter(File.Open(path, FileMode.Append)))
            {
                if (create)
                {
                    sw.Write(state.PrintCreateGame());
                }

                else if (board)
                {
                    sw.Write(state.PrintBoard());
                }

                else if (move)
                {
                    sw.Write(state.PrintAction(true));
                }

                if (state.Game.State == State.COMPLETE)
                {
                    sw.WriteLine("}");
                }
            }
        }
示例#2
0
        public bool PlayGame(int gameNumber, bool addToGameStats = true)
        {
            var _masterGame = new Game(_gameConfig, _setupHeroes);

            _player1.InitializeGame();
            _player2.InitializeGame();

            _masterGame.StartGame();

            var state = HearthNode.CreateRoot(_masterGame);

            AbstractAgent _currentAgent;

            Stopwatch currentStopwatch;

            Stopwatch[] watches = new[] { new Stopwatch(), new Stopwatch() };

            //var state = new HearthNode(_masterRoot, null, _masterGame, null);

            //List<int> gameStateVector = state.Vector();
            //string dt = DateTime.Now.ToString("MM_dd_yyyy HH_mm");
            //int turn = 1;
            //int actionNum = 1;
            var heroClasses = new CardClass[2] {
                state.Game.Player1.HeroClass, state.Game.Player2.HeroClass
            };
            string filename = $"{state.Game.Player1.Deck.Name}_vs_{state.Game.Player2.Deck.Name}.csv";

            try
            {
                while (state.Game.State != State.COMPLETE && state.Game.State != State.INVALID)
                {
                    state.Game.WriteCSV((gameNumber + 1).ToString(), heroClasses, filename);

                    if (_debugMode == "")
                    {
                        Console.WriteLine(state.PrintBoard());
                    }

                    //else if (_debugMode == "python")
                    //	Console.WriteLine(state.PrintBoard());


                    _currentAgent = state.Game.CurrentPlayer == state.Game.Player1 ? _player1 : _player2;
                    //perspective = state.Game.CurrentPlayer == state.Game.Player1 ? 1 : 2;
                    currentStopwatch = state.Game.CurrentPlayer == state.Game.Player1 ? watches[0] : watches[1];

                    currentStopwatch.Start();
                    HearthNode moveNode = _currentAgent.PlayTurn(state);
                    //moveNode.Game.WriteCSV(dt, heroClasses, filename);

                    //actionNum = moveNode.Game.Turn == turn ? actionNum + 1 : 1;

                    //if (moveNode.Action.PlayerTaskType == PlayerTaskType.PLAY_CARD)
                    //	gameStats.AddCard(state.Game.CurrentPlayer.PlayerId);

                    if (_debugMode != null)
                    {
                        Console.Write(moveNode.PrintAction());
                    }

                    state = new HearthNode(null, moveNode.Game, moveNode.Action);
                    //turn = state.Game.Turn;
                    //gameStateVector = state.Vector();
                    currentStopwatch.Stop();

                    state.Game.CurrentPlayer.Game   = state.Game;
                    state.Game.CurrentOpponent.Game = state.Game;

                    ///if (_debug)
                    ///{
                    ///	Console.WriteLine(playerMove);
                    ///	if (playerMove.PlayerTaskType == PlayerTaskType.PLAY_CARD)
                    ///		Console.WriteLine($"\n{currentPlayer.Hero.Card.Name} plays {playerMove.Source.Card.Name}\n");
                    ///
                    ///	if (playerMove.PlayerTaskType == PlayerTaskType.HERO_ATTACK)
                    ///		Console.WriteLine($"\n{currentPlayer.Hero.Card.Name} attacks {currentPlayer.Opponent.Hero.Card.Name}\n");
                    ///
                    ///	if (playerMove.PlayerTaskType == PlayerTaskType.MINION_ATTACK)
                    ///		Console.WriteLine($"\n{playerMove.Source.Card.Name} attacks {playerMove.Target.Card.Name}\n");
                    ///
                    ///	if (playerMove.PlayerTaskType == PlayerTaskType.HERO_POWER)
                    ///		Console.WriteLine($"\n{currentPlayer.Hero.Card.Name} used {currentPlayer.Hero.HeroPower.Card.Name}");
                    ///}
                    ///state.Process(playerMove);
                    ///state = state.Children.Find(s => s._action == playerMove).GetChild(playerMove);
                }
            }

            catch (Exception e)
            //Current Player loses if he throws an exception
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
                state.Game.State = State.COMPLETE;
                state.Game.CurrentPlayer.PlayState   = PlayState.CONCEDED;
                state.Game.CurrentOpponent.PlayState = PlayState.WON;

                //if (addToGameStats && _masterRoot.Game.State != State.INVALID)
                //	gameStats.registerException(_masterRoot.Game, e);
            }

            if (state.Game.State == State.INVALID)
            {
                return(false);
            }

            //if (addToGameStats)
            //{
            //	gameStats.addGame(state.Game, watches);
            //}

            string winner = state.Game.Player1.PlayState == PlayState.WON ?
                            state.Game.Player1.Hero.Card.Name : state.Game.Player2.Hero.Card.Name;

            Console.WriteLine($"{winner} won!");

            int winnerId = state.Game.Player1.PlayState == PlayState.WON ?
                           state.Game.Player1.PlayerId : state.Game.Player2.PlayerId;

            state.Game.WriteCSV((gameNumber + 1).ToString(), heroClasses, filename, winner: winnerId);

            _player1.FinalizeGame();
            _player2.FinalizeGame();

            return(true);
        }