Как получить доступ к переменным из другого метода

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

Это проект, основанный на "Object сначала с Java с использованием blueJ"

  • 0
    передать переменную в качестве параметра во втором методе. или сделайте это экземпляром или переменной класса
  • 0
    Вы объявили throne как локальную переменную внутри метода. Вы должны либо передать переменную в качестве параметра в метод включения, на котором основан ваш последний сегмент, либо сделать переменную throne членом класса.
Показать ещё 1 комментарий
Теги:
scope

3 ответа

4
Лучший ответ

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

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

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

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

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

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

  • 0
    Я объявил трон комнаты «троном отдельной комнаты»; в области поля я получаю эту ошибку и использую if (currentRoom.equals (throne)) {закончено = истина; return "Поздравляю, вы достигли тронного зала"; } но я получаю эту ошибку "недостижимое утверждение"
  • 0
    Можете ли вы обновить свой пост с новым кодом? И по какой линии ты это получаешь?
Показать ещё 7 комментариев
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 или instance variable class variable чтобы он мог быть доступен, если вы хотите, чтобы эта переменная являлась private instance variable затем предоставляйте получателям и сеттерам доступ к этому значению переменной.

1

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

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

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, вам нужно сначала получить экземпляр Game, а затем вызвать getRoom() в этом экземпляре.

  • 0
    Как я могу реализовать это без добавления дальнейшего метода "getRoom". Я хочу иметь возможность использовать только метод "goRoom". Спасибо
  • 0
    При условии, что goRoom() находится в Game , вы также можете использовать rooms.get("throne")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню