我应该如何等待用户输入?

时间:2018-07-18 17:29:25

标签: javascript

我正在用浏览器用Javascript制作类似文字冒险游戏的游戏。

除了实际处理用户输入的少量逻辑以及程序对该输入的响应之外,我几乎完成了所有操作。目前,我对实现此目标的最佳方法有些困惑。

我当前的想法是递归switch函数:

mainLoop("Introduction");

function mainLoop(section) {
    switch(section) {
        case "Introduction":
            // Do stuff with the introductory scene
            // Await input
            mainLoop("Gather supplies");
            break;

        case "Gather Supplies":
            // Do stuff
            mainLoop("Make a decision");
            break;

        case "Make a decision":
            // Do stuff
            // Await decision (userDecision)
            if(userDecision == "Left") {
                mainLoop("Ending 1");
            } else {
                mainLoop("Ending 2");
            }
            break;

        case "Ending 1":
            // Do stuff
            break;

        case "Ending 2":
            // Do stuff
            break;
    }
}

我的问题是我不知道如何等待用户输入。

我曾经考虑过让while循环永远运行,并且只有在它收到来自某些handleUserInput()的信号时才进行循环,但是据我了解,这将占用整个线程-我无法不要在secondaryLoop()旁边再运行另一个while和它自己的mainLoop()

解决此问题的最佳方法是什么?

编辑:我应该指定检测输入本身已经设置。用户键入他们的语句/命令,然后将其传递到handleUserInput(),在本例中,该case将生成一个与主循环中的相关handleUserInput()相对应的字符串。如果我不使用这种技术,那么function onlyInternal (req, res, next) { if (!ReqHelpers.isInternal(req)) { return res.status(HttpStatus.FORBIDDEN).send() } next() } // Expose the middleware functions module.exports = { onlyInternal } 会执行mainloop要求的任何操作。

1 个答案:

答案 0 :(得分:0)

自我回答。

我最终弄清楚了如何做到这一点,它比我预期的要简单得多。

我首先将case参数传递给向用户提供这些选项的函数。在不需要来自用户的输入的情况下,我绕过了这一步,并像上面一样用下一个mainLoop调用了case

mainLoop("Introduction");

function mainLoop(section) {
    switch(section) {
        case "Introduction":
            // Do stuff with the introductory scene
            presentOptionsToUser(["Gather supplies"]);
            break;

        case "Gather Supplies":
            // Do stuff
            mainLoop("Make a decision");
            break;

        case "Make a decision":
            // Do stuff
            presentOptionsToUser(["Ending 1","Ending 2"]);
            break;

        case "Ending 1":
            // Do stuff
            break;

        case "Ending 2":
            // Do stuff
            break;
    }
}

presentOptionsToUser接受一系列可能的选项,并创建按钮供用户按下(或其他输入形式)。这些按钮具有mainLoop的功能,例如mainLoop("Ending 1")

通过这种方式,递归循环得以保留,但由于用户输入而被破坏。