Esempio n. 1
0
        /// <summary>
        /// Удаляет корабль с поля
        /// </summary>
        /// <param name="ship">Корабль, который нужно удалить</param>
        public void DeleteShip(DTOShip ship)
        {
            int startPositionX = ship.Coordinates.X;
            int startPositionY = ship.Coordinates.Y;

            for (int i = 0; i < ship.DeckCount; i++)
            {
                if (ship.Orientation == ShipOrientation.Horisontal)
                {
                    var field = Map[startPositionY, startPositionX];
                    field.State = FieldState.Sea;
                    field.Ship  = null;
                    startPositionX++;
                }
                else
                {
                    var field = Map[startPositionY, startPositionX];
                    field.State = FieldState.Sea;
                    field.Ship  = null;
                    startPositionY++;
                }
            }

            Ships.Remove(ship);
        }
Esempio n. 2
0
        /// <summary>
        /// Добавляет корабль на карту
        /// </summary>
        /// <param name="x">Координата X</param>
        /// <param name="y">Координата Y</param>
        /// <param name="countDeck">Количество палуб</param>
        /// <param name="orientation">Ориентация корабля</param>
        public void CreateShip(int x, int y, int countDeck, ShipOrientation orientation)
        {
            DTOShip ship = new DTOShip();

            ship.DeckCount   = countDeck;
            ship.Orientation = orientation;
            ship.Coordinates = new XYCoordinate()
            {
                X = x, Y = y
            };
            Ships.Add(ship);
            int startPositionX = x;
            int startPositionY = y;

            for (int i = 0; i < countDeck; i++)
            {
                if (orientation == ShipOrientation.Horisontal)
                {
                    var field = Map[startPositionY, startPositionX];
                    field.State = FieldState.Ship;
                    field.Ship  = ship;
                    startPositionX++;
                }
                else
                {
                    var field = Map[startPositionY, startPositionX];
                    field.State = FieldState.Ship;
                    field.Ship  = ship;
                    startPositionY++;
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Получает выстрел сделанный по карте
        /// </summary>
        /// <param name="shot">Выстрел, который получили</param>
        public void SetShot(Shot shot, DTOShip killedShip = null)
        {
            var field = Map[shot.XyCoordinate.Y, shot.XyCoordinate.X];

            if (shot.Status == ShotStatus.Missed)
            {
                field.State = FieldState.Miss;
            }

            if (shot.Status == ShotStatus.Hit)
            {
                field.State = FieldState.Hit;
                SetAroundShotArea(shot.XyCoordinate.X, shot.XyCoordinate.Y, shot.Status);
            }

            if (shot.Status == ShotStatus.Killed)
            {
                field.State = FieldState.Hit;
                SetAroundShotArea(shot.XyCoordinate.X, shot.XyCoordinate.Y, shot.Status, killedShip);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Раставляет промохи вокруг попадания
        /// </summary>
        /// <param name="x">Колонка</param>
        /// <param name="y">Строка</param>
        /// <param name="status">Статус выстрела</param>
        private void SetAroundShotArea(int x, int y, ShotStatus status, DTOShip killedShip = null)
        {
            List <XYCoordinate> diagonalPoints = new List <XYCoordinate>();

            diagonalPoints.Add(new XYCoordinate()
            {
                X = x + 1, Y = y + 1
            });
            diagonalPoints.Add(new XYCoordinate()
            {
                X = x - 1, Y = y - 1
            });
            diagonalPoints.Add(new XYCoordinate()
            {
                X = x - 1, Y = y + 1
            });
            diagonalPoints.Add(new XYCoordinate()
            {
                X = x + 1, Y = y - 1
            });

            //Растановка промахов по диагональным клеткам от выстрела
            foreach (var point in diagonalPoints)
            {
                if (point.X >= 0 && point.X < MAP_WIDTH && point.Y >= 0 && point.Y < MAP_HEIGHT)
                {
                    Map[point.Y, point.X].State = FieldState.Miss;
                }
            }

            //Растановка промахов по по горизонтали и вертикали вокруг убитого корабля
            if (killedShip != null)
            {
                int deckCount = killedShip.DeckCount;
                List <XYCoordinate> horizontalPoints = new List <XYCoordinate>();
                List <XYCoordinate> verticalPoints   = new List <XYCoordinate>();
                List <XYCoordinate> allPoinsPoints   = new List <XYCoordinate>();
                verticalPoints.Add(new XYCoordinate()
                {
                    X = killedShip.Coordinates.X, Y = killedShip.Coordinates.Y + deckCount
                });
                verticalPoints.Add(new XYCoordinate()
                {
                    X = killedShip.Coordinates.X, Y = killedShip.Coordinates.Y - 1
                });
                horizontalPoints.Add(new XYCoordinate()
                {
                    X = killedShip.Coordinates.X - 1, Y = killedShip.Coordinates.Y
                });
                horizontalPoints.Add(new XYCoordinate()
                {
                    X = killedShip.Coordinates.X + deckCount, Y = killedShip.Coordinates.Y
                });
                allPoinsPoints.AddRange(verticalPoints);
                allPoinsPoints.AddRange(horizontalPoints);
                if (status == ShotStatus.Killed)
                {
                    //Если у корабля больше чем 1 палуба, то закрашиваем либо по вертикали либо по горизонтали
                    if (killedShip.DeckCount > 1)
                    {
                        if (killedShip.Orientation == ShipOrientation.Horisontal)
                        {
                            foreach (var point in horizontalPoints)
                            {
                                if (point.X >= 0 && point.X < MAP_WIDTH)
                                {
                                    Map[point.Y, point.X].State = FieldState.Miss;
                                }
                            }
                        }
                        else
                        {
                            foreach (var point in verticalPoints)
                            {
                                if (point.Y >= 0 && point.Y < MAP_HEIGHT)
                                {
                                    Map[point.Y, point.X].State = FieldState.Miss;
                                }
                            }
                        }
                    }
                    else //Если у корабля 1 палуба
                    {
                        foreach (var point in allPoinsPoints)
                        {
                            if (point.X >= 0 && point.X < MAP_WIDTH && point.Y >= 0 && point.Y < MAP_HEIGHT)
                            {
                                Map[point.Y, point.X].State = FieldState.Miss;
                            }
                        }
                    }
                }
            }
        }