문제

인사, 나는 프로그래밍을 처음 접했으며 현재 게임 전함의 클론을 개발하고 있습니다. 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; }
}

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

마지막으로 클래스 선방자는 위의 클래스를 모두 포함하고 개별 셀의 상태 정보를위한 래퍼 역할을합니다.

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

마지막 코드가 작동하지 않는다는 것을 알고 있습니다. 아이디어를 제시하기위한 것입니다.

그러나 문제는 Jagged Array의 각 선이 어떤 선을 나타내는지를 나타내는 필드가 필요하며 모든 셀 정보 에서이 정보를 진술하는 것이 실용적이라고 생각하지 않습니다.

그래서 나는 당신 의이 문제를 구현하는 아이디어를 원합니다.

감사합니다.

도움이 되었습니까?

해결책

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

다른 팁

나는 소유 그리드 클래스를 정의 할 것이라고 생각합니다. 이 그리드는 목록도 보유합니다. 선박에는 크기, 방향, Bowcell과 같은 속성이 있습니다. 그리드에 배를 추가 할 때 그리드는 그에 따라 장치의 상태를 설정할 수 있습니다.

이렇게하면 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; }
  [...]
}

선박에서 물려 받고 다른 선박을위한 전함, 순양함 등과 같은 하위 클래스를 만듭니다. 크기, 방향, 위치 및 샷 위치를 비교하는 "ishit (point shot)"메소드를 추가하십시오 (사각형 클래스에는 많은 좋은 기능이 있습니다).

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

두 개의 그리드 (각 플레이어마다 하나씩)를 만들고 모든 선박에 대해 ISHIT를 호출하는 촬영 방법을 추가 한 다음 샷을 샷에 추가합니다. 배의 모든 지점이 치는 경우 각각의 움직임이 끝나면 (샷에 있음) 모든 것이 치면 배를 가라 앉히십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top