Вопрос

приветствую, я новичок в программировании и на данный момент разрабатываю клон игры battleships.мне нужно создать флот из 5 кораблей.это то, что я делал до сих пор:

ячейка класса содержит статус ячейки таблицы:

public class Cell
{
    // class for holding cell status information
    public enum cellState
    {
        WATER,
        SCAN,
        SHIPUNIT,
        SHOT,
        HIT
    }

    public Cell()
    {
        currentCell = cellState.WATER;
    }

    public Cell(cellState CellState)
    {
        currentCell = CellState;
    }

    public cellState currentCell { get; set; }
}

класс GridUnit содержит информацию о ячейке таблицы:

public class GridUnit
{
    public GridUnit()
    {
        Column = 0;
        Row = 0;
    }

    public GridUnit(int column, int row)
    {
        Column = column;
        Row = row;
    }

    public int Column { get; set; }

    public int Row { get; set; }
}

наконец, класс Shipunit содержит оба вышеперечисленных класса и действует как оболочка для информации о состоянии отдельной ячейки:

public class ShipUnit
{
    public GridUnit gridUnit = new GridUnit();

    public Cell cell = new Cell(Cell.cellState.SHIPUNIT);
}

на данный момент я подумываю о реализации информации о автопарке в виде неровного массива, подобного этому:

ShipUnit[][] Fleet = new ShipUnit[][]
{
new ShipUnit[] {ShipUnit,ShipUnit,ShipUnit,ShipUnit,ShipUnit},
new ShipUnit[] {ShipUnit,ShipUnit,ShipUnit,ShipUnit},
new ShipUnit[] {ShipUnit,ShipUnit,ShipUnit}
new ShipUnit[] {ShipUnit,ShipUnit,ShipUnit}
new ShipUnit[] {ShipUnit,ShipUnit}
};

я понимаю, что последний фрагмент кода не работает.это только для того, чтобы представить идею.

но проблема в том, что мне нужно поле, в котором указано, какой тип корабля представляет каждая строка неровного массива, и я не думаю, что целесообразно указывать эту информацию в каждой ячейке.

поэтому я хотел бы услышать от вас несколько идей по реализации этого вопроса.

Спасибо.

Это было полезно?

Решение

class Ship
{
    ShipUnit[] shipUnits;
    string type;
    public Ship(int length, string type)
    {
        shipUnits = new ShipUnit[length];
        this.type = type;
    }
}

Ship[] fleet = new Ship[5];
fleet[0] = new Ship(5, "Carrier");
fleet[1] = new Ship(4, "Battleship");
fleet[2] = new Ship(3, "Submarine");
fleet[3] = new Ship(3, "Something else");
fleet[4] = new Ship(2, "Destroyer");

Другие советы

Я думаю, я бы определил класс-владелец Grid, который содержит все GridUnits.Тогда эта Сетка также содержала бы Список.Корабль просто обладал бы такими свойствами, как размер, ориентация, носовая часть.При добавлении корабля в сетку Сетка может соответствующим образом устанавливать статус единиц измерения.

Таким образом, у вас могут быть полезные методы на уровне корабля, такие как IsSunk(), OccupiesUnit() и т.д...

Почему бы вам не создать что-нибудь подобное этому

class Ship
{
    public ShipUnits[] _SUParts;
    public String _strType;

    public Ship(String styType, int NbPart)
    {
         _SUParts = new ShipUnit[length];
         _strType = strType;
    }

}

тем не менее, я бы не стал выставлять всех участников на всеобщее обозрение.Я бы использовал Getter / Setter для изменения значений

Я предположил, что под типом вы также подразумеваете название корабля (эсминец и т.д.).

Сколько существует типов кораблей?Это фиксированное значение или переменная во время выполнения?

Если это исправлено и их не слишком много, вам, вероятно, следует просто использовать отдельные массивы для каждого.Если они являются переменными И у вас есть только один массив для каждого типа, вы могли бы использовать универсальный словарь (enumShipUnitType, ShipUnit[]).

Затем вы можете выполнить итерацию по словарю, получив из него KeyValuePair следующим образом.

 For Each kvp As KeyValuePair(Of enumShipUnitType, ShipUnit[]) In m_dictShipUnits
      For each oShipUnit as Shipunit in kvp.Value
         'Do whatever
      Next
 Next
class Ship {
  public Size Size { get; set; }
  public Orientation Orientation { get; set; }
  public Point Position { get; set; }
  public Boolean Sunk { get; set; }
  public String Name { get; set; }
  [...]
}

Наследуйте от Ship и создавайте подклассы, такие как Battleship, Cruiser и т.д., Для разных кораблей.Добавьте метод "isHit (точечный снимок)", который сравнивает размер, ориентацию, положение и позицию снимка (класс Rectangle имеет много полезных функций для этого).

class Grid {
  private Size size = new Size(10, 10);
  private List<Ship> ships = new List<Ship>();
  private List<Point> shots;
  [...]
}

Создайте две сетки (по одной для каждого игрока), добавьте метод shoot, который вызывает isHit для каждого корабля, а затем добавляет shot к shots.После каждого хода, если поражена каждая точка корабля (находится в кадре), и установите корабль на потопление, если поражены все.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top