Линейные корабли C # Класс / Структура - PullRequest
1 голос
/ 10 февраля 2010

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

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

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

В данный момент я думаю о реализации информации о флоте в Jagged Array следующим образом:

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}
};

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

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

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

спасибо.

Ответы [ 5 ]

3 голосов
/ 10 февраля 2010
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");
0 голосов
/ 10 февраля 2010
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 (Point shot), который сравнивает размер, ориентацию, положение и позицию выстрела (класс Rectangle имеет много полезных функций для этого).

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

Создайте две сетки (по одной для каждого игрока), добавьте метод съемки, который вызывает IsHit для каждого корабля, а затем добавляет выстрел к выстрелам. После каждого хода, если каждая точка корабля поражена (находится в кадре), и установите корабль на Затонувший, если все поражены.

0 голосов
/ 10 февраля 2010

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

Если оно фиксированное и не слишком много, вам, вероятно, следует просто использовать отдельные массивы для каждого. Если они являются переменными И у вас есть только один массив для каждого типа, вы можете использовать универсальный словарь (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
0 голосов
/ 10 февраля 2010

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

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

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

}

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

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

0 голосов
/ 10 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...