Domanda

saluti, im Sono nuovo di programmazione e in questo momento lo sviluppo di un clone delle corazzate del gioco. ho bisogno di implementare una flotta di 5 navi. questo è quello che ho fatto finora:

class cellulare detiene lo status di una cella di tabella:

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

class GRIDUNIT detiene Info cella:

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

, infine, classe Shipunit contiene sia le classi e gli atti di cui sopra come un wrapper per info stato di una singola cella:

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

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

Al momento mi sto pensando di attuare l'informazioni flotta in una matrice irregolare come questo:

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

mi rendo conto l'ultimo pezzo di codice non funziona. è solo per presentare l'idea.

, ma il problema è che ho bisogno di un campo che indica il tipo di nave ogni riga di matrice irregolare rappresentano e io non credo che sia pratico per affermare queste informazioni in ogni informazioni cella.

Quindi vorrei alcune idee di attuazione di questo problema da voi.

grazie.

È stato utile?

Soluzione

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

Altri suggerimenti

Credo che definirei una classe griglia possedere, le stive tutti i GridUnits. Allora questo Griglia sarebbe anche in possesso di un elenco. Una Nave sarebbe solo avere proprietà come la dimensione, l'orientamento, BowCell. Quando si aggiunge una nave alla griglia, la griglia potrebbe impostare lo stato delle unità di conseguenza.

In questo modo, è possibile disporre di metodi utili su livello nave come IsSunk (), OccupiesUnit (), ecc ...

Perché non creare qualcosa di simile

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

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

}

detto questo, non vorrei mettere tutti i membri del pubblico. I'de utilizzare getter / setter per modificare i valori

ho assunto per tipo si intende anche il nome della nave (distruttore, ecc.)

Come molti tipi di navi sono lì. È che fissa o variabile in fase di esecuzione?

Se è fisso e non troppi, probabilmente si dovrebbe semplicemente usare array separati per ciascuno. Se essi sono variabili e hai solo un array per ogni tipo, è possibile utilizzare un dizionario generico (di enumShipUnitType, ShipUnit []).

È quindi possibile iterare il dizionario ottenendo il KeyValuePair da esso in questo modo.

 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; }
  [...]
}

Eredita da navi e creare le sottoclassi come Battleship, Cruiser, ecc per le diverse navi. Aggiungi un "(colpo di Point) IsHit" metodo che mette a confronto dimensione, l'orientamento, la posizione e la posizione di tiro (classe Rectangle ha molte funzioni belle per quello).

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

Creare due griglie (uno per ogni giocatore), aggiungere un metodo germoglio che chiama IsHit per ogni nave e poi aggiunge il colpo di colpi. Dopo ogni mossa, se ogni punto di una nave viene colpita (è in scatti) e impostare la nave a affondato se tutti sono colpiti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top