/// <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("}"); } } }
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); }