【问题标题】:Creating a simple inventory system in JavaScript用 JavaScript 创建一个简单的库存系统
【发布时间】:2015-06-05 14:58:51
【问题描述】:

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

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

我现在有点头晕目眩,试图想出最有效的方法。我是否创建了 2 个单独的原型,然后为每个玩家提供一个数组?我是否需要为数组创建一个原型,以便它可以跟踪项目类型和数量?当我想修改它时,我需要搜索数组中的每个项目吗?这似乎不必要地复杂,但我真的想不出更简单的东西。有人可以帮忙吗?

【问题讨论】:

    标签: javascript arrays prototype inventory


    【解决方案1】:

    如果您想创建一种简单的方法来查找项目并且您有一个唯一的、基于字符串的 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);
    

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

    【讨论】:

      【解决方案2】:

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

      我假设您所说的“原型”是指类似于基类的东西。在您深入了解您的项目之前,我建议您不要这样做。 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

      祝你好运,玩得开心。

      【讨论】:

        【解决方案3】:

        您可以保留一组食物和一组工具。以下是创建和使用食物的示例。

        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();
        

        【讨论】:

          猜你喜欢
          • 2016-07-19
          • 2014-03-26
          • 1970-01-01
          • 1970-01-01
          • 2022-06-15
          • 1970-01-01
          • 2012-08-02
          • 2011-01-02
          • 1970-01-01
          相关资源
          最近更新 更多