public GameAndTrainingData RunGame(IBot bot1, IBot bot2) { const int drawLimit = 1000; TrainingData p1TrainingData = new TrainingData(); TrainingData p2TrainingData = new TrainingData(); GameData gameData = new GameData() { P1Name = bot1.Name, P2Name = bot2.Name }; GameDataController gameDataController = new GameDataController(gameData); bot1.NewGame(bot2.Name); bot2.NewGame(bot1.Name); while (gameData.currentDrawStreak < drawLimit) { Battle battle = new Battle(bot1.GetNextWeaponChoice(), bot2.GetNextWeaponChoice()); if (gameData.currentDrawStreak > 0) { p1TrainingData.AddInputs(gameData.currentDrawStreak, 1000 - gameData.P1WinCount, 1000 - gameData.P2WinCount, 100 - gameData.P1DynamiteUsed, 100 - gameData.P2DynamiteUsed); p2TrainingData.AddInputs(gameData.currentDrawStreak, 1000 - gameData.P2WinCount, 1000 - gameData.P1WinCount, 100 - gameData.P2DynamiteUsed, 100 - gameData.P1DynamiteUsed); p1TrainingData.AddOutputs(battle.P1Weapon); p2TrainingData.AddOutputs(battle.P2Weapon); } gameDataController.NewBattle(battle); bot1.HandleBattleResult(battle.P1BattleResult, battle.P1Weapon, battle.P2Weapon); bot2.HandleBattleResult(battle.P2BattleResult, battle.P2Weapon, battle.P1Weapon); if (gameData.victory != Victory.unknown) { return(new GameAndTrainingData { gameData = gameData, P1TrainingData = p1TrainingData, P2TrainingData = p2TrainingData }); } } gameData.victory = Victory.PlayersKeepDrawing; gameData.VictoryReason = "Players have drawed for over :" + (drawLimit * 10).ToString(); return(new GameAndTrainingData { gameData = gameData, P1TrainingData = p1TrainingData, P2TrainingData = p2TrainingData }); }
public Weapon GetNextWeaponChoice() { if (currentDrawStreak == 0) { return((Weapon)rand.Next(3)); } var probs = network.GetProbVector(currentDrawStreak, MyWinsLeft, EnemyWinsLeft, DynamiteLeft, EnemyDynamiteLeft); CollectedData.AddInputs(currentDrawStreak, MyWinsLeft, EnemyWinsLeft, DynamiteLeft, EnemyDynamiteLeft); CollectedData.Outputs.Add(new double[] { probs.dynProb, probs.watProb, probs.rpsProb }); probs = probs.Normalise(); var weaponChoice = rand.NextDouble(); if (weaponChoice < probs.watProb) { return(Weapon.WaterBallon); } if (weaponChoice < probs.watProb + probs.dynProb) { return(Weapon.Dynamite); } return((Weapon)rand.Next(3));// returns rock, paper, scissors randomly. }