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 }); } }
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(); }
/* * _ _ | | | | | ___ ___ _ __ ___ | |_ _ __ _ _ ___ | |_ ___ _ __ | / __| / _ \ | '_ \ / __| | __| | '__| | | | | / __| | __| / _ \ | '__| | (__ | (_) | | | | | \__ \ | |_ | | | |_| | | (__ | |_ | (_) | | | \___| \___/ |_| |_| |___/ \__| |_| \__,_| \___| \__| \___/ |_| | */ 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; } }
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); } }