示例#1
0
        /// <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();
        }