public void DoBattleAction() { StatusReporter.WriteLine($"действие запущено"); GameAction = new BattleAction(Castles, HeroUnits); GameAction.Scene(UserInput, StatusReporter); StatusReporter.WriteLine($"действие завершено"); }
/// <summary> /// Инициациализация игры /// </summary> public void Init() { Castles = new List <Castle> { new Castle("Оплот", new [] { "Кентавр", "Эльф", "Пегас" }), new Castle("Некрополис", new [] { "Скелет", "Зомби", "Вампир" }) }; HeroUnits = new Units(); StatusReporter.WriteLine("Пользователь должнен выбрать замок, за который он будет играть."); StatusReporter.WriteLine($"Варианты для выбора:"); Castles.ForEach((castle) => { StatusReporter.WriteLine(castle); }); GenerateUnits(); }
/// <summary> /// Инициализация героев замка /// </summary> public void GenerateUnits() { var names = Castles.SelectMany(castle => castle.GetAvailableUnits()).ToArray(); var randomUnits = new Random(); bool generationDone; do { HeroUnits.Clear(); for (int aUnit = 0; aUnit < randomUnits.Next(GameSettings.nMinUnitsCount, GameSettings.nMaxUnitsCount); aUnit++) { HeroUnits.Add(new HeroUnit(Castles, names[randomUnits.Next(0, names.Count())])); } generationDone = true; foreach (var unitsByCastle in HeroUnits.GroupBy(unit => unit.Home)) { var unitsByCastlesCount = unitsByCastle.Count(); if (unitsByCastlesCount < GameSettings.nMinPerGroup) { generationDone = false; /*неудачый random*/ StatusReporter.WriteLine($"В замке {unitsByCastle.Key} недобор героев. невозможно сформировать ни одного отряда."); do { StatusReporter.WriteLine($"переукомплектовать героев заново? (да/нет)"); var userDecision = ExpressionWorker.GetUserYesNoDecision(UserInput); if (userDecision == UserDecision.N) { StatusReporter.WriteLine($"игра завершена"); HeroUnits.Clear(); return; } if (userDecision == UserDecision.Y) { break; } } while (true); } if (generationDone == false) { break; } } } while (generationDone == false); HeroUnits.InitHeroParameters(); HeroUnits.FillGroups(GameSettings.nMinPerGroup, GameSettings.nMaxPerGroup); StatusReporter.WriteLine("Для битвы доступны следующие замки с укомплектованными героями."); foreach (var castle in Castles.OrderBy(castle => castle.Name)) { HeroUnits.ByCastle(castle).ShowNamesGroup(StatusReporter); } do { StatusReporter.Write($"Выберите замок ({Castles.Select(castle => castle.ToString()).Aggregate((c, v) => $"{c}/{v}")}) : "); var userCastleName = ExpressionWorker.GetUserCastleDecision(UserInput); var userCastle = Castles.Find(castle => castle.Equals(new Castle(userCastleName))); if (userCastle != null) { StatusReporter.WriteLine($"В Вашем расположении будут воевать герои замка {userCastle}"); userCastle.Owner = CastleOwner.User; break; } StatusReporter.WriteLine($"выбор не определён"); } while (true); DoBattleAction(); }