【问题标题】:Using multiple conditions in an if statement in C++在 C++ 中的 if 语句中使用多个条件
【发布时间】:2017-07-25 21:08:39
【问题描述】:

我正在尝试在 C++ 中创建一个复杂的 if 语句,这将使我免于编写一大堆 if 语句,我想知道下面的代码是否真的有意义,或者我忽略了一个错误。

if(input==choice) {
        cout << "Tie!" << endl;
}else if(input=="rock" && choice=="scissors"
     || input=="scissors" && choice=="paper"
     || input="paper" && choice=="rock") {
        cout << input " beats " << choice << ", you win!" << endl;
}else if(input=="rock" && choice=="paper"
    || input=="scissors" && choice=="rock"
    || input=="paper" && choice=="scissors"){
        cout << choice << " beats " << input << ", you lose!" << endl;
}

我想要实现的是:

"if input is x AND choice is y, OR if...."

基本上,我正在测试多个“if-and”条件,以便在满足任何 if-and 条件时执行单行代码。输出抛出“'operator||' 不匹配”错误。

【问题讨论】:

  • 如果性能很重要,我会尽量避免进行如此多的字符串比较。
  • @Bungles 我只是想创建一个简单的与计算机对抗的石头剪刀布游戏。我正在努力编写高效流畅的代码,所以我正在尝试一些新的东西。
  • input="paper" -> input=="paper",投票以错字结束。
  • 输入和选择有什么区别?你可能想想出更好的名字。
  • 只需编写一个接受inputchoice 的函数,进行测试,并返回一个指示结果的代码。当你转向 Rock、Paper、Scissors、Lizard、Spock 时,你会发现它的扩展性要好得多。

标签: c++ if-statement


【解决方案1】:

您在input="paper" &amp;&amp; choice=="rock") 中有错字,但我建议您修复代码,而不是修复错字。难怪你在这个巨大的条件块中犯了一个错字。你有很多重复和混合逻辑与输出。如果您在包含上花费一些行,则可以节省一些代码...

#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>

bool win(const std::string& input, const std::string& choice) {
    static const std::vector<std::pair<std::string, std::string>> wins = 
            { { "rock", "scissors" },
              { "scissors", "paper"  },
              { "paper", "rock" }
            };
    return std::find(wins.begin(), wins.end(), std::make_pair(input, choice))
        != wins.end();
}

int main() {
    std::string choice = "paper";
    std::string input = "scissors";
    if (win(choice, input)) { std::cout << "you win! \n"; }
    else                    { std::cout << "you lose! \n"; }
}

下一步,您应该消除所有这些字符串,例如使用 cmets 中讨论的枚举。

【讨论】:

  • 创建一个向量是过度设计它。有固定数量的选择,所以至少使用std::array,直接实现winif (input == "rock") { return choice == "scissors" } else if ... 对于程序员和编译器。
  • 谢谢,我认为我不太了解这段代码的每一部分以及它为什么起作用,但这是我想要实现的目标。
  • @DanielH imho 使用std::array 会过度工程化。为什么在字面上无关紧要时坚持固定大小?对于你的第二点,它可能是一个品味问题。无论如何,我展示的代码只是作为 OP 的起点,我希望你同意它比原始代码更容易阅读
  • 在我之后查看 OP 的评论。这段代码更易于阅读,但只有在您已经对标准库足够熟悉以识别它在做什么时。如果您是 C++ 新手,即使您熟悉其他语言的编程,也很难弄清楚发生了什么,即使代码中的内容胜过更容易发现的内容。
  • @sS5H,该技术称为表查找,它是您的工具包中的重要工具。当您需要在程序中嵌入规则时,查找表会派上用场。在这种情况下,有三个规则,在wins 表中很容易看到,但在你的巨型if 语句中很难看到:它们是,“摇滚”击败“sci”,“sci”击败“ pap”,并且“pap”击败“rock”。 en.wikipedia.org/wiki/Lookup_table
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 2019-03-01
  • 2015-01-20
  • 2011-09-12
  • 1970-01-01
  • 2013-06-17
相关资源
最近更新 更多