【问题标题】:Cleaning up multiple if statements C++清理多个 if 语句 C++
【发布时间】:2017-06-06 19:09:20
【问题描述】:

我正在学习“Udemy - 通过开发你的第一个游戏来学习 C++ 编码”,这是一门虚幻引擎 C++ 基础课程,在本课程中,您将开发一个用户尝试猜测单词的小游戏。

代码运行良好。但我想添加它。我创建了下面的代码,效果很好。但它是UGGGGLLLY。由于我仍处于早期学习阶段,我想开始养成正确的习惯。

所以问题是如何使所有这些 If 语句消失或浓缩。 如果我想再添加 50 个单词,我不想再创建 50 个 if 语句。

我尝试将 ISecret 更改为 FString 并使用该数字从 HIDDEN_WORD[1] 获取数字,但它没有按计划工作。

这是我的想法:

ISecret[1-100] = MyHiddenWord[1-100] = HIDDEN_WORD[1-100]

我知道这行不通,我知道我必须列出银行中的“单词”,但我可以创建一个单词库并只列出银行中的所有单词吗?

    int32 ISecret;             //This section generates a 
    srand(time(NULL));        // random number between 1 and 10.
    ISecret = rand() % 10, 1;///

    const FString HIDDEN_WORD01 = "planet";
    const FString HIDDEN_WORD02 = "bait";
    const FString HIDDEN_WORD03 = "dog";
    const FString HIDDEN_WORD04 = "cat";
    const FString HIDDEN_WORD05 = "stream";///  These are the Hidden words
    const FString HIDDEN_WORD06 = "taco";
    const FString HIDDEN_WORD07 = "ship";
    const FString HIDDEN_WORD08 = "balcony";
    const FString HIDDEN_WORD09 = "tail";
    const FString HIDDEN_WORD10 = "barf";

         if (ISecret == 1){MyHiddenWord = HIDDEN_WORD01;}
    else if (ISecret == 2){MyHiddenWord = HIDDEN_WORD02;}
    else if (ISecret == 3){MyHiddenWord = HIDDEN_WORD03;}// These make is so
    else if (ISecret == 4){MyHiddenWord = HIDDEN_WORD04;}//what ever number 
    else if (ISecret == 5){MyHiddenWord = HIDDEN_WORD05;}//is randomly 
    else if (ISecret == 6){MyHiddenWord = HIDDEN_WORD06;}//generated that  
    else if (ISecret == 7){MyHiddenWord = HIDDEN_WORD07;}//the correct
    else if (ISecret == 8){MyHiddenWord = HIDDEN_WORD08;}//HIDDEN_WORD
    else if (ISecret == 9){MyHiddenWord = HIDDEN_WORD09;}//is chosen.  
    else if (ISecret == 10){MyHiddenWord = HIDDEN_WORD10;}

【问题讨论】:

  • ISecret = rand() % 10, 1; 你在这里用逗号是什么意思?
  • 你为什么不简单地使用FString的数组呢?然后就是MyHiddenWord = HidenWordArray[ISecret - 1];
  • @melpomene A 颜色。注意单数 A。所以这真的不是反例。
  • @melpomene 颜色是单个聚合。您创建这个单一聚合的容器。
  • 一条Employee记录可以用50个字段来描述。程序员将创建单个结构或类,而不是Employee employee1, employee2, employee3, etc.,它只是Employee employee[50],或类似的结构。不知道还能怎么解释我的观点。

标签: c++ string if-statement


【解决方案1】:

您可以将它们存储在std::array

#include<array>

const std::array<FString, 10> hidden_words =
{
    "planet",
    "bait",
    "dog",
    "cat",
    "stream",
    "taco",
    "ship",
    "balcony",
    "tail",
    "barf"
};

int main()
{
    int ISecret = 0;
    std::cout<<hidden_words[ISecret]<<std::endl;
}

std::vector&lt;Fstring&gt;

一般来说,如果您打算使用整数来区分每个元素,则将元素存储在数组中会很有好处。

【讨论】:

  • 按照 OP 的意图,hidden_words[ISecret - 1] 就可以了。
  • 更简单(可能更快),例如:FString hidden_words[] = { "planet", "bait",... };
  • @AndrewHenle 通常std::array 应该优先于原始数组。 std::array vs array performance
  • @songyuanyao 没有基准的性能声明是没有用的。
  • @AndrewHenle 很​​好,原始数组也更快的说法是有效的。但这不仅仅是关于std::array 更可取的性能问题。
【解决方案2】:

首先,

ISecret = rand() % 10, 1;

错了。此语句等效于ISecret = rand() % 10;,而1 无效(这会触发编译器警告)。

如果您想要 [1, 10](含)范围内的随机数,您应该这样做:

ISecret = rand() % 10 + 1;

要为给定的数字选择一个单词,最简单的方法可能是数组:

const FString hidden_word[] = {
    "planet",
    "bait",
    "dog",
    "cat",
    "stream",
    "taco",
    "ship",
    "balcony",
    "tail",
    "barf"
};
ISecret = rand() % 10;  // a number between 0 and 9
MyHiddenWord = hidden_word[ISecret];

【讨论】:

  • 请注意,std::array 也可以用来代替原始数组。
  • 值得注意的是,C++ 数组是基于 0 的,因此如果不特别注意确保每次索引数组时减一。
【解决方案3】:

除了答案之外,您还可以执行多态性。你可以看看这些例子

dynamical binding or switch/case?

how inheritance replace the switch case?

祝你好运……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多