Node.js ESM:多文件共享玩家生命值变量的实现方案
解决ESM下共享固定随机生命值的问题
要实现单一生成的随机生命值在三个文件间共享且可更新,你需要将随机值封装为模块内的状态,并通过导出的函数来访问和修改它,而不是每次调用都生成新值。以下是具体修改方案:
1. 修改randomHealth.js:封装状态与操作函数
将原生成函数改为模块内的固定初始值,同时导出获取和更新生命值的函数:
// randomHealth.js // 模块加载时生成初始随机生命值(只执行一次) let currentPlayerHealth = Math.floor(Math.random() * 300 + 1); // 获取当前生命值 export const getPlayerHealth = () => currentPlayerHealth; // 更新生命值:支持传入具体数值,或不传则重新随机生成 export const updatePlayerHealth = (newHealth) => { if (typeof newHealth === 'number') { currentPlayerHealth = Math.max(0, newHealth); // 防止生命值为负数 } else { currentPlayerHealth = Math.floor(Math.random() * 300 + 1); } };
2. 修改stats.js:展示当前生命值
导入获取函数,每次调用时显示最新的生命值:
// stats.js import { getPlayerHealth } from "./random/randomHealth.js"; export const showStats = () => { console.log("STATS"); console.log(`Player Health: ${getPlayerHealth()}`); };
3. 修改fight.js:使用并更新生命值
导入获取和更新函数,战斗中使用初始值,战后更新生命值:
// fight.js import clear from "console-clear"; import { getPlayerHealth, updatePlayerHealth } from "../utils/random/randomHealth.js"; export const fight = async () => { clear(true); const initialHealth = getPlayerHealth(); console.log(`战斗开始!当前生命值:${initialHealth}`); // 模拟战斗逻辑(示例:受到80点伤害) const damageTaken = 80; const remainingHealth = initialHealth - damageTaken; // 更新生命值 updatePlayerHealth(remainingHealth); console.log(`战斗结束!剩余生命值:${getPlayerHealth()}`); };
原理说明
ESM模块是单例模式,模块内的变量currentPlayerHealth只会在模块首次被导入时初始化一次。所有导入该模块的文件都会共享同一个变量实例,通过导出的getPlayerHealth和updatePlayerHealth函数,就能保证三个文件访问的是同一个生命值数值,且更新后所有文件都会同步看到最新值。
内容的提问来源于stack exchange,提问作者TheVS
相关产品推荐
相关产品推荐

