/// <summary>
 /// Initializes a new instance of the <see cref="ConsoleGame" /> class.
 /// </summary>
 /// <param name="inputProvider">The input provider.</param>
 /// <param name="renderer">The renderer.</param>
 /// <param name="damageHandler">The damage handler.</param>
 public ConsoleGame(IInputProvider inputProvider, ConsoleRenderer renderer, ICellDamageHandler damageHandler)
 {
     this.engine = new Engine(renderer, damageHandler);
     this.inputProvider = inputProvider;
     this.renderer = renderer;
     this.damageHandler = damageHandler;
 }
 /// <summary>
 /// Initializes a new instance of the GameData class.
 /// </summary>
 /// <param name="gameField">The game field.</param>
 /// <param name="movesCount">Moves made by the player.</param>
 /// <param name="damageHandler">The damage handler.</param>
 public GameData(GameField gameField, int movesCount, ICellDamageHandler damageHandler)
 {
     this.GameField = gameField;
     this.MovesCount = movesCount;
     this.DamageHandler = damageHandler;
 }
 /// <summary>
 /// Lets the DamageHander damage the cell.
 /// </summary>
 /// <param name="damageHandler">The concrete damage handler.</param>
 public abstract void TakeDamage(ICellDamageHandler damageHandler);
 /// <summary>
 /// Lets the DamageHander damage the cell.
 /// </summary>
 /// <param name="damageHandler">The concrete damage handler.</param>
 public override void TakeDamage(ICellDamageHandler damageHandler)
 {
     damageHandler.Damage(this);
 }
        /// <summary>
        /// Makes the field react to explosion.
        /// </summary>
        /// <param name="positions">Position of the mine.</param>
        /// <param name="damageHandler">Cells damage handler.</param>
        public void ReactToExplosion(IList<Position> positions, ICellDamageHandler damageHandler)
        {
            foreach (var position in positions)
            {
                if (this.IsInRange(position))
                {
                    var currentCell = this.field[position.Row, position.Col];

                    if (!currentCell.IsDestroyed)
                    {
                        this.field[position.Row, position.Col].TakeDamage(damageHandler);

                        if (currentCell is Mine)
                        {
                            --this.MinesCount;

                            if (this.isExplosionChained == true)
                            {
                                var mine = currentCell as Mine;
                                this.ReactToExplosion(mine.GetExplodingPattern(), damageHandler);
                            }
                        }
                    }
                }
            }
        }
 /// <summary>
 /// Loads a game from memento.
 /// </summary>
 /// <param name="memento">The game data to be loaded.</param>
 public void SetMemento(GameData memento)
 {
     this.field = memento.GameField;
     this.MovesCount = memento.MovesCount;
     this.damageHandler = memento.DamageHandler;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="Engine" /> class.
 /// </summary>
 /// <param name="renderer">Game renderer.</param>
 /// <param name="damageHandler">Cell damage handler.</param>
 public Engine(IRenderer renderer, ICellDamageHandler damageHandler)
 {
     this.renderer = renderer;
     this.damageHandler = damageHandler;
 }
 /// <summary>
 /// Lets the DamageHander damage the cell.
 /// </summary>
 /// <param name="damageHandler">The concrete damage handler.</param>
 public abstract override void TakeDamage(ICellDamageHandler damageHandler);