我正在用浏览器用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要求的任何操作。
答案 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")
。
通过这种方式,递归循环得以保留,但由于用户输入而被破坏。