2015-02-08 2 views
1

У меня есть класс под названием «Игра» на Java, и цель/цель - добраться до определенной комнаты, комнаты «трон». Когда тронная комната будет достигнута, игра заканчивается.Как получить доступ к переменным с помощью другого метода

public class Game { 

    // fields 

    private Room currentRoom; 
    private boolean finished; 
    private Room throne; 

    /** 
    * Create the game and initialise its internal map. 
    */ 
    public Game() 
    { 
     finished = false; 
     createRooms(); 
    } 

    /** 
    * Create all the rooms and link their exits together. 
    */ 
    private void createRooms() 
    { 
     Room gate, graveyard, church, crypt, entrance, hall, kitchen, buttery, greathall, staircase, 
     dungeon, topstaircase, throne, solar, wardrobe, privy; 

     // create the rooms 
     gate = new Room("outside the old gate of the castle"); 
     graveyard = new Room("on a wind-swept gaveyard"); 
     church = new Room("in a small ancient church"); 
     throne = new Room("in the throne room with golden walls"); 
     // other rooms ... 

     // initialize room exits 

     gate.setExit("north", graveyard); 
     throne.setExit("south", topstaircase); 
     // other exits ... 
    } 
} 

Для перехода в одном направлении/номер:

public String goRoom(String direction) 
{ 
    assert direction != null : "Game.goRoom gets null direction"; 

    // Try to leave current room. 
    Room nextRoom = currentRoom.getExit(direction); 
    if (nextRoom == null) { 
     return "There is no exit in that direction!"; 
    } else { 
     currentRoom = nextRoom; 
     return currentRoom.getLongDescription(); 
    } 
} 

Чтобы перейти в определенную комнату, чтобы закончить игру, т.е. «трон» номер вот что я сделал:

if (currentRoom.equals(throne)) { 
     finished = true; 
     return "Congrats you have reached the throne room"; 
    } 

Но Я продолжаю получать эту ошибку: cannot find symbol - variable throne

Это проект, основанный на «Объекте сначала с Java u Sing Bluej»

+0

передать переменную как параметр во втором методе. или сделать его экземпляром или переменной класса – Prashant

+0

Вы указали 'трон' как локальную переменную внутри метода. Вам либо нужно передать переменную в качестве параметра в метод-окружение, на котором основан ваш последний сегмент, либо сделать переменную 'трон' членом класса. – initramfs

+0

Я не думаю, что вы вызываете goRoom() из createRoom(), поэтому сделайте его переменной экземпляра – Prashant

ответ

4

Вместо того, чтобы объявить трон комнаты в вашем private void createRooms(), вы можете объявить его как поле, так сразу же после конструктора вы можете сказать Room throne;, вы можете еще инициализировать его в методе createRooms.

Вы могли бы рассмотреть возможность сделать это final, потому что не изменится больше, и ясно заявляет о своем намерении

В этом случае я бы не передать его следующему параметру, мне было бы целесообразно, чтобы он как поле

Edit: на тему вашего недостижимого заявления комментария, что я подозреваю, что вы делаете, проверку готового состояния игры после того, как ваш следующий код:

} else { 
     currentRoom = nextRoom; 
     return currentRoom.getLongDescription(); 
    } 

, потому что вы уже переходя от метода здесь, вы никогда не проверяете конечное состояние игры.

+0

Я объявил трон комнаты как «частный трон для комнаты»; в области поля, я получаю эту ошибку и используется, если (currentRoom.equals (трон)) { finished = true; возвращение «Поздравляем, что вы пришли в тронный зал»; }, но я получаю эту ошибку "unreachable statement" – tb1000

+0

Можете ли вы обновить свой пост с полным новым кодом? И на какой линии вы это понимаете? –

+0

Также в вашем обновленном коде вы назвали тронный зал «Цель»? Я бы использовал строчный регистр для имен там –

1

Вы храните свои Room с местными переменных. Эти переменные удаляются, как только ваш метод завершается, поэтому Room s исчезнет.

Чтобы решить эту проблему, вы должны объявить переменные на уровне класса:

public class Game { 
    private Room currentRoom; 
    private boolean finished; 
    private Room Goal; 
    private Map<String, Room> rooms; 


public Game() { 
    finished = false; 
    rooms = new HashMap<>(); 
    createRooms(); 
} 

//.... 

private void createRooms() { 
    rooms.put("gate", new Room("outside the old gate at the castle")); 
    //similar for other rooms 
    //... 
} 

Затем вы можете получить доступ к комнаты, определив функцию

public Room getRoom(String roomName) { 
    if (rooms.containsKey(roomName)) 
     return rooms.get(roomName); 
    throw new IllegalArgumentException("No such room: " + roomName); 
} 

Например:

if (currentRoom.equals(getRoom("throne")) { 

     finished = true; 
     return "Congrats you have reached the throne room"; 
} 

Если goRoom() не находится в Game, вам нужно будет получить n экземпляра Game, а затем позвоните по номеру getRoom().

+0

Как я могу реализовать это без добавления дополнительного метода «getRoom». Я хочу использовать метод «goRoom». Спасибо – tb1000

+0

При условии, что 'goRoom()' находится в 'Game', вы также можете использовать' rooms.get ("throne") ' – DennisW

1

Но я продолжаю получать эту ошибку: «не может найти символ - переменная трон». Я считаю, что мне нужно поле где-то, но я не уверен, где и , как это полезно.

Вы получаете эту ошибку, потому что переменная throne является локальной переменной, сфера только внутри метода он объявлен

private void createRooms() 
{ 
    Room gate, graveyard, church, crypt, entrance, hall, kitchen, buttery, greathall, staircase, 
     dungeon, topstaircase, throne, solar, wardrobe, privy; 


    // create the rooms 
    gate = new Room("outside the old gate of the castle"); 
    graveyard = new Room("on a wind-swept gaveyard"); 
    church = new Room("in a small ancient church"); 
    throne = new Room("in the throne room with golden walls");// local variable 
    // other rooms ... 

    // initialise room exits 

    gate.setExit("north", graveyard); 
    throne.setExit("south", topstaircase); 
    // other exits ... 
    } 

Теперь Вместо того, чтобы его локальным вы можете сделать его как instance variable или class variable так он может быть доступен, если вы хотите сделать эту переменную как private instance variable, затем предоставить получателям и сеттерам доступ к значению этой переменной.

Смежные вопросы