如何向引用其他对象的Building类传入对象以修改资源值
解决闲置游戏中Building类的资源检查与扣减问题
核心问题修正点
- 需求结构设计错误:原代码中尝试用对象键存储资源引用的方式不可行,需改用数组存储包含资源引用和所需数量的对象。
- 遍历逻辑错误:
for...of无法直接遍历普通对象,需针对数组结构调整遍历方式。 - 类继承语法错误:
class Building extends Thing()的写法不符合JS语法,需去掉Thing后的括号。
1. 调整Requirements数据结构
将需求定义为数组,每个元素包含目标资源的引用和所需数量,确保后续能正确遍历检查:
// 示例需求结构 const buildingRequirements = [ { resource: player.resources.red, needed: 5 }, { resource: player.resources.blue, needed: 92 } ];
2. 修复Building类代码
修正类继承语法,同时重构buy方法的资源检查与扣减逻辑:
class Building extends Thing { constructor(amount, tag, requirements) { super(amount, tag); this.requirements = requirements; // 接收数组形式的需求配置 } buy() { // 第一步:检查所有资源是否满足需求 for (const req of this.requirements) { if (req.resource.amount < req.needed) { return false; // 任意资源不足,终止并返回失败 } } // 第二步:资源充足,扣减对应资源数量 for (const req of this.requirements) { req.resource.amount -= req.needed; } // 第三步:增加建筑持有量 this.amount += 1; return true; // 返回购买成功标识 } }
3. 正确创建Building实例
在player.buildings中直接传入资源引用和需求数组,确保Building实例能直接操作player的资源:
const player = { resources: { red: { amount: 3, tag: "#red" }, blue: { amount: 4, tag: "#blue" } }, buildings: { purple: new Building(0, "#purple", [ { resource: player.resources.red, needed: 5 }, { resource: player.resources.blue, needed: 92 } ]) } };
4. 测试购买流程
调用buy方法即可自动完成资源检查与扣减:
// 资源不足时购买失败 console.log(player.buildings.purple.buy()); // false console.log(player.resources.red.amount); // 3(未被修改) // 补充足够资源 player.resources.red.amount = 10; player.resources.blue.amount = 100; // 购买成功,资源被扣减,建筑数量增加 console.log(player.buildings.purple.buy()); // true console.log(player.resources.red.amount); // 5 console.log(player.resources.blue.amount); // 8 console.log(player.buildings.purple.amount); // 1
内容的提问来源于stack exchange,提问作者GameStuff
相关产品推荐
相关产品推荐

