1

あいさつ、私はプログラミングに不慣れで、現時点ではゲーム戦艦のクローンを開発しています。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);
}

現時点では、次のようなジャグ配列にフリート情報を実装することを考えています。

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

コードの最後のビットが機能しないことに気づきました。アイデアを提示するためだけのものです。

しかし、問題は、ジャグ配列の各行が表す船のタイプを示すフィールドが必要であり、すべてのセル情報にこの情報を記載することは実用的ではないと思います。

だから私はあなたからこの問題の実装のいくつかのアイデアをお願いします。

ありがとうございました。

4

5 に答える 5

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");
于 2010-02-10T14:38:52.607 に答える
0

所有するGridクラスを定義すると思います。これは、すべてのGridUnitを保持します。次に、このグリッドはリストも保持します。船には、サイズ、向き、BowCellなどのプロパティがあります。グリッドに船を追加するとき、グリッドはそれに応じてユニットのステータスを設定できます。

このようにして、IsSunk()、OccupiesUnit()などのような船レベルでの便利なメソッドを持つことができます...

于 2010-02-10T14:39:04.017 に答える
0

このようなものを作ってみませんか

クラス船
{{
    public ShipUnits [] _SUParts;
    public String _strType;

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

}

そうは言っても、私はすべてのメンバーを公開するつもりはありません。Getter/Setterを使用して値を変更します

タイプによってあなたは船の名前(駆逐艦など)も意味すると思いました

于 2010-02-10T14:39:16.543 に答える
0

何種類の船がありますか。それは実行時に固定または可変ですか?

固定されていて多すぎない場合は、それぞれに個別の配列を使用する必要があります。それらが可変であり、タイプごとに1つの配列しかない場合は、(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
于 2010-02-10T14:58:02.417 に答える
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; }
  [...]
}

船から継承し、さまざまな船の戦艦、巡洋艦などのサブクラスを作成します。サイズ、向き、位置、およびショット位置を比較する「IsHit(ポイントショット)」メソッドを追加します(Rectangleクラスにはそのための多くの優れた関数があります)。

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

2つのグリッド(プレーヤーごとに1つ)を作成し、すべての船に対してIsHitを呼び出すシュートメソッドを追加してから、ショットをショットに追加します。移動するたびに、船のすべてのポイントがヒットした場合(ショット内)、すべてがヒットした場合は船を沈没に設定します。

于 2010-02-10T15:01:59.180 に答える