Класс / Структура линкоров C #
-
19-09-2019 - |
Вопрос
приветствую, я новичок в программировании и на данный момент разрабатываю клон игры 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.После каждого хода, если поражена каждая точка корабля (находится в кадре), и установите корабль на потопление, если поражены все.