C#战列舰级/结构

时间:2010-02-10 14:31:16

标签: c# design-decisions jagged-arrays

问候,我是编程的新手,目前正在开发游戏战舰的克隆。我需要实施一支由5艘船组成的船队。这就是我到目前为止所做的:

class 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数组中实现车队信息:

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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

我想我会定义一个拥有的Grid类,它拥有所有的GridUnit。那么这个Grid也会拥有一个List。船舶只有大小,方向,BowCell等属性。将船舶添加到网格时,网格可以相应地设置单位的状态。

这样,您可以在船级别拥有有用的方法,如IsSunk(),OccupiesUnit()等......

答案 2 :(得分:0)

为什么不创建像这样的东西

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

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

}
话虽如此,我不会公开所有成员。我使用Getter / Setter来改变值

我假设你也是指船的名称(驱逐舰等)

答案 3 :(得分:0)

有多少种类型的船只。这是在运行时修复还是变量?

如果它是固定的而不是太多,你应该只为每个使用单独的数组。如果它们是变量并且每种类型只有一个数组,则可以使用通用字典(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

答案 4 :(得分:0)

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)”方法,用于比较Size,Orientation,Position和镜头位置(Rectangle类有很多很好的功能)。

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

创建两个网格(每个玩家一个),添加一个为每个船只调用IsHit的拍摄方法,然后将镜头添加到镜头中。每次移动后,如果一艘船的每个点都被击中(在炮弹中),并且如果全部被击中,则将船设置为沉没。