2010-02-10 4 views
1

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

класса 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); 
} 

at в тот момент, я имею в виду реализации информации флота в 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} 
}; 

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

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

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

спасибо.

+0

Привет, у вас все еще есть код? Я делаю эту игру для школы, и мне нужна помощь в размещении лодок на случайном случайном компьютере. – GroundZero

+0

не жалко, мой код - игрок против игрока и не связан с компьютерным противником. – iTEgg

+0

Жаль, что я застрял. Мне нужно создать поле, в соответствии с выбранным уровнем (3 уровня, у каждого из них больше полей и больше лодок), и пользователю нужно стрелять по полям, чтобы попытаться найти все случайно размещенные лодки. Лодки не могут касаться друг друга и не могут лежать рядом друг с другом – GroundZero

ответ

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

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

Таким образом, вы можете иметь ПОЛЕЗНЫЕ методы на уровне корабля, как IsSunk(), OccupiesUnit(), и т.д. ...

+0

Это звучит интересно. будучи новичком, мне бы хотелось, если бы вы могли предоставить дополнительную информацию. Благодарю. – iTEgg

0

Почему вы не создать что-то вроде этого

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

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

} 

что будучи сказанным, я бы не стал публиковать всех участников. I'de использовать Getter/сеттер для изменения значений

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

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

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

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