在JavaScript中创建一个简单的库存系统

时间:2015-04-01 04:13:17

标签: javascript arrays prototype inventory

我试图制作一个简单的文本冒险/农业模拟器,但我是JavaScript的新手,我一直试图计划我的库存系统如何工作。我的主要问题是有两种主要类型的物品:食品/消耗品和工具/耐用品。食物将以固定的速度生成和消费,而工具则需要购买,并且每次使用都会失去耐久性。

我能想到的最简单的解决方案是让每个食物的数量成为玩家的属性(player.meat,player.vegetable等),因为数量将是唯一改变的东西。工具有点复杂,所以我想我可以创建一个工具原型,然后给玩家一个存储所有工具的库存数组。然而,我越是想到它,我越觉得食物也需要成为原型(它也有价格和营养价值等属性)。

我现在正在努力思考最有效的方法。我是否创建了2个独立的原型,然后为每个玩家提供一个阵列?我是否需要为阵列创建原型,以便跟踪项目类型和数量?当我想要修改它时,我是否需要搜索数组中的每个项目?这似乎是不必要的复杂,但我真的不能想到更简单的事情。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

您可以保留一系列食物和一系列工具物品。以下是创建食品并使用它的示例。

function FoodItem(options){
    var options = options || {};
    this.name = options.name || "DefaultFood";
    this.amount = options.amount || 100;
    this.decrease = options.decrease || 1;
    this.eat = function(){
        this.amount -= this.decrease;
        if (this.amount < 0){
            console.log("Food Gone");
        }
    }
}

// Then create new foods.
var carrots = new FoodItem({
    name:"Carrots",
    amount:50,
    decrease:2
});

carrots.eat();

答案 1 :(得分:0)

至关重要的是不要在技术方面过度复杂化。随着游戏玩法的发展,您无论如何都需要改变一切,所以只有在您确定需要时才开始简单并增加复杂性。

我认为通过&#34;原型&#34;你的意思是基类。在你进入你的项目之前,我会反对这一点。关于JS经常受到经典训练的编码员绊倒的一件很酷的事情是,对象是“糊涂”的。您可以根据心脏的内容为每个对象添加或删除方法。嵌套子对象也是如此,因此您可以将所有内容保持干净整洁,而不会在以后限制自己。

这样的事情是我想到的第一件事。

player.inventory = {
  tools: [
  ],
  food: [
  ]
};


// when player picks up hammer
player.inventory.push({
  name: 'hammer',
  icon: 'images/hammer.png',
  effect: function(target) {
    console.log('whacked the ' + target.name);
  }
});

最重要的是犯错误而不是过度工程化。这有时称为compression-oriented programming

祝你好运,玩得开心。

答案 2 :(得分:0)

如果您想创建一种简单的查看项目的方法,并且您拥有唯一的基于字符串的ID(数字或名称),则可以使用Object作为哈希。

var player = {
  tools: {}
};

然后当该玩家获得新工具时,您可以将该工具的实例添加到哈希:

player.tools['hammer'] = new Tool(...);

然后,当您想稍后检索它时,您可以执行以下操作:

player.tools['hammer'].durability -= wear;

使用下划线,您可以像数组一样轻松地迭代这些对象:

var inventoryWorth = _.reduce(player.tools, function(totalCost, tool) {
  return totalCost + tool.cost;
}, 0);

对于放在这些数组中的对象,创建原型和构造函数可能很有用,但除非您打算向它们添加大量方法,否则您也可以只删除一个对象。