2013-04-14 4 views
2

안녕하십니까. 모두 여러분, 축하합니다.모든 방향으로 확장 가능한 2 차원 배열

저는 이른바 "인생 게임"을 프로그램하려고합니다. 누가 그것을 발명했는지 잊어 버렸지 만, 나는 꽤 흥미 롭다. 제발 내 동기를 파괴 할 것이므로, 게임 프로그래밍과 관련된 링크를 게시하지 마십시오;)

그것의 필수적인 부분은 놀이터입니다. 모든 방향으로 확장 가능한 2 차원 배열이 필요합니다.

예. 처음에는 10 * 10 필드의 배열이 있습니다. 배열 [-1] [- 1]의 방향뿐만 아니라 배열 [11] [11]의 방향으로 새로운 필드를 추가 할 수 있어야합니다. 필드 배열 [-1] [10] 또는 배열 [10] [- 10]에 새 항목을 추가 할 수 있어야합니다. 가능한 모든 2D 방향으로 배열에 액세스 할 수 있어야합니다.

이 글을 쓰는 시점과 마찬가지로 생각해 보았습니다. 네 방향으로 북쪽, 동쪽, 남쪽, 서쪽을 향하고있는 배열은 어떨까요? 모든 배열을 서로 옆에두고 가상 방향을 지정하십시오. 아래 예와 같습니다. 모든 배열은 나의 놀이터를 구성합니다. 그것이 효율적일까요, 아니면 더 간단한 방법이 있습니까?

[][][] | [][][] 
[][][] | [][][] 
[][][] | [][][] 
_______|_______ 
[][][] | [][][] 
[][][] | [][][] 
[][][] | [][][] 

감사합니다. 당신을 가정

+0

이 게임의 규칙에 대한 링크를 게시 할 수 있습니까? 나는 너의 설명으로 혼란 스럽다. – Sanchit

+1

정기적 인 경계 조건을 가진 그리드 클래스를 생성하는 것이 좋습니다. 즉,'x = -1; grid.set (x, y);'같음'x = -1 + L; grid.set (x, y);'. –

+0

다음은 규칙에 대한 링크입니다. http://www.youtube.com/watch?v=FnSEt2BCcRs&feature=player_detailpage#t=761s – JustBasti

답변

2

는 다음과 같이 할 수 세포의 고정 번호로 행렬을 확장하고, 원시 배열을 사용하고 있습니다 :

boolean[][] gameBoard = new boolean[3][3]; 

public boolean[][] expandMatrixBy(boolean[][] matrix, int number) { 
    int oldSize = matrix.length; 
    int newSize = oldSize + 2 * number; 
    boolean[][] result = new boolean[newSize][newSize]; 

    // Assume new cells should be dead, i.e. false.. 
    for (int row = number; row < oldSize + number; row++) { 
    for (int col = number; col < oldSize + number; col++) { 
     // ..copy only the existing cells into new locations. 
     result[row][col] = matrix[row - number][col - number]; 
    } 
    } 
    return result; 
} 

// Calling this on a 3x3 matrix will produce 5x5 matrix, expanded by 1 on each side. 
gameBoard = expandMatrixBy(gameBoard, 1); 

그리고 생명 :-)

OPTION의 존 콘웨이의 게임이다 : 이 솔루션은 다음과 같이 선택한면을 확장 할 수 있도록 사용자 정의 할 수 있습니다.

enum Side { Left, Right, Top, Bottom }; 

public boolean[][] expandMatrixBy(boolean[][] matrix, int number, Set<Side> sides) { 
    int oldSize = matrix.length; 
    int newSize = oldSize + number * sides.size(); 
    boolean[][] result = new boolean[newSize][newSize]; 

    for (Side side : sides) { 
    switch(side) { 
     case Left: 
     // Add number of columns on the left. 

     case Right: 
     // Add "number" of columns on the right. 
    } 
    } 
    return result; 
} 

Set<Side> expandOnTheseSides = EnumSet.of(Side.Left, Side.Top); 
gameBoard = expandMatrixBy(gameBoard, 1, expandOnTheseSides); 

행운을 비네.

+0

왜 newSize에 숫자를 2로 곱하는 지 알 수 없습니다. 비록 내가 생각하기에 좋은 접근법이지만 : P 내 운동장은 양면으로 제한 될 것입니다. – JustBasti

+0

"모든 방향으로 확장 할 수있다"고 말했을 때 나는 동시에 같은 수의 열로 모든 방향으로 확장해야한다는 것을 의미한다고 생각했습니다. 코드의 마지막 줄은 각면에 1 행/열을 추가하므로 각 축에 양면이 있기 때문에 'number'에 2를 곱합니다. – Cebence

+0

아하이 봐요. 네, 그게 제가하는 것입니다. 감사합니다 봉오리 : – JustBasti