【问题标题】:Javascript Case: "look at" + itemJavascript 案例:“看”+ 项目
【发布时间】:2015-12-28 20:02:36
【问题描述】:

好的,所以这可能是重复的,但我个人没有在互联网或 Stackoverflow 上看到任何关于此的内容。

我正在开发一个游戏项目,并且一直在尝试制作基于文本的游戏。

在这个游戏中,我有一个 switch 语句,用于当用户输入命令时。

到目前为止,我已经有了 Inventory 和 Look(环顾环境)的东西,但是如何在 switch 语句中处理特定的东西呢?

例如:

submit = function(input) {
    switch(input) {
        case "LOOK":
            lookaround();
            break;
        case "LOOK AT" + item:
            look();
    }
}

这是我遇到问题的 LOOK AT 行。我不知道如何使字符串以这种格式工作,除非我对每个项目都有单独的案例,例如案例“看橙色”或案例“看树”。

我希望我已经足够彻底地解释了这一点。谁能给我一些建议?

谢谢

编辑

我认为重要的是要注意用户正在将输入输入到输入框中,因此输入的值将是一个字符串。

如果对查看我制作的代码有帮助,请在下面的 cmets 中告诉我。

编辑

感谢您的帮助!

我使用了正则表达式(感谢@red-devil)和混合切片。现在完美运行!

【问题讨论】:

  • 您正在尝试定义解析器,因此您需要一种将输入拆分为标记的方法。更高级的方法是编写一个完整的词法分析器as you might in this example。这里的想法是您可以定义您的程序可以理解的语法并处理look at orangelook up 之类的情况。您可能希望查看 Z-Machine 作为以前如何完成此操作的示例。
  • 1 问题是如何处理无限多的情况。但首先,如果可能的话,摆脱"LOOK AT" + item 并使用case item。如果情况只是 LOOK,请在进入 switch 之前处理它。有无数个案例吗?
  • 感谢@RedDevil!这帮助很大!

标签: javascript string input switch-statement case


【解决方案1】:

Switch 适用于常量,而不是 'LOOK AT' + anything 之类的表达式。

您可以定义一个对象,将您的任何案例映射到您自己的函数。像这样:

var looks = {
  'lookat-something' : function() {
    alert('something');
  },
  'lookat-other-thing' : function() {
    alert('other thing');
  },
};


var x = 'lookat-other-thing';

looks[x]();

它比以任何方式使用 switch 都灵活得多。

【讨论】:

    【解决方案2】:

    如果我理解正确,您希望用户能够输入LOOK AT,然后输入任何项目名称。这里的问题是你有这个不祥的item 变量,它可以代表任何东西,但这是行不通的。 我会建议以下两种方法之一: 按照您的示例进行:

    submit = function (input) {
        switch (true) {
            case input == "LOOK":
                alert("Look")
                break;
            case input.startsWith("LOOK AT"):
                alert(input)
                break;
        }
    }
    
    if (typeof String.prototype.startsWith != 'function') {
        String.prototype.startsWith = function (str) {
            return this.slice(0, str.length) == str;
        };
    }
    

    其次,这是我推荐的方法,您实现了一种将任何输入解析为命令和参数的方法。一种方法是在每个空格字符处拆分输入,然后第一个值是命令,其余的是参数。这将要求您使用像LookAt 这样的单字命令,而不是LOOK AT。 所以是这样的:

    function submit(input) {
        var parts = input.split(" ");
        var cmd = parts[0];
        var args = parts.slice(1);
    
        switch (cmd) {
            case "Look":
                lookAround();
                break;
    
            case "LookAt":
                lookAt(args[0]);
                break;
        }
    }
    

    【讨论】:

    • -1 代表switch (true)。仅仅因为 OP 使用了 switch 语句并不意味着答案应该。这是if-else 块的链。
    • 我看不出switch(true) 有多糟糕。每个switch 语句基本上是一个if-else 块链,如果您在每个case 的末尾使用break。此外,它不会以任何方式损害性能,它甚至可能比 if-else (jsperf.com/if-else-chain-vs-switch-true) 更快
    • 它损害了可读性。 switch 语句的目的是将变量与一组互斥的常量进行比较,并评估它与哪个常量匹配。您已经颠倒了这种关系(将单个常量与一组评估进行比较,其中不止一个可能匹配)。表达检查该值的想法只是错误的控制结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2014-05-08
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多