到目前为止,我有这个:
class Inventory {
private Potion[] potions;
private Weapon[] weapons;
private Armor[] armor;
private Food[] food;
private Ore[] ores;
public int InventorySlots {get;set;}
public Inventory() {
InventorySlots = 10;
BuildInventory();
}
public Inventory(int slots) {
InventorySlots = slots;
BuildInventory();
}
public void BuildInventory() {
potions = new Potion[InventorySlots];
weapons = new Weapons[InventorySlots];
armor = new Armor[InventorySlots];
food = new Food[InventorySlots];
ores = new Ore[InventorySlots]
}
}
例如,我想在10插槽库存中添加新武器,如何添加并删除它?
答案 0 :(得分:5)
为了显着简化问题,您可以创建一个基类“项目”,其中所有项目类型都来自:
public class Item
{
// put any common attributes here
}
public class Armor : Item
{
// define properties for Armor here
}
public class Weapon : Item
{
// define properties for weapons here
}
当您创建这样的子类时,您可以使用Item
变量来存储任何派生类。您可以创建一个新的Weapon
实例,并将其分配给类型为Item
的库存槽。因此,您的Inventory
课程将成为Item
s。
假设你想要一个一对一的数组到库存位置的映射,并且不希望自己重新排列,那么数组方法可能就是这样。
class Inventory
{
// Array to store items
public Item[] Items { get; private set; }
// Inventory capacity is array length
public int Capacity { get { return (Items == null) ? 0 : Items.Length; } }
// Constructor
public Inventory(int capacity = 10)
{
SetInventorySize(capacity);
}
// Set size of inventory, retaining contents where possible
public void SetInventorySize(int cap)
{
if (cap <= 0)
Items = null;
else if (Items == null)
Items = new int[cap];
else
Array.Resize(ref Items, cap);
}
// Get index number of first free slot in inventory
public int FirstAvail()
{
if (Items != null)
{
for (int i = 0; i < Items.Length; ++i)
{
if (Items[i] == null)
return i;
}
}
return -1;
}
// Add item to array, returning index or -1 on failure
public int AddItem(Item item)
{
if (Items != null)
{
for (int i = 0; i < Items.Length; ++i)
{
if (Items[i] == null)
{
Items[i] = item;
return i;
}
}
}
return -1;
}
}
Items
属性是一个数组,您可以存储任何Item
派生的对象,例如上面的Armor
或Weapon
。要将项目添加到列表中,请找到一个清晰的位置(例如,使用FirstAvail
方法)并将该项目放入项目列表中。
当您在清单中使用项目时,您需要确定它们是什么,以确定如何处理它们。您可以这样使用as
操作:
// get the first item in the inventory
Item item = inventory.Items[0];
if ((Armor armorItem = item as Armor) != null)
{
// Code to execute for Armor items
armorItem.Wear();
}
else if ((Weapon weaponItem = item as Weapon) != null)
{
// Code to execute for Weapon items
weaponItem.Equip();
}
else if ((Potion potionItem = item as Potion) != null)
{
// Code to execute for Potion items
potionItem.Drink();
}
as
操作将检查对象的真实类型,如果不匹配则返回null。因此,如果您在广告资源的第0个插槽中存储Potion
项,则不会尝试将其用作Armor
或Weapon
项。
当然这是一个人为的例子。在Item
类中定义基本的常用操作并在子类中覆盖它们会更有用。然后你只需调用(例如)item.DefaultAction()
并为每个子类型重写DefaultAction
的实现,以执行适当的操作。
答案 1 :(得分:1)
看起来你将无法将你的武器设置在Inventory类之外,因为它是私有的,但是如果你在Inventory类中执行它,因为它是一个数组,你只需将武器分配给武器的索引阵列。要删除它,只需将武器索引设置为null。
weapons[index] = weapon; // add
weapons[index] = null; // remove
答案 2 :(得分:0)
在数组位置使用对象之前,请确保检查 null :
if (potions[4] != null)
{
potions[4].DrinkMe();
}
您可以通过重新分配 null
来删除项目potions[4] = null;
请注意,所有数组位置都将以 null 开头。代码:
potions = new Potion[InventorySlots];
分配Potion
的数组,但不在每个数组槽中放置新的Potion
实例。你应该这样做。
答案 3 :(得分:0)
我个人只是将这些公开
private Potion[] potions;
private Weapon[] weapons;
private Armor[] armor;
private Food[] food;
private Ore[] ores;
但是如果你想把它们保密,那就制定方法来访问不同数组的不同位置。
实施例
public Weapon getWeaponAtPositon(int index)
{
if (index > 0 && index < InventorySlots)
return weapons[index];
else
return null;
}
public void setWeaponAtPositon(Weapon weapon, int index)
{
if (weapon != null && index > 0 && index < InventorySlots)
weapons[index] = weapon;
}
public void deleteWeaponAtPositon(int index)
{
if (index > 0 && index < InventorySlots)
weapons[index] = null;
}
你可以为你拥有的不同阵列重复这些,这样你一次只能访问一个字段,这样你就可以更安全地从课堂外修改数组(甚至更不容易弄乱它)虽然它仍然很容易)
希望它有所帮助。