这对于大量的变量来说是更好的

Which is better for massive amounts of Variables

本文关键字:更好 变量 于大量      更新时间:2023-09-26

因此,在过去几天大量阅读JS之后(我刚刚开始使用它),我已经为我的项目找到了3个可行的选项,这是一个游戏。我的游戏中大约有200个道具,总共有30个属性。但由于程序必须知道剑不会产生法术伤害,所以我必须赋予每个道具所有这30种属性,即使90%为0。所以这就是我的想法,任何建议都非常感谢:

var prop, obj = { Item1: "Boots", Item2: "Gloves", Item3: "Sword", Item4: "Cape" };

//我很确定我必须重做这个把属性放在那里,这可能不那么有用

function Item(hp, mp, dmg, spd, luk) {
    this.hp = hp;
    this.mp = mp;
    this.dmg = dmg;
    this.spd = spd;
    this.luk = luk;
}
var BigSword = new Item(0, 0, 50, 20, 10)

//我认为这可能是我最好的选择,所以有尽可能少的变量?还是说这并不重要?我认为有了这个选项,每当我在更新函数中更新totalHp、totalMp和totalDmg等时,我就可以创建一个名为theItem = BigSword的局部变量,然后只执行theItem。惠普、高新区。Mp,这样它就不需要搜索变量,运行速度也会相对更快?抱歉新手的问题,但JS甚至有局部变量在函数?就像如果我做var theItem =什么,那么该项目将是空的函数之外?

itemNames = [ "Boots", "Gloves", "Sword", "Cape" ];
itemHp = [ 0, 0, 0, 50 ];
itemMp = [ 0, 30, 0, 0 ];
itemDmg = [ 0, 0, 50, 0 ];
itemSpd = [ 50, 0, 0, 0];

//这是我想到的另一个选项,有点难看,但如果使用数组更快或更好,我不太介意。

但请记住,就像我说的,总共200~ 200个项目,每个项目将有大约30个属性。你觉得呢?

非常感谢您的阅读和提供的任何信息,非常感谢!提前感谢

最好是有一个构造函数,就像在第一个示例中那样。然而,我想改变一些事情。首先,对于构造函数,您只需传入大量数字。这是坏的,因为很容易忘记你的数字的顺序。一个更好的方法是传递一个对象给构造函数,这样你就可以标记每个属性:

function Item(props) {
    this.hp = props.hp;
    this.mp = props.mp;
    this.dmg = props.dmg;
    this.spd = props.spd;
    this.luk = props.luk;
}
var BigSword = new Item({
    hp: 0, 
    mp: 0, 5
    dmg: 0, 
    spd: 20, 
    luk: 10
});

这很好,但仍然很麻烦,因为您有各种不同的项,并且正如您所说,您必须为每个项定义30个属性,这既混乱又耗时。在这一点上,您进入了更复杂的面向对象的领域。从这里你基本上有两个选择:继承和构造。

继承

使用对象继承来正确定义对象可能是两种方法中比较常见的一种,而且相当直接。本质上,你有一个"类"的对象,然后是每个类的子类。所以你可能有魔法物品和非魔法物品作为两个类别。如果您有一条魔法腰带,也许您想让它继承Magical Item类的属性。另一方面,如果你有一把基本的未施魔法的剑,你会想让它从非魔法物品类继承。

但是假设你有魔法卷轴和魔法药水。它们都是魔法物品,对吧?所以你想要创造一个名为Potions的类和一个名为Scrolls的类,它们都继承自Magical Item类。那么你可能有某些类型的魔药。治疗药水,比如"治疗盟友的魔法药水"answers"治疗自己的魔法药水"。所以你需要不同的类,等等。

Javascript中的继承可以通过多种不同的方式实现,并且可以非常深入,所以我不打算在我的帖子中讨论它。下面是一些有用的链接,可以帮助您开始继承,如果您想要继承的话:
  • David Crockford谈遗产
  • MDN的继承和MDN的继承重审
  • Alex Sexton on Inheritance

作文

组合是一个从其他松散类型语言(如Python)大量借鉴的概念,Python相当广泛地使用了它。复合背后的基本思想是,您有一个基对象类,每当您需要某个特定类型的对象时,您就向该基类添加行为或成员。它不像继承那么有名,但它绝对是我更喜欢的。

在Javascript中,它的工作原理是有一个基本构造函数Item,然后有其他构造函数为Item添加必要的行为。让我们看看我在构图中使用的例子——创造一个魔法药水治疗盟友。你在这里有几个不同的属性:魔法物品,药剂,治疗。对于继承,你会做Item -> Magical -> Potion -> Healing Potions -> Allies。然而,通过组合,你可以在一个基本的Item类中添加几个行为,而不必建立一个巨大的原型链:Affect Allies, Potion, Healing

由于组合比继承简单一点(我承认,我有偏见),我将在伪代码中设置一个快速示例:

// base item class
function Item(props) {
    this.someProperty = props.someProperty;
    this.someOtherProperty = props.someOtherProperty;
}
// potion behavior
function Potion(props) {
    this.amount = props.amount; // IDK what amount means, just some random potion property
    this.color = "green";
}
// healing behavior
function Healing(props) {
    this.amountToHeal = props.amountToHeal;
    this.cooldown = props.cooldown;
}
// behavior to affect allies
function AffectAllies(props) {
    this.allies = props.allies;
    for(ally in this.allies) {
        this.allies[ally].affect(props.affact);
    }
}
// at this point we have the various behaviors set up and we can create the Magical Potion of Heal Allies constructor:
function MassHealingPotion(props) {
    var self = this;
    this.amount = props.amount;
    this.potion = new Potion(props);
    this.effect = new Healing(props);
    this.AffectAllies = new AffectAllies({
        affect: function(ally) {
            self.potion.affect;
        },
        allies: player.allies;
    });
}
// you can now create a mass healing potion:
var potion = new MassHealingPotion({
    weight: 50,
    someProp: "someValue",
    someOtherProp: "someOtherValue"
    // and so on and so forth with whatever properties you want the potion to have
});

嗯,这篇文章比我预期的要长一点,可能包含的错误也比我想的要多,但我希望这篇文章能传达出作文的基本思想。

现在,更简单的对象创建甚至不是组合中最好的部分,这是你可以重用不同的行为。假设你有一把魔法剑,每当你发动攻击时,它就会治疗你的盟友。你所要做的就是赋予它治疗成员和AffectAllies成员,然后它就变成了治疗伙伴的神奇之剑。使用继承,您必须在Magical Items类中创建一个Swords类(然后您将有两个不同的Swords类—一个用于非魔法剑,另一个用于魔法剑!)),然后扩展到治疗剑,等等。

你可以选择继承或者对象组合。对于你想要达到的目标,两者都是同样有效的。

但是性能呢?

200个物品,30个属性?没问题。把它们放在一个巨大的数组/对象中,煮沸它们,捣碎它们,把它们放在炖菜里。浏览器不在乎。你最好的选择可能是一个对象:

var itemList = {
    bigSword: new BigSword(...);
    smallSword: new SmallSword(...);
}

我更喜欢对象。我会从一个简单的、通用的"项目"开始,然后通过原型从通用的"继承"来构建特定的项目。

这可能会减少代码冗余并显著提高可维护性。

速度方面我没有线索,但我认为迭代200*30数组值也不是那么快。

你需要先认真地设计一下。如果你只是开始编码(就像许多开发人员那样),你只能走到这一步,然后意识到你的设计有一个根本性的缺陷,应用程序需要重写。这在早期阶段并不重要,但是一旦您编写了几百行代码,就会变得相当乏味。

通过各种方法编写代码来原型化事物,但你应该期望从中得到的只是设计提示,代码应该被丢弃。

项目列表(或目录)应该是一个对象,具有添加、删除和更新项目的方法。每个玩家(游戏邦注:包括角色、角色等)都需要一个道具和状态列表。应该有一个整体的更新伤害或生命值或任何功能,获得特定类型的道具,并将它们应用于特定类型的玩家(例如武器伤害敌人,食物使玩家和朋友复活等)。

只有当你知道了所有的玩家和道具,以及它们的属性和动作后,你才能开始设计界面和方法,并最终编写一些代码。

关注你的目标,你的目标应该是开发一款吸引人的游戏,而不仅仅是编写几千行代码。