首页 > 解决方案 > 如果 X 秒后 A 和 B 相同,则减少 A

问题描述

我目前正在尝试通过创建增量游戏来学习 JavaScript。

如果玩家正在互动或“雇用”新兵,我的变量之一(称为“名誉”)应该总是上升。但是,如果他们闲置并且新兵已经“死亡”,我希望声望缓慢下降,并且随着时间的推移下降速度增加,直到声望为0。

我想我已经找到了著名的减少乘数,但我正在努力解决的部分是“空闲”状态。

这是我目前拥有的代码:

window.setInterval(function () {
    var lastrenown = renown;
    document.getElementById("lastrenown").innerHTML = lastrenown;
}, 3000);

function renowndeccalc() {
    if (renown != 0) {
        if (renown == lastrenown) {
            renown = renown - (100 * idlerenownmultiplier);
            document.getElementById("renown").innerHTML = renown;
            idlerenownmultiplier++
        }
    }
}

setInterval(renowndeccalc, 5000);

这里的目的是每 3 秒更新一次“lastrenown”以匹配 renown。如果玩家或新兵处于活跃状态,lastrenown 永远不应等于 renown。

如果玩家或新兵不活跃,lastrenown 应该等于 renown,此时每 5 秒 renown 减少 100 * 乘数。

实际发生的事情是名声根本没有改变。如果我删除 0 检查,则功能如下:

function renowndeccalc() {
        if (renown == lastrenown) {
            renown = renown - (100 * idlerenownmultiplier);
            document.getElementById("renown").innerHTML = renown;
            idlerenownmultiplier++
        }
}

5秒后声望会下降100,然后不再重复。

我的理解是 setInterval 应该会导致函数重复您确定的频率,但是逻辑中的某些内容导致我的脚本无法按预期工作。

对此的任何帮助将不胜感激。

标签: javascriptlogicsetinterval

解决方案


我最终想通了:我应该使用一个函数并计算其中的所有内容,如下所示:

function renowndeccalc() {
    if (renown != 0) {
        if (renown <= 0) {
            renown = 0;
            lastrenown = 0;
            document.getElementById("renown").innerHTML = renown;
            document.getElementById("lastrenown").innerHTML = lastrenown;
            idlerenownmultiplier = 1;
        }
        else if (renown > lastrenown) {
            lastrenown = renown;
            document.getElementById("lastrenown").innerHTML = lastrenown;
        }
        else if (renown == lastrenown) {
            var calc = 100 * idlerenownmultiplier;
            if (calc > renown) {
                renown = 0;
                lastrenown = 0;
                document.getElementById("renown").innerHTML = renown;
                document.getElementById("lastrenown").innerHTML = lastrenown;
                idlerenownmultiplier = 1;
            }
            else {
                renown = renown - calc;
                lastrenown = renown;
                document.getElementById("lastrenown").innerHTML = lastrenown;
                document.getElementById("renown").innerHTML = renown;
                idlerenownmultiplier++
            }
        }
    }
}

setInterval(renowndeccalc, 5000);

推荐阅读