2011-12-04 4 views
0

저는 Java로 명령 행 게임을 만들고 있습니다. Game 클래스와 Room 클래스가 있다는 기본 전제가 있습니다. 올바른 방에 도착하면 게임이 끝납니다. 사용자가 방향으로 이동할 수 있습니다 각 방에서 null을 반환하는 HashMap

:

문제가
public void move (String direction) { 
    Room nextRoom = currentLocation.getNeighbor(direction); //this is the problem, always nil 
    if (nextRoom == null){ 
     msg = "You can't go in that direction"; 
     }else{ 
     currentLocation = nextRoom; 
     msg = currentLocation.getLongDescription(); 
    } 
    } 

이 .getNeighbor 방법은 반환 전무를, 그래서 문제가 방법으로 어쩌면 내 룸 클래스 내에서 내 getNeighbor 방법으로 또는 I 방을 만들고있어. 이건 내 문자열을 사용, 나는 그 방향 키에 방들이 있는지 확인하기 위해 생성 한 HashMap의지도를 보이는

public Room getNeighbor(String rDirection){ 
     Room next = map.get(rDirection); 
     return next; 
    } 

: 여기 객실 클래스 내에서 내 getNeighbor 방법이다. 내 게임을 초기화 할 때 내가 전화를 내 방 클래스에서 만드는지도 방법을

private HashMap<String , Room> map = new HashMap<String , Room>(); 

: 내 방 클래스에서

: 나는 문제가 내 방에의 방향의 HashMap을 만드는거야 어떻게 두려워 . 여기에 방향을 추가하는 방법이다 다음 내 게임 클래스에서 호출하고있어 :

// Room Class Method 

    public void addNeighbor(String rDirection, Room r){ 
     map.put(rDirection, r); 
    } 

// Game Class - Initializing the Rooms 

kitchen.addNeighbor("east", foyer); 
kitchen.addNeighbor("north", library); 

나는 내 모습 어떤 방에서 내 방으로 이웃을 찾을 수 없습니다입니다. 주석 처리 된 줄에서 오류가 발생하지만 실제로는 Room 클래스 메서드 또는 HashMap을 만드는 방식과 같다고 생각합니다. 어쨌든 누군가가 내가 놓친 것, 그리고 내 방에서 내지도에 어떤 이웃도 없는데도 문제가 무엇인지 지적 할 수 있는지 궁금합니다. 엄청 고마워.

+0

더 나은 도움을 받으려면 다음과 같이하십시오. 1) [SSCCE] (http://sscce.org/)를 게시하십시오. 2) 질문을하십시오. –

답변

1

스 니펫에서 분명히 잘못된 점은 없습니다. 디버거를 사용하여 코드를 실행하여 각 객체의 상태를 검사하는 것이 좋습니다.

FWIW, HashMap<String,Room>.get(x)에 대한 호출이 null을 반환하는 경우 다음 중 하나를 (그리고 경우에만) :

를지도 x에 대한 항목, 또는 x의 맵 항목이 null입니다
  • 이없는
    • .

    나는 추측을 할 수 있었다면, 그것은 당신이 제대로 currentLocation가 참조하는 Room 인스턴스를 초기화하지 않은 것으로 될 것이다. 예를 들어 currentLocation이 부엌을 가리킨 경우 "south" 또는 foyer 일 경우 null이 표시 될 수 있습니다.

    또 다른 가능성은 direction 문자열의 맞춤법이 잘못되었거나 대문자가 잘못되어 구성한 길 찾기 중 하나와 일치하지 않을 수도 있습니다.

    (인식 방향을 나타 내기 위해 enum을 선언하고지도의 키 유형으로 사용하는 경우 프로그램의 나머지 부분에서 더 강력합니다.)

  • +0

    이 문제는 방의 현재 위치를 시작하여 방의 값을 생성하는 범위/순서 문제였습니다. 진심으로 모든 도움에 감사드립니다. – Kombo

    1

    이것은 실제로 "답변"보다 "의견"이 더 많지만 의견에 맞지 않으므로 여기에 있습니다. . .

    질문에 포함 된 코드에 명백한 오류가 없습니다. 문제는 아마 다른 곳에있을 것이다. 수

    if(nextRoom == null) 
    { 
        System.out.println("Illegal direction '" + direction + "' requested from" + 
             " room '" + currentLocation.getDescription() + "'."); 
        System.out.println("(map is: " + map + ")"); 
        msg = "You can't go in that direction"; 
    } 
    

    정확히 정확히 당신에게 무엇을 direction을 무엇 direction말할 것이다 :

    이런 식으로 뭔가에
    if (nextRoom == null){ 
        msg = "You can't go in that direction"; 
        } 
    

    가 : 당신이 이것을 변경하는 경우 당신에게 디버그 도움이 될 것 한 가지입니다 있다. direction이 (말) 인 경우,

    • 대소 문자 구분 "East"보다는 "east"을 : 어떤 일들이 피려.
    • 공백. direction"east"이 아닌 "east " 인 경우.
    • 지도 항목이 있지만 값은 null입니다. (당신은 삽입을 할 때 foyernull 인 경우 kitchen.addNeighbor("east", foyer); 아무것도 도움이되지 않습니다.)
    1

    이 직접 다른 사람처럼 (질문을 해결하지 않는, 내가 대소 문자 구분보다 밖으로 다른 점프 아무것도 보이지 않았고)하지만 String이 아닌 enum을 키로 사용하는 것이 좋습니다. 문자열은 텍스트를 설명하는 데 적합하지만 다른 것들 (방향과 같은) 대신 불완전한 경향이 있습니다.

    열거 형은이 경우에 문자열을 통해 몇 가지 장점이있을 것입니다 :

    • 그것은 코드 자체 문서화한다; 예상되는 값의 방법을 정확히 알 수 있습니다.
      • 예를 들어 "북쪽", "북쪽", "북쪽"또는 "위로"라는 것을 기억할 필요가 없습니다. 그것은 단지 Direction.NORTH, 그리고 당신이하지 않는 경우가 컴파일되지 않습니다 그것은 바로
      • 이 대신의 HashMap의 EnumMap는로지도를 만들 수 있습니다 발신자뿐만 아니라 구현
    • 에 유용합니다, 더 효율적입니다. (귀하의 응용 프로그램에는 문제가되지 않지만)
    관련 문제