У меня есть класс под названием "Игра" на 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"
Вместо того, чтобы объявлять трон комнаты в вашем private void createRooms()
, вы можете объявить его как поле, поэтому сразу после конструктора вы можете сказать " Room throne;
, вы можете по-прежнему инициализировать его в методе createRooms
.
Вы можете подумать о том, чтобы сделать его final
потому что он больше не изменится и в нем четко указано намерение
В этом случае я бы не передал его следующему параметру, мне было бы разумно иметь его как поле
Изменение: по теме вашего недостижимого комментария к оператору, я подозреваю, что вы делаете проверку состояния игры после следующего кода:
} else {
currentRoom = nextRoom;
return currentRoom.getLongDescription();
}
Поскольку вы уже возвращаетесь из метода здесь, вы никогда не проверяете конечное состояние игры.
Но я продолжаю получать эту ошибку: "невозможно найти символ - переменный трон". Я считаю, что мне нужно поле где-то, но я не уверен, где и как это полезно.
Вы получаете эту ошибку, потому что переменный 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
затем предоставляйте получателям и сеттерам доступ к этому значению переменной.
Вы храните свой 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()
в этом экземпляре.
goRoom()
находится в Game
, вы также можете использовать rooms.get("throne")
throne
как локальную переменную внутри метода. Вы должны либо передать переменную в качестве параметра в метод включения, на котором основан ваш последний сегмент, либо сделать переменнуюthrone
членом класса.