2014-01-17 4 views
2

나는 자바로 게임을 만들고 있는데, 플레이어가 지정된 테두리로 세계를 이동할 수 있기를 바랍니다.ACSII 세계지도 가져 오기 및 읽기

'세계'를 정의하는 방법, 즉 플레이어가 이동할 수있는 곳과없는 곳을 웹에서 검색 한 후.

나는 예를 들어, 하나 개의 문자가 픽셀의 일정 금액을 나타내는 2 차원 ASCII지도의 아이디어를 좋아 :

이 예에서
################### 
#-----------------# 
#-----###---------# 
#-----###---------# 
#-----------------# 
################### 

- 캐릭터는 플레이어가 할 수있는 10 × 10 타일을 나타냅니다 안으로 들어가고, # 문자는 플레이어가 올 수없는 10x10 영역을 나타냅니다. 자바에서

, 나는 world.txt 사용 가져 오기 :

void importMap() { 
    BufferedReader br = new BufferedReader(new FileReader("world.txt")); 
    String line; 
    while ((line = br.readLine()) != null) { 
    for (char ch: line.toCharArray()) { 
     // Add to array 
    } 
    } 
    br.close(); 
} 

는 그러나, 나는이 곳이 데이터를 저장하는 모른다.

world[7][3]; 
// Should return # 

가 어떻게이 ASCII 맵을 저장해야합니다 : 나는 단순히이 같은 특정 X에서 문자, Y 값을 얻을 수에 2 차원 배열 생각 해요? 2D 배열, 2D 객체, 해시 맵 등?

답변

2

2 차원 배열은 메모리 공간이 가장 작기 때문에 가장 좋으며 직접 액세스하는 경우가 많습니다. 해시 맵은 공간 오버 헤드를 전달하며 실제로 유용한 것을 추가하지 않습니다. 언급 된 @assylias와 같이 클래스의 데이터 구조를 추상화하면 깨끗한 인터페이스가됩니다. @Alexander Tokarev는 어레이 크기를 알지 못하지만 NIO를 사용하면 해결할 수 있습니다.

char[][] createWorld(String file) 
{ 
    try { 
     List<String> lines = Files.readAllLines(Paths.get(file), 
      Charset.forName("US-ASCII")); 
     char[][] world = new char[lines.size()][]; 
     int i = 0; 
     for(String ln: lines) 
      world[i++] = ln.toCharArray(); 
     return world; 
    } catch (IOException ex) { 
     Logger.getGlobal().log(Level.SEVERE, null, ex); 
    } 
    return null; 
} 
1

2D 배열에 정보를 저장하는 것이 합당한 해결책으로 보입니다. 그러나 클래스 내에서 숨길 수 있습니다. 예를 들면 다음과 같습니다.

class WorldMap { 
    private final char[7][3] world = new char[7][3]; 

    //x,y below are pixels, so you don't need to convert from array index to pixels 
    //everywhere in your code 
    public boolean canMoveTo(int x, int y) { ... } 

    public void addObstacle (Rectangle r) { ... } 
} 

아이디어를 얻을 수 있습니다.

0

데이터를 2D 배열에 저장하는 주된 단점은 적절한 배열을 만들기 위해 구문 분석하기 전에 "월드"크기를 알아야한다는 것입니다. 크기가 일정하면 2D 어레이가 솔루션에 맞을 것입니다. 그렇지 않은 경우 - 다른 구조의 사용을 고려하십시오.

ArrayList와 같이 동적으로 확장 된 구조를 만들고 구문 분석 후 2D 배열로 변환 할 수도 있습니다. 이렇게하면 알 수없는 크기 문제가 해결됩니다.

+0

동적 2D 배열 클래스 (ArrayList의 ArrayList를 사용하여 구현 될 수 있음)가 멋지다. – JVMATL

관련 문제