如何让随机数生成后供其他变量访问?JavaScript游戏开发问题
问题分析与解决方案
先聊聊你遇到的核心问题:你在randomize()函数里更新了全局的rnd变量,但target和id这俩变量还是页面初始加载时的旧值,没跟着新的rnd同步更新;而且showBack()函数一直用的是最开始的id,所以点击按钮生成的新随机数根本没作用到隐藏逻辑上。
另外提个小细节:你的sortByOrder函数有问题——开头那段x = Math.random(); if (x <0.5) return 1; else return -1;直接就return了,后面基于order属性的排序判断根本不会执行,这个函数其实只是在随机打乱数组。要是你本来想按order字段排序,得把这段随机代码删掉才行。
下面给你两种实用的修改思路:
思路一:在randomize里同步更新所有相关变量
把target和id的更新逻辑放进randomize()里,这样每次点击按钮调用这个函数时,所有关联变量都会同步刷新:
function randomize() { rnd = Math.floor(Math.random() * 9); // 同步更新目标名称和元素ID target = icons[rnd].name; id = icons[rnd].id; }
另外建议你在showBack()里加一步:先把之前隐藏的元素恢复可见,再隐藏新的目标,不然会出现越来越多元素被隐藏的情况:
function showBack() { // 先让所有图标恢复可见 icons.forEach(icon => { document.getElementById(icon.id).style.visibility = "visible"; }); // 再隐藏当前选中的目标 document.getElementById(id).style.visibility = "hidden"; }
思路二:去掉冗余全局变量,直接用rnd获取目标
其实你没必要把target和id存成全局变量,用到的时候直接通过rnd从icons数组里取就行,这样从根源上避免变量不同步的问题:
// 删掉全局的target和id变量 var rnd = Math.floor(Math.random() * 9); function randomize() { rnd = Math.floor(Math.random() * 9); } function showBack() { // 先恢复所有图标可见 icons.forEach(icon => { document.getElementById(icon.id).style.visibility = "visible"; }); // 直接用最新的rnd获取对应元素并隐藏 document.getElementById(icons[rnd].id).style.visibility = "hidden"; }
这样每次点击按钮生成新随机数后,showBack()都会用最新的rnd找到对应图标隐藏,完美解决你说的变量访问问题~
内容的提问来源于stack exchange,提问作者JCS
相关产品推荐
相关产品推荐

