我正在創建一個簡單的 RPG 控制臺游戲,我正處于創建庫存和戰利品系統的階段。目前在程式中,雙方class Player并class Monster有arrayList Backpack特性,當程式創建的怪物類的物件,在怪物的背包里的物品也被自動創建,殺死怪物后,你可以帶他們到你的背包,這是我的問題開始了如何優雅地防止背包中的物品重復,each item is a class too,現在這個函式的作業原理是通過一個嵌套回圈檢查每個專案是否已經在背包中,如果它已經存在而不是再添加一次,它會增加它的數量屬性,如果我沒有這個專案我的背包,它只是添加到串列中,解決方案有效,但絕對不是正確的解決方案,因為對于許多專案,這種檢查機制會增加很多,如果有人有任何有價值的提示,我將不勝感激。我還有第二個想法來創建一個boolean Is_it_in_Backpack變數,并以某種方式將它與戰利品收集機制聯系起來
下面是一些代碼示例
public class Player {
public static ArrayList<Item> Backpack = new ArrayList<>()
}
和類 Skieleton:
public class Skieleton extends Monsters {
public static ArrayList<Item> Backpack;
public Skieleton() {
Backpack = new ArrayList<>();
Backpack.add(new Weapon("Rusty sword", "Just a rusty sword", 3, 2 ));
Backpack.add(new Armor("Leather Armor", "Old leather armor", 6, 3));
}
類專案:
public class Item {
public String ItemName;
public String Description;
public int ItemSize;
public int ItemWeight;
public int Amount;
public Item(String ItemName, String Description, int ItemSize, int ItemWeight)
{
this.ItemName = ItemName;
this.Description = Description;
this.ItemSize = ItemSize;
this.ItemWeight = ItemWeight;
}
public Item() {
}
}
uj5u.com熱心網友回復:
我建議您使用擴展的類java.util.Set:
- 如果訂單對您來說不重要,您可以使用
HashSet; - 如果插入順序很重要,您可以使用
LinkedHashSet; - 如果自然順序很重要(按名稱或其他屬性的字母順序排列),您可以使用
TreeSet該介面Comparable并將其實作到插入到集合中的類上。
但是,無論您的選擇如何,建議您實作hashCode() (為了優化)和equals()(讓集合識別哪個專案與其他專案相同并避免重復)。
uj5u.com熱心網友回復:
如果你可以使用第三方庫,我建議使用Bag來自Eclipse的集合。
有了您的Item類實作equals并hashCode在ItemName現場,您的示例使用可能看起來像:
final MutableBag<Item> backPack = new HashBag<>();
final Item rustySword = new Item("Rusty sword", "Just a rusty sword", 3, 2);
final Item leatherArmour = new Item("Leather Armor", "Old leather armor", 6, 3);
backPack.add(rustySword);
backPack.add(leatherArmour);
backPack.add(rustySword);
System.out.println(backPack.toMapOfItemToCount()); // prints {Item[ItemName='Rusty sword']=2, Item[ItemName='Leather Armor']=1}
System.out.println(backPack.occurrencesOf(rustySword)); // prints 2
API 豐富,并提供更多:https : //www.eclipse.org/collections/javadoc/11.0.0/org/eclipse/collections/api/bag/Bag.html
uj5u.com熱心網友回復:
我會使用地圖。
這是我的建議:
import java.util.*;
class Player {
public Backpack backpack= new Backpack();
}
class Monster { }
class Skieleton extends Monster {
public Backpack backpack= new Backpack();
public Skieleton() {
backpack.add(new Weapon("Rusty sword", "Just a rusty sword", 3, 2 ));
backpack.add(new Armor("Leather Armor", "Old leather armor", 6, 3));
}
}
class Backpack {
private HashMap<Item,Item> items = new HashMap<>();
public Item add(Item item){
if (items.containsKey(item)){
items.get(item).Amount= item.Amount;
return items.get(item);
} else {
items.put(item,item);
return item;
}
}
public Item get(Item item){
return items.getOrDefault(item, null);
}
}
class Item {
public String ItemName;
public String Description;
public int ItemSize;
public int ItemWeight;
public int Amount;
public Item(String ItemName, String Description, int ItemSize, int ItemWeight)
{
this.ItemName = ItemName;
this.Description = Description;
this.ItemSize = ItemSize;
this.ItemWeight = ItemWeight;
}
public Item() {
}
public boolean equals(Object o){
if (o instanceof Item){
return ItemName.equals( ((Item)o).ItemName);
}
return false;
}
}
uj5u.com熱心網友回復:
您可以使用 HashMap 來存盤專案。首先,我想將類更改 Item為沒有金額欄位。讓一個 item 表示一個 item 是什么(名稱、描述、尺寸和重量)。
這是更新后的背包:
Map<Item, Integer> backpack = new HashMap<>();
要添加專案,您可以使用Map#merge方法。
public void addItemToBackpack(Item item, int quantity) {
backpack.merge(item, quantity, (oldQuantity, newQuantity) -> oldQuantity newQuantity);
}
我們插入專案及其數量。如果該專案尚不存在,則將使用傳遞的數量插入該專案。
如果它已經存在,那么BiFunctionwhich 是一個映射函式,將使用現有值 ( oldQuantity) 和我們嘗試插入的新值( )呼叫newQuantity。我們將它們相加,回傳它,專案的值(數量)將使用此值更新。
使用方法參考,我們可以把上面寫成,
backpack.merge(item, quantity, Integer::sum);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384860.html
