如何创建多个相同的相同命名容器,这些容器可以包含(和保留)不同的项目/数量



所以...我以以下方式创建了一堆"项目",这在很多方面都非常适合我。事实上,我的大部分代码都基于这种结构(截断的列表(:

const items = {
Pearls: {
worth: 100,
color: "white",
use: // do something
},
Oyster: {
pearlsInside: 6,
something: "whatever"
}
};

然后我有一个像这样的球员库存设置:

const player = {
someVariable: "thingamabob",
inventory: [
]
};

当玩家从地面找到并得到牡蛎或珍珠时,我会将该物品(名称字符串(推入玩家的"物品栏数组",然后在幕后让他们访问/使用"物品对象"中的相应物品值。

简单易用,效果很好,除了一个问题...如果玩家在地上发现两只牡蛎,捡起一只并从里面取出 3 颗珍珠,然后将其放回地面,如果玩家后来捡起两只牡蛎,它们现在都将拥有 3 颗珍珠(以前未捡起的牡蛎应该还有 6 颗(。

这对于珍珠物品来说不是问题,因为它本身不是一个"容器",可以这么说,地上可能有一百颗珍珠,玩家可以得到它们,使用它们并随心所欲地掉落它们,而不会产生任何后果......这就是说珍珠就是珍珠就是珍珠,这对我有用。

但是当我进入那个牡蛎时,我意识到我需要多个名称/类型完全相同的物品,这些物品能够包含不同数量的珍珠。

请记住,玩家UI只会在所有情况下将牡蛎称为牡蛎 - 例如,地面或库存永远不会显示在游戏"牡蛎1,牡蛎2,牡蛎666"中 - 它将是"牡蛎,牡蛎,牡蛎"或"3牡蛎"。只有进一步检查,才可能会发现内容不同。

那么......为了实现"同名容器",我必须弄乱我当前的项目结构有多糟糕?

如果有帮助,我想这个问题的答案可以帮助解决 - 你如何在一个房间里有 2 个相同的"手电筒",但每个都有不同程度的电池电量 - 或者 - "你发现四个金色的柯尔特 1911 在地上带有珍珠母握把"(每个在他们的夹子里装了不同数量的弹药(——或者 - (也许(你如何多次出现宝箱,这些宝箱都被简单地看到/称为"宝箱"在游戏中,都包含各种战利品。

在这一点上,我猜测对我来说更多的是心理障碍,再加上担心我在目前的物品/库存结构/系统上走得太远,现在将不得不进行重大改造。

我不确定我是否完全理解您的问题,但这可能会有所帮助。

如果您使用 ES6(因为您使用的是const我猜您是(,您可以使用符号。

符号是 ECMAScript 2015 中 JavaScript 的新功能。符号是唯一的 和不可变的基元值,可以用作对象的键 财产。在某些编程语言中,符号是 称为原子。有关更多详细信息,请参阅符号和符号对象 JavaScript 中的包装器。

我建议对你世界中的所有东西都使用ID。您可以为它们指定一个类型,每个类型都有一个显示名称和其他元数据,但随后可以唯一标识对象的每个实例。

如果您需要有关生成 ID 的帮助,请尝试搜索GUID / UUID in Javascript

用数组而不是对象表示集合。然后,您可以在该数组中拥有同一项目的多个。然后,如果您为每个项目提供相同的属性,则可以轻松进行比较。要区分项目,请使用 ID。

const inventory = [
{
color: "white",
id: 1,
name: "pearls",
uses: [
"buy",
"craft",
"trade",
"sell"
],
weight: 0.1,
worth: 100
},
{
color: "white",
id: 2,
name: "pearls",
uses: [
"buy",
"craft",
"trade",
"sell"
],
weight: 0.1,
worth: 100
},
{
color: "brown",
id: 3,
name: "wood",
uses: [
"buy",
"craft",
"trade",
"sell"
],
weight: 2,
worth: 10
}
];
const net_worth = inventory.reduce(( a, b ) => a + b.worth, 0 );
console.log( `two pearls and one wood are worth ${ net_worth }` );
const oyster = {
color: "grey",
id: 4,
name: "oyster",
uses: [
"loot_pearls",
"open"
],
weight: 1,
worth: 6
};
console.log( `opening the oyster gave you ${ oyster.worth } pearls` );

下面是牡蛎和珍珠原型的示例以及如何实例化它们。

// Some helper functions
function randomNum(max) {
return Math.floor(Math.random() * Math.floor(max));
}
function randomColor() {
var colors = ['white', 'blue', 'purple', 'yellow'];
return colors[randomNum(3)];
}
// The Pearl prototype
function Pearl(worth, color, usageCallback) {
this.worth = worth;
this.color = color;
this.use = usageCallback;
}
// Replace the default toString() function just for fun
Pearl.prototype.toString = function() {
	return 'A ' + this.color + ' colored pearl worth ' + this.worth; 
}
// The Oyster prototype
function Oyster(pearlsInside, something) {
this.pearls = [];
for (var i = 0; i < pearlsInside; i++) {
	this.pearls.push(new Pearl(randomNum(100), randomColor(), function() {}))
}
this.something = something;
}
// Replace the default toString() function just for fun
Oyster.prototype.toString = function() {
	var description = 'The oyster contains ' + this.pearls.length + ' pearls: ';
this.pearls.forEach(function(pearl) {
	description += pearl + ', ';
});
return description;
}
// Here we instantiate our new objects
var oyster1 = new Oyster(6, 'Whatever');
var oyster2 = new Oyster(3, 'Whatever');
// And then we can use them
var container = document.getElementById('pearls');
container.appendChild(document.createTextNode(oyster1 + ''));
container.appendChild(document.createElement('br'));
container.appendChild(document.createElement('br'));
container.appendChild(document.createTextNode(oyster2 + ''));
// (or log them as strings)
console.log(oyster1 + '');
console.log(oyster2 + '');
<div id="pearls"></div>

当然,我想多了。

没有GUID/UUID,没有符号,没有超级巫术。

为同名对象生成唯一 ID 就像创建全局(可能比游戏世界中每个对象的唯一 ID 更全局(功能一样简单:

function generateId() { return idid += 1; }

然后创建一个新项目,如下所示:

function create(){ var item = new NewItem( {id: generateId(), name: "Widget", power: 6, energy: 0} ); }

然后按如下方式推送构造函数:

function NewItem(item) { this.item = item; }

然后,您将这些新创建的项目中的每一个作为对象推送到"世界上所有项目"数组中,这些对象具有大量属性,可以根据需要引用。

除此之外,这允许 100 个"小部件"在游戏中浮动,每个小部件都有不同的 ID,这意味着一个小部件可以有能量:0,但另一个"小部件"可以有能量:随着游戏的进行,69

。 完了,完了。继续下一个大问题。待续...

最新更新