Я пытаюсь сделать текстовую игру на Java. Я придумал очень простой текстовый инвентарь и несколько методов: один для добавления нового элемента при его обнаружении, один для его удаления при использовании и третий для открытия самого инвентаря. Раньше я ссылался на элементы в виде строк, но мне также нужно было описание и «найденное» логическое значение, чтобы вызвать некоторые варианты выбора, поэтому я решил преобразовать их в объекты.
Для контекста: мой инвентарь — это ArrayList, так как мне нужно было динамическое решение для добавления потенциальных предметов на ходу.
Моя проблема: когда я пытаюсь сослаться на имя «элемента», я получаю значение последнего созданного мной элемента, а не того, который я указал в методе «addItem()».
//My class, for reference:
public class Item {
static String name;
static String description;
static boolean isOwned = false;
public Item(String name, String description, boolean isOwned) {
this.name = name;
this.description = description;
this.isOwned = isOwned;
}
public static String getName() {
return name;
}
public static String getDescription() {
return description;
}
public static boolean isOwned(boolean owned) {
if (owned) {
isOwned = true;
} else if (!owned) {
isOwned = false;
}
return isOwned;
}
Вот методы, которые я создал для инвентаризации:
public static void addItem(Item obj) {
inventory.add(Item.name);
if (!startScreen) { //This is to prevent the method from printing out an
//output in the start screen, while doing some background "addItem()" processes.
System.out.println("-------------------------------------------");
System.out.println("\n> You have a new item: " + Item.name + ".");
Item.isOwned(true);
}
}
public static void removeItem(Item obj) {
inventory.remove(Item.name);
System.out.println("-------------------------------------------\n");
System.out.println("> " + Item.name + " used.");
}
public static void openInventory() {
System.out.print("> Your inventory: |");
for (String item : inventory) {
System.out.print(" " + item + " | ");
}
System.out.println("-------------------------------------------\n");
System.out.println("> To use an item, please type the exact name."
+ "\n> Type 'X' to close the inventory.");
String interact = in.
if (interact.equals("x")) {
break;
}
}
}
Теперь предположим, что я создал два элемента, но хочу добавить только первый:
static Item sealedLetter = new Item(
"Sealed Letter", //name
"A letter from a desperate man to his beloved. It holds many secrets.", //description
false); //'Found' State
static Item musicSheet = new Item(
"Music Sheet", //name
"A music sheet holding a melancholic melody in D minor. Someone might appreciate its gloomy tune.", //description
false); //'Found' State
addItem(sealedLetter);
По какой-то причине мой вывод будет таким и будет относиться только к последнему созданному элементу:
«У вас есть новый предмет: Нотный лист».
Как вы увидите, я пытался ссылаться на переменные элементов и отдельные объекты внутри методов, но, похоже, это не сработало. Очевидно, что создавать метод для каждого предмета в инвентаре не функционально и неэффективно, хотя это, конечно, решило бы проблему. Что я делаю не так? Я не использую правильный параметр для ссылки на объект?
Я уверен, что эта моя проблема может помочь некоторым людям, которые хотят реализовать аналогичную и лучшую систему, чем моя — если я смогу заставить ее работать, конечно!
static String name;
- статический означает, что будет только один из них. Каждый раз, когда вы меняете значениеname
, будут меняться все значения. - person Scary Wombat   schedule 17.07.2018addItem(Item obj) {...}
метод принимаетItem
(имя локальной переменной obj). Но в методе, о котором вы говорите,Item.name
должно бытьobj.name
. - person prasad_   schedule 17.07.2018