문제

프로젝트용 RPG 게임을 완성하려고 하는데 게임 맵을 만드는 방법을 모르겠습니다.그래픽일 필요는 없지만 전체 지도와 각 타일의 코드가 정확해야 합니다.

지금까지 나는 연결된 모든 타일을 포함하는 ArrayList를 사용하여 (교수님의 요청에 따라) 비물질 지도를 만드는 것에 대해 생각했습니다.

public abstract class Casella {
/** 
 * @uml.property name="tabellone"
 * @uml.associationEnd multiplicity="(1 1)" inverse="casella:Tabellone"
 * @uml.association name="contains"
 */

private int id;
private boolean free = true;
private List adjacent;
private List items;
private Tabellone tabellone = null;

public void in(){
    free = false;
}

public void out(){
    free = true;
}

}

이것은 단일 타일(확장하는 3개의 클래스가 있음)에 대한 코드입니다.지도를 어떻게 조합하고 생성하는지 아직 잘 모르겠습니다.

시간 내 주셔서 감사합니다.

도움이 되었습니까?

해결책 6

인접력 목록을 사용하여 이것을 관리했습니다. 각 셀에는 인접한 셀의 인덱스를 포함하는 배열리스트가 있습니다. 이러한 인덱스는 상기 셀이 셀의 맵 어레이 목록에있는 것입니다.

http://en.wikipedia.org/wiki/adjacency_list

다른 팁

구현부터 시작하지 마십시오.지도를 사용하는 방법부터 시작하십시오. 그것은 당신에게 그것을 구현하는 방법을 몇 가지 제약으로 줄 것입니다. 예를 들어:

지도를 그릴 때 어떻게 액세스합니까? 좌표로? 또는 "타일 X에서 서쪽으로가"?

편집] RPG 게임의 메인 루프부터 시작하는 것이 좋습니다. 캐릭터/토큰을 어딘가에 배치해야합니다 (즉, 타일과 어떤 종류의 관계가 필요합니다).

그런 다음 캐릭터를 움직여야합니다. 캐릭터는 현재 타일 (상대, 항목, 유형)을 검사 할 수 있어야합니다. 어떻게 움직일 수 있는지 알 수있는 방법이 필요합니다 (즉, 오른쪽에 벽이 있습니까?)

이것은 당신에게 당신에게 당신의지도에 대한 인터페이스를 제공합니다 : 서비스는 게임의 다른 객체에 대한 렌더링됩니다. 인터페이스가 무엇을 제공 해야하는지에 대한 아이디어가 있으면 맵을 구현하는 방법 (데이터 구조)을 제공해야합니다.

맵을 생성하는 것은 임의의 숫자 생성기와 "상식"을 사용하십시오. 인접한 타일을 살펴보십시오 : 그들이 도시 일 때,이 타일은 아마도 도시 일 것입니다. 평원도 마찬가지입니다. 언덕은 특이한 품목이며 가장 빈번하지 않습니다.

이 코드를 실행하고 ASCII ( "C"Ity, "P"Lain, "H"ill)로 맵을 인쇄하여 작동하는지 확인하십시오.

매트릭스를 사용하지 않고 이와 같은 맵을 생성하려면 중앙 타일로 시작한 다음 수정 된 너비의 첫 번째 검색 알고리즘을 사용하여 맵을 바깥쪽으로 채우는 것이 좋습니다. 우선, 우리는 인접한 타일 목록보다 조금 더 좋은 것이 필요합니다. 다음 타일을 저장하는 각 방향마다 하나씩 4 개의 변수를 가질 수 있습니다.

private Tabellone up = null;
private Tabellone down = null;
private Tabellone left = null;
private Tabellone right = null;

중심 타일로 시작한다고 가정 해 봅시다. 지금해야 할 일은 몇 개의 방향이 Null인지 파악하고 각 방향에 대한 새 Tablellone 객체를 만들고이 현재 객체의 각 변수를 설정하고 생성 된 개체의 적절한 반대 변수를 설정하는 것입니다. .

Tabellone adj = new Tabellone();
up = adj;
adj.setDown(this);

이 타일의 모든 방향을 작성하면 만든 다른 타일 중 하나를 선택하고 동일한 작업을 수행합니다. 이곳은 폭이 먼저 검색 알고리즘이 들어오는 곳입니다. 큐를 사용하여 생성 한 각 타일을 통과하고 방향을 작성할 수 있습니다. 알고리즘을 중지하려면 생성하려는 타일 수를 제한하고 카운터를 사용하여 생성 된 수를 추적하십시오.

int count = 0;
ArrayList<Tabellone> queue = new ArrayList<Tabellone>()
queue.add(/*center tile*/);
while (count < 100) { //if we want 100 tiles
  //take out the center tile from the beginning of the array list, create a tile for each direction and add those tiles to the array list, then increment count by 1.
}

메모: 이 알고리즘은 다이아몬드 모양의 맵을 생성합니다. 사각형을 원한다면 각 대각선 방향에 대한 변수도 있어야합니다.

물론 이것이 원하는 것보다 조금 더 복잡해 보인다면 좌표 시스템을 추천합니다.

벽, baggs 및 지역은 특수 컨테이너로, 모든 벽, baggs 및 게임 지역을 유지합니다.

private String level =
          "    ######\n"
        + "    ##   #\n"
        + "    ##$  #\n"
        + "  ####  $##\n"
        + "  ##  $ $ #\n"
        + "#### # ## #   ######\n"
        + "##   # ## #####  ..#\n"
        + "## $  $          ..#\n"
        + "###### ### #@##  ..#\n"
        + "    ##     #########\n"
        + "    ########\n";

이것이 게임의 수준입니다. 공간을 제외하고는 5 개의 문자가 있습니다. 해시 (#)는 벽을 나타냅니다. 달러 ($)는 움직일 상자를 나타냅니다. 도트 (.) 문자는 상자를 움직여야하는 장소를 나타냅니다. AT 캐릭터 (@)는 Sokoban입니다. 그리고 마지막으로 새로운 라인 캐릭터 ( n)는 세계의 새로운 행을 시작합니다.

속도 나 메모리 가이 프로젝트에 큰 관심사입니까? 그렇지 않다면 왜 2D 배열을 사용하지 않습니까?

같은 것

Casella map [][] = new Casella[xSize][ySize];

여기에서 개념화하기 쉽습니다. 각 셀이지도의 타일 인 Excel 스프레드 시트로 상상하십시오.

그래도 당신이가는 방식은 괜찮습니다. 때로는 개념화하기가 조금 어렵습니다. 인접한 타일 목록이 있습니다. 따라서지도를 만들 때 어딘가에서 왼쪽 상단에 시작하여 거기에서 가십시오.

맵을 설정하고 가장자리 항목을 결정하기 위해 루프에 중첩을 사용할 수 있습니다.

for(int i = 0; i < XSIZE ; ++i)
    for(int j = 0; j < YSIZE ; ++j)
        if(j==0) //found left edge (i.e. no adjacent ones to the left)
        if(j==(YSIZE)) //found right edge (you get the picture) 

루프를 사용하고 가장자리를 점검하는 점은 가장자리를 제외하고 각 타일에 대해 뒤쪽 및 앞뒤로 링크해야한다는 것입니다.

코드가 정확해야 한다는 것은 실제로 기능적 요구 사항이 아니므로 게임/맵에 대해 더 많이 알지 못하면 무엇이 올바른지 정확히 말하기가 어렵습니다.

X 타일이 있고 정렬된 인접성이 없는 지도가 있다고 가정하면 비물질적 솔루션이 가장 좋습니다. 일반적인 솔루션은 비대칭 인접성에 대한 인접 목록이나 대칭 인접에 대한 발생 목록을 사용하여 그래프처럼 모델링하는 것입니다.발생 목록을 사용하는 경우 가장자리가 연결되는 정점을 포함하는 가장자리 개체가 필요하고, 인접 목록을 사용하는 경우 멀티맵 사용하는 것이 좋을 수도 있습니다.

정렬된 인접성을 갖춘 비물질적 솔루션을 원하는 경우 AlbertoPL이 이에 대한 솔루션을 제공합니다.

X 타일 너비와 Y 타일 높이의 지도가 있고 서로 옆에 있는 타일이 인접해 있다고 가정하면 각 타일에는 최대 4개, 최소 2개의 인접한 타일이 있습니다. 행렬을 사용하여 타일에 액세스하고 나타낼 수도 있습니다. 모계 인접성에 의한 인접성.아이디어는 map[Y][X]가 map[Y+1][X] 및 map[Y][X+1]에 인접하고 그 반대라는 것입니다.이 솔루션은 타일 [Y+1][X+1]이 타일 [Y][X]에 인접한 경우 최대 6개 및 최소 3개의 타일 인접성에 적합할 수도 있습니다.장점은 지도를 쉽게 구문 분석할 수 있고 2차원을 가지므로 이렇게 모델링하는 것이 자연스럽다는 것입니다.단점은 타일이 일단 설정되면 매트릭스를 변경하지 않고 인접성을 변경할 수 없다는 것입니다.이것은 교수님이 제안한 것이 아니기 때문에 하고 싶지 않을 수도 있지만 (정적) 순서 인접성이 있는 경우 이것이 가장 쉬운 방법일 수 있습니다.

타일 ​​기반 맵인 경우 각 방은 인접한 방과 고정된 관계를 갖습니다.좌표에 대해서는 걱정할 필요가 없지만(타일이 정사각형이면 더 간단할 수도 있지만) 방향에 대해서는 걱정해야 합니다.

타일이 정사각형인 경우 기본 방향(n, s, e, w)만 주의하면 됩니다.16진수 타일인 경우 출구 번호를 1~6으로 지정할 수 있습니다(아마도 정적 최종 상수를 사용하여).그런 다음 각각의 인접한 타일은 출구와 함께 이 타일에 연결될 수 있습니다.

말한대로 아론, 먼저 매핑 좌표가 어떻게 될지 결정해야합니다.

그러나 당신은 XYZ 좌표 시스템에 의해 제한되지 않습니다. 예를 들어, 각 타일은지도의 다른 타일에 연결될 수 있습니다. 그것은 모두 당신이 그것을 만드는 방법에 달려 있습니다.

당신은 당신이 RPG 게임을 구축한다고 말하면, 당신은 당신의 캐릭터를 둘러싼 지형을 잘 볼 수 있어야합니다. 다단계입니까? 캐릭터는 한 타일에서 다른 타일로 어떻게 이동합니까? 운동이 한 가지 방법입니까?

말 그대로 게임을위한지도를 디자인 할 때 수십 가지 질문이 있습니다.

코딩을 시작하기 전에 먼저 잘 계획해야합니다.

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