【问题标题】:How to create an add item function for a text rpg inventory?如何为文本 rpg 库存创建添加项目功能?
【发布时间】:2019-12-05 17:09:29
【问题描述】:

库存

vector<string> inventory;
vector<int> inventoryQ;

物品添加功能

void addItem(string item, int quantity){
    for(int i = 0; i < inventory.size(); i++){
      if(inventory[i] == item){
        inventoryQ[i] += quantity;
        cout << "x" << quantity << " " << item << " was added to your inventory." << endl;
      } else if(i == inventory.size()){
        inventory.push_back(item);
        inventoryQ.push_back(quantity);
        cout << "x" << quantity << " " << item << " was added to your inventory." << endl;
      }
    }
  }

使用示例

user.addItem("Gold", 1);

也没有文本输出到控制台。

【问题讨论】:

  • 请向我们展示所有相关代码。另外,您是否尝试过使用调试器?
  • 您能解释一下addItem 的代码应该如何工作吗?我可以看到错误的地方,也许可以写出更正确的东西,但我怀疑你能从中得到什么
  • 看起来你想实现某种查找,看看该项目是否已经在列表中,对吗?
  • 循环条件是i &lt; inventory.size(),所以else if中的i == inventory.size()永远不可能为真

标签: c++ function vector


【解决方案1】:

您似乎希望在迭代循环但未找到匹配项时采用 else if(i == inventory.size())

问题在于,在循环内部这个条件永远不会成立

只有在 循环之后才是真的。

因此,在循环之后移动该逻辑,并从匹配条件中return,或者设置一个布尔值来跟踪发生了什么。

【讨论】:

    【解决方案2】:

    问题是i 永远不会到达inventory.size()。您可以将方法重构为:

    void addItem(string item, int quantity) {
        // First check if the item already exists
        for(int i = 0; i < inventory.size(); i++) {
            if(inventory[i] == item){
                inventoryQ[i] += quantity;
                cout << "x" << quantity << " " << item << " was added to your inventory." << endl;
                return;
            }
        }
        // If it doesn't exist, add it to the inventory.
        inventory.push_back(item);
        inventoryQ.push_back(quantity);
        cout << "x" << quantity << " " << item << " was added to your inventory." << endl;
      }
    

    【讨论】:

      【解决方案3】:
      void addItem(string item, int quantity){
          for(int i = 0; i < inventory.size(); i++){
            if(inventory[i] == item){
              inventoryQ[i] += quantity;
              cout << "x" << quantity << " " << item << " was added to your inventory." << endl;
            } else if(i == inventory.size()){
              inventory.push_back(item);
              inventoryQ.push_back(quantity);
              cout << "x" << quantity << " " << item << " was added to your inventory." << endl;
            }
          }
      }
      

      好的,当我到达 inventory.size() 时,你的循环结束,那么在什么情况下你的 else-if 会发生?答:不会。

      您需要做的是从第一个 if 子句中的方法中返回:

            if(inventory[i] == item){
              inventoryQ[i] += quantity;
              cout << "x" << quantity << " " << item << " was added to your inventory." << endl;
              return;
            }
      

      然后如果你在循环结束时没有返回,那么就这样做:

              inventory.push_back(item);
              inventoryQ.push_back(quantity);
              cout << "x" << quantity << " " << item << " was added to your inventory." << endl;
      

      该代码在 for 循环之外,因为它只有在您到达数组末尾而没有找到已在库存中的项目时才会发生。

      现在,考虑一下...它。这是低效的。找到后就可以停下来了。

      如果你不喜欢从你的方法中间返回(有些人认为这是不好的设计),那么你需要保留一个布尔值是否找到该项目,将其设置在 if 子句中,并且仍然从 for 循环中中断,或将变量用作条件的一部分:

      bool found = false;
      for (int i = 0; !found && i < inventory.size(); i++) {
          if (...) {
              ...
              found = true;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        • 2013-07-07
        • 2022-07-26
        • 2011-09-27
        • 2018-10-18
        • 2021-11-12
        相关资源
        最近更新 更多