/// <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); }
/// <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++; } } }
/// <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); } }
/// <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; } } } } } }