public void WillDestroyTheShip()
        {
            var scenario = new BattleScenario
            {
                Plain = new Plain {
                    Xsize = 10, Ysize = 10
                },
                Battleships = new List <Battleships.StateManager.Models.Battleship>
                {
                    new Battleships.StateManager.Models.Battleship {
                        Start = new Position(5, 0), End = new Position(5, 9)
                    }
                },
                ShotPoints = new List <Position>
                {
                    new Position(5, 0),
                    new Position(5, 1),
                    new Position(5, 2),
                    new Position(5, 3),
                    new Position(5, 4),
                    new Position(5, 5),
                    new Position(5, 6),
                    new Position(5, 7),
                    new Position(5, 8),
                    new Position(5, 9),
                }
            };

            var gameOrchestrator = new BattleOrchestrator(new BattleService());
            var result           = gameOrchestrator.Execute(scenario);

            Assert.False(result.IsError);
            Assert.True(result.HasLost);
            Assert.Equal(AttackResult.Hit, result.AttackResults.First());
        }
        public GameResult Execute(BattleScenario scenario)
        {
            var plain = new Plain(scenario.Plain.Xsize, scenario.Plain.Ysize);

            try
            {
                foreach (var battleship in scenario.Battleships)
                {
                    _battleService.AddBattleship(plain, new Battleship(battleship.Start, battleship.End));
                }

                var shotResults = scenario.ShotPoints?.Select(shotPoint => _battleService.Shoot(plain, shotPoint)).ToList();

                var hasLost = plain.IsDestroyed();

                return(new GameResult {
                    AttackResults = shotResults, HasLost = hasLost
                });
            }
            catch (Exception e)
            {
                return(new GameResult {
                    IsError = true, Error = e.Message
                });
            }
        }
예제 #3
0
        static void Main(string[] args)
        {
            var scenario = new BattleScenario
            {
                Plain = new Plain {
                    Xsize = 10, Ysize = 10
                },
                Battleships = new List <Battleships.StateManager.Models.Battleship>
                {
                    new Battleships.StateManager.Models.Battleship {
                        Start = new Position(5, 0), End = new Position(5, 9)
                    }
                },
                ShotPoints = new List <Position>
                {
                    new Position(5, 0),
                    new Position(5, 1),
                    new Position(5, 2),
                    new Position(5, 3),
                    new Position(5, 4),
                    new Position(5, 5),
                    new Position(5, 6),
                    new Position(5, 7),
                    new Position(5, 8),
                    new Position(5, 9),
                }
            };

            var gameOrchestrator = new BattleOrchestrator(new BattleService());
            var result           = gameOrchestrator.Execute(scenario);

            System.Console.WriteLine($"Enemy has {(result.HasLost ? "Lost" : "Not Lost")}");

            System.Console.ReadKey();
        }
예제 #4
0
        /*
         *                             _                           _
         | |                         | |
         | ___    ___    _ __    ___  | |_   _ __   _   _    ___  | |_    ___    _ __
         | / __|  / _ \  | '_ \  / __| | __| | '__| | | | |  / __| | __|  / _ \  | '__|
         | (__  | (_) | | | | | \__ \ | |_  | |    | |_| | | (__  | |_  | (_) | | |
         \___|  \___/  |_| |_| |___/  \__| |_|     \__,_|  \___|  \__|  \___/  |_|
         |
         */
        public GameManager()
        {
            //Game loop initialize
            Console.CursorVisible = false;
            Tick                    = 0;
            gameLose                = false;
            gameWin                 = false;
            battleFinish            = false;
            damageDistributionRatio = 0.1f;

            //Count enemy's instances
            enemyList  = new List <Enemy>();
            EnemyCount = 0;

            //DummyEnemy for HUD displaying only
            enemy_null.Health        = 100;
            enemy_null.Shield        = 100;
            enemy_null.CurrentHealth = 0;
            enemy_null.CurrentShield = 0;
            enemy_null.Damage        = 0;
            enemy_null.Name          = " ------";

            //Potions array initialization
            potion = new Items[255];
            elixir = new Items[255];
            rune   = new Items[255];

            battleCount = 0;

            scenario_00 = new BattleScenario();
            {
                scenario_00.map              = "Dungeon_01";
                scenario_00.mapX             = Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + 1;
                scenario_00.mapY             = Constant.GAMEPLAY_CANVAS_LIMIT_UP + 1;
                scenario_00.color            = ConsoleColor.White;
                scenario_00.playerX          = Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + 6;
                scenario_00.playerY          = Constant.GAMEPLAY_CANVAS_LIMIT_UP + (Constant.GAMEPLAY_CANVAS_LIMIT_DOWN - Constant.GAMEPLAY_CANVAS_LIMIT_UP) / 2 - 2;
                scenario_00.objective        = " Eliminate the enemy"; //ok
                scenario_00.objective_l      = 26;
                scenario_00.objective_h      = 4;
                scenario_00.objective_indent = 2;
                scenario_00.report           = "Enemy has been eliminated"; //ok
                scenario_00.report_l         = 30;
                scenario_00.report_h         = 4;
                scenario_00.report_indent    = 4;
                scenario_00.debrief          = null; //ok
                scenario_00.debrief_l        = 0;
                scenario_00.debrief_h        = 0;
                scenario_00.debrief_indent   = 0;
                scenario_00.stationaryEnemy  = true;
            }

            scenario_01 = new BattleScenario();
            {
                scenario_01.map              = "Dungeon_01";
                scenario_01.mapX             = Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + 1;
                scenario_01.mapY             = Constant.GAMEPLAY_CANVAS_LIMIT_UP + 1;
                scenario_01.color            = ConsoleColor.White;
                scenario_01.playerX          = Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + 6;
                scenario_01.playerY          = Constant.GAMEPLAY_CANVAS_LIMIT_UP + (Constant.GAMEPLAY_CANVAS_LIMIT_DOWN - Constant.GAMEPLAY_CANVAS_LIMIT_UP) / 2 - 2;
                scenario_01.objective        = "This enemy can move. Terminate it!"; //ok
                scenario_01.objective_l      = 38;
                scenario_01.objective_h      = 4;
                scenario_01.objective_indent = 8;
                scenario_01.report           = "Enemy has been killed"; //ok
                scenario_01.report_l         = 26;
                scenario_01.report_h         = 4;
                scenario_01.report_indent    = 2;
                scenario_01.debrief          = "The blockade is clear"; //ok
                scenario_01.debrief_l        = 26;
                scenario_01.debrief_h        = 4;
                scenario_01.debrief_indent   = 2;
                scenario_01.stationaryEnemy  = false;
            }

            scenario_02 = new BattleScenario();
            {
                scenario_02.map              = "Dungeon_05";
                scenario_02.mapX             = Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + 1;
                scenario_02.mapY             = Constant.GAMEPLAY_CANVAS_LIMIT_UP + 1;
                scenario_02.color            = ConsoleColor.DarkMagenta;
                scenario_02.playerX          = Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + 4;
                scenario_02.playerY          = Constant.GAMEPLAY_CANVAS_LIMIT_DOWN - 7;
                scenario_02.objective        = "Caution! This enemy is fast and aggressive."; //ok
                scenario_02.objective_l      = 48;
                scenario_02.objective_h      = 4;
                scenario_02.objective_indent = 13;
                scenario_02.report           = "  You won the battle"; //ok
                scenario_02.report_l         = 26;
                scenario_02.report_h         = 4;
                scenario_02.report_indent    = 2;
                scenario_02.debrief          = "What's inside that room?"; //ok
                scenario_02.debrief_l        = 28;
                scenario_02.debrief_h        = 4;
                scenario_02.debrief_indent   = 3;
                scenario_02.stationaryEnemy  = false;
            }

            scenario_03 = new BattleScenario();
            {
                scenario_03.map              = "Dungeon_03";
                scenario_03.mapX             = Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + 1;
                scenario_03.mapY             = Constant.GAMEPLAY_CANVAS_LIMIT_UP + 1;
                scenario_03.color            = ConsoleColor.DarkMagenta;
                scenario_03.playerX          = Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + 4;
                scenario_03.playerY          = Constant.GAMEPLAY_CANVAS_LIMIT_DOWN - 7;
                scenario_03.objective        = "This one is a boss, but not that big"; //ok
                scenario_03.objective_l      = 40;
                scenario_03.objective_h      = 4;
                scenario_03.objective_indent = 9;
                scenario_03.report           = "    That was tough!"; //ok
                scenario_03.report_l         = 26;
                scenario_03.report_h         = 4;
                scenario_03.report_indent    = 2;
                scenario_03.debrief          = " Yep! Not BIG BOSS!"; //ok
                scenario_03.debrief_l        = 26;
                scenario_03.debrief_h        = 4;
                scenario_03.debrief_indent   = 2;
                scenario_03.stationaryEnemy  = false;
            }

            scenario_04 = new BattleScenario();
            {
                scenario_04.map              = "Dungeon_03";
                scenario_04.mapX             = Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + 1;
                scenario_04.mapY             = Constant.GAMEPLAY_CANVAS_LIMIT_UP + 1;
                scenario_04.color            = ConsoleColor.DarkMagenta;
                scenario_04.playerX          = Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + 4;
                scenario_04.playerY          = Constant.GAMEPLAY_CANVAS_LIMIT_DOWN - 7;
                scenario_04.objective        = "This is it. Prepare for the final battle!";
                scenario_04.objective_l      = 46;
                scenario_04.objective_h      = 4;
                scenario_04.objective_indent = 12;
                scenario_04.report           = "      You made it!";
                scenario_04.report_l         = 26;
                scenario_04.report_h         = 4;
                scenario_04.report_indent    = 2;
                scenario_04.debrief          = "Congratulations! You are now BIG BOSS";
                scenario_04.debrief_l        = 42;
                scenario_04.debrief_h        = 4;
                scenario_04.debrief_indent   = 11;
                scenario_04.stationaryEnemy  = false;
            }
        }
예제 #5
0
        public void StartBattle(BattleScenario scenario)
        {
            // ON START
            //Instantiate the map
            Map currentMap = new Map(scenario.map)
            {
                X = scenario.mapX,
                Y = scenario.mapY
            };

            currentMap.Color = scenario.color;

            //Gameplay canvas
            gameUI.DrawGameplayCanvas();

            //Set player coordinate in battle map
            player.X = scenario.playerX;
            player.Y = scenario.playerY;

            //Display level objective of this level
            gameUI.DrawConfirmationBox(Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + (Constant.GAMEPLAY_CANVAS_LIMIT_RIGHT - Constant.GAMEPLAY_CANVAS_LIMIT_LEFT) / 2 - 26,
                                       Constant.GAMEPLAY_CANVAS_LIMIT_UP + (Constant.GAMEPLAY_CANVAS_LIMIT_DOWN - Constant.GAMEPLAY_CANVAS_LIMIT_UP) / 2 - 2,
                                       scenario.objective_l,
                                       scenario.objective_h,
                                       scenario.objective,
                                       scenario.objective_indent);

            //Map is drawn once to save the framerate
            displayManager.DrawObjectAt(currentMap.X, currentMap.Y, currentMap.PhysicalForm, currentMap.Color);

            //Spawn some power up items on start
            LoadPowerUpSet(battleCount);

            // ON UPDATE
            while (!battleFinish)
            {
                //Draw Player at default position
                displayManager.DrawObjectAt(player.X, player.Y, player.PhysicalForm, player.Color);

                //Update player boundaries coordinates for the collision check
                player.GetCurrentBoundaryCoordinates();

                //Perform collision check between player and enemy in battle screen
                if (!enemyList[0].IsDead)
                {
                    //Update enemy visual position
                    displayManager.DrawObjectAt(enemyList[0].PreviousX, enemyList[0].PreviousY, enemyList[0].NegativeForm, enemyList[0].Color);
                    displayManager.DrawObjectAt(enemyList[0].X, enemyList[0].Y, enemyList[0].PhysicalForm, enemyList[0].Color);
                    enemyList[0].GetCurrentBoundaryCoordinates();

                    gameLogic.CollisionCheckInsideBounds(currentMap, enemyList[0]);
                    if (inputManager.keyPressed && !scenario.stationaryEnemy)
                    {
                        //Enemy movement
                        enemyList[0].MoveTowards(player);
                    }

                    //Enemy attack player when collides
                    gameLogic.CollisionCheckOutsideBounds(enemyList[0], player);

                    gameUI.ShowStatsHUD(50, 1, enemyList[0]);

                    //Combat
                    if (enemyList[0].AttackPermission)
                    {
                        player.TakeDamageFrom(enemyList[0], damageDistributionRatio);
                        enemyList[0].TakeDamageFrom(player, damageDistributionRatio);
                    }
                }
                else if (enemyList[0].IsDead)
                {
                    gameUI.ShowStatsHUD(50, 1, enemyList[0]);
                    displayManager.DrawObjectAt(enemyList[0].X, enemyList[0].Y, enemyList[0].NegativeForm, enemyList[0].Color);
                    displayManager.DrawObjectAt(enemyList[0].X, enemyList[0].Y, enemyList[0].DeadForm, enemyList[0].Color);


                    gameUI.DrawConfirmationBox(Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + (Constant.GAMEPLAY_CANVAS_LIMIT_RIGHT - Constant.GAMEPLAY_CANVAS_LIMIT_LEFT) / 2 - 26,
                                               Constant.GAMEPLAY_CANVAS_LIMIT_UP + (Constant.GAMEPLAY_CANVAS_LIMIT_DOWN - Constant.GAMEPLAY_CANVAS_LIMIT_UP) / 2 - 2,
                                               scenario.report_l,
                                               scenario.report_h,
                                               scenario.report,
                                               scenario.report_indent);

                    battleFinish = true;

                    //Release controls lock
                    player.BlockedHorizontally = BlockedDirection.None;
                    player.BlockedVertically   = BlockedDirection.None;
                }

                if (player.CurrentLive < 0)
                {
                    gameUI.DrawConfirmationBox(Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + (Constant.GAMEPLAY_CANVAS_LIMIT_RIGHT - Constant.GAMEPLAY_CANVAS_LIMIT_LEFT) / 2 - 26,
                                               Constant.GAMEPLAY_CANVAS_LIMIT_UP + (Constant.GAMEPLAY_CANVAS_LIMIT_DOWN - Constant.GAMEPLAY_CANVAS_LIMIT_UP) / 2 - 2,
                                               26,
                                               4,
                                               "Oops! You are defeated",
                                               3);

                    //battleFinish = true;
                    gameUI.DrawTransitionEffect_Dissolve('█', ' ');
                    ClearAllPowerUpItems();
                    gameLose = true;
                    break;
                }

                if (battleFinish)
                {
                    battleCount++;
                    gameUI.DrawTransitionEffect_Dissolve('█', ' ');
                    ClearAllPowerUpItems();
                    break;
                }

                //Collision check
                gameLogic.CollisionCheckInsideBounds(currentMap, player);
                gameLogic.CollisionCheckBetweenPlayerAndCanvasBoundaries(player);

                //Draw gameplay screens
                //------------------------------------------------ HUD
                Console.ForegroundColor = ConsoleColor.White;

                gameUI.ShowStatsHUD(1, 1, player);
                if (enemyList.Count == 0)
                {
                    gameUI.ShowStatsHUD(50, 1, enemy_null);
                }

                //Collision check between player and power ups
                for (int i = 0; i < pickups.Count; i++)
                {
                    if (potion[i] != null && gameLogic.CollisionCheckTwoObjects(player, potion[i], false, Constant.GAMEPLAY_CANVAS_LIMIT_RIGHT + 1, Constant.GAMEPLAY_CANVAS_LIMIT_UP + 6))
                    {
                        //Increase player current health
                        DisplayManager.WriteTextAt(Constant.GAMEPLAY_CANVAS_LIMIT_LEFT, Constant.GAMEPLAY_CANVAS_LIMIT_DOWN, $"{potion[i].Name} picked up!");
                        player.GetHealthFrom(potion[i]);

                        //Clear and move the health potion outside the gameplay canvas
                        displayManager.DrawObjectAt(potion[i].X, potion[i].Y, potion[i].NegativeForm, potion[i].Color);
                        potion[i].X = 0;
                        potion[i].Y = 0;
                    }

                    if (elixir[i] != null && gameLogic.CollisionCheckTwoObjects(player, elixir[i], false, Constant.GAMEPLAY_CANVAS_LIMIT_RIGHT + 1, Constant.GAMEPLAY_CANVAS_LIMIT_UP + 6))
                    {
                        //Increase player current health
                        DisplayManager.WriteTextAt(Constant.GAMEPLAY_CANVAS_LIMIT_LEFT, Constant.GAMEPLAY_CANVAS_LIMIT_DOWN, $"{elixir[i].Name} picked up!");
                        player.GetShieldFrom(elixir[i]);

                        //Clear and move the health potion outside the gameplay canvas
                        displayManager.DrawObjectAt(elixir[i].X, elixir[i].Y, elixir[i].NegativeForm, elixir[i].Color);
                        elixir[i].X = 0;
                        elixir[i].Y = 0;
                    }

                    if (rune[i] != null && gameLogic.CollisionCheckTwoObjects(player, rune[i], false, Constant.GAMEPLAY_CANVAS_LIMIT_RIGHT + 1, Constant.GAMEPLAY_CANVAS_LIMIT_UP + 6))
                    {
                        //Increase player current health
                        DisplayManager.WriteTextAt(Constant.GAMEPLAY_CANVAS_LIMIT_LEFT, Constant.GAMEPLAY_CANVAS_LIMIT_DOWN, $"{rune[i].Name} picked up!");
                        player.GetDamageFrom(rune[i]);

                        //Clear and move the health potion outside the gameplay canvas
                        displayManager.DrawObjectAt(rune[i].X, rune[i].Y, rune[i].NegativeForm, rune[i].Color);
                        rune[i].X = 0;
                        rune[i].Y = 0;
                    }
                }

                //Run player controller
                PlayerController();

                player.UpdateGameplayStatus(3);

                Tick++;
            }

            if (battleFinish && scenario.debrief != null)
            {
                //Display level objective of this level
                gameUI.DrawConfirmationBox(Constant.GAMEPLAY_CANVAS_LIMIT_LEFT + (Constant.GAMEPLAY_CANVAS_LIMIT_RIGHT - Constant.GAMEPLAY_CANVAS_LIMIT_LEFT) / 2 - 26,
                                           Constant.GAMEPLAY_CANVAS_LIMIT_UP + (Constant.GAMEPLAY_CANVAS_LIMIT_DOWN - Constant.GAMEPLAY_CANVAS_LIMIT_UP) / 2 - 2,
                                           scenario.debrief_l,
                                           scenario.debrief_h,
                                           scenario.debrief,
                                           scenario.debrief_indent);
            }
        }