public static void GetCastleStatistics(this Units units, IStatusReporter statusReporter) { statusReporter.WriteLine($"общая сила замка {units.UnitsOperatoin.GetDamage()}"); statusReporter.WriteLine($"общая защита замка {units.UnitsOperatoin.GetProtectionLevel()}"); foreach (var unitGroup in units.GroupBy(unit => unit.GroupIndex)) { statusReporter.WriteLine($"группировка {unitGroup.First().GroupIndex}"); statusReporter.WriteLine($"общая сила {units.UnitsOperatoin.GetDamageGroup(unitGroup.First().GroupIndex)}"); statusReporter.WriteLine($"общая защита {units.UnitsOperatoin.GetGroupProtectionLevel(unitGroup.First().GroupIndex)}"); } }
/// <summary> /// Отображает содержание по группировкам (замок, группы) /// </summary> /// <param name="statusReporter"></param> public void ShowNamesGroup(IStatusReporter statusReporter) { statusReporter.WriteLine($"Замок {this.First().Home}"); statusReporter.WriteLine($"воинов {Count}"); var unitsGroups = this.ToLookup(unit => unit.GroupIndex); statusReporter.WriteLine($"Группировок в замке {unitsGroups.Count()}"); foreach (var unitGroup in unitsGroups.OrderBy(ug => ug.Key)) { statusReporter.WriteLine($"{unitGroup.Key}) {unitGroup.Select(unit => unit.ToString()).Aggregate((u,g) => $"{u}, {g}")}"); } }
/// <summary> /// Действие сцены /// </summary> public void Scene(IUserInput userInput, IStatusReporter statusReporter) { BattleActionHistory = new List <DoBattleAction>(); BattleActions = new Dictionary <UserCommand, DoBattleAction>() { { UserCommand.Attack, Attack }, { UserCommand.GiveUp, GiveUp }, { UserCommand.GetStat, GetStat }, { UserCommand.NoCommand, Boo } }; for ( ; ;) { foreach (var castle in Castles) { UserCommand userCommand = UserCommand.Attack; if (!IsAction) { return; } do { statusReporter.WriteLine($"ход героев замка {castle} ({Utils.EnumValueToString<CastleOwner>(castle.Owner)})"); if (castle.Owner == CastleOwner.User) { userCommand = userInput.GetUserCommand(statusReporter); statusReporter.Clear(); } /*пользователь будет делать ходы, пока функция не вернёт false*/ }while(BattleActions[userCommand](Units, Units, statusReporter)); } } }
/// <summary> /// Замок признаёт поражение /// </summary> /// <param name="attackGroup"></param> /// <param name="enemyGroup"></param> /// <param name="statusReporter"></param> /// <returns>возврат - повторить ход</returns> public bool GiveUp(Units attackGroup, Units enemyGroup, IStatusReporter statusReporter) { statusReporter.WriteLine($"Замок {attackGroup.First().Home} признаёт поражение."); foreach (var defeatUnit in Units.ByCastle(attackGroup.First().Home)) { defeatUnit.Life = 0; } return(false); }
/// <summary> /// Атака одной группы героев на другую /// </summary> /// <param name="attackGroup"></param> /// <param name="enemyGroup"></param> /// <param name="statusReporter"></param> /// <returns>возврат - повторить ход</returns> public bool Attack(Units attackGroup, Units enemyGroup, IStatusReporter statusReporter) { if (attackGroup.First().GroupIndex == enemyGroup.First().GroupIndex) { statusReporter.WriteLine("Нельзя нанести урон самому себе"); return(false); } var damage = attackGroup.UnitsOperatoin.GetDamage(); enemyGroup.ForEach((enemyGroupUnit) => { enemyGroupUnit.GetDamage(damage); }); /*Можно дать имена группам и транслировать их тут*/ /*можно поменять способ доступа к транслятору имён - как удобно*/ statusReporter.WriteLine($"герои группы {attackGroup.GroupNamesTranslator[attackGroup.First().GroupIndex]} нанесли урон героям группы {enemyGroup.GroupNamesTranslator[enemyGroup.First().GroupIndex]}."); if (enemyGroup.All(enemyUnit => false == enemyUnit.IsHeartBeat)) { statusReporter.WriteLine($"замок {enemyGroup.First().Home} теряет группу {enemyGroup.GroupNamesTranslator[enemyGroup.First().GroupIndex].Replace($"({enemyGroup.First().Home})", "").ClearSpaces()}"); } return(false); }
public UserCommand GetUserCommand(IStatusReporter statusReporter) { statusReporter.WriteLine("Введите комманду"); switch (Console.ReadKey().Key) { case ConsoleKey.A: return(UserCommand.Attack); case ConsoleKey.S: return(UserCommand.GetStat); case ConsoleKey.U: return(UserCommand.GiveUp); default: return(UserCommand.NoCommand); } }
/// <summary> /// Игра в поддавки /// </summary> /// <param name="attackGroup"></param> /// <param name="enemyGroup"></param> /// <param name="statusReporter"></param> /// <returns>возврат - повторить ход</returns> public bool Boo(Units attackGroup, Units enemyGroup, IStatusReporter statusReporter) { statusReporter.WriteLine($"замок {attackGroup.First().Home} пропускает ход."); return(false); }