예제 #1
0
 public void DoBattleAction()
 {
     StatusReporter.WriteLine($"действие запущено");
     GameAction = new BattleAction(Castles, HeroUnits);
     GameAction.Scene(UserInput, StatusReporter);
     StatusReporter.WriteLine($"действие завершено");
 }
예제 #2
0
        /// <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();
        }
예제 #3
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();
        }