Class 继承是这个';故事和选项';基于冒险的应用程序?

Class 继承是这个';故事和选项';基于冒险的应用程序?,class,inheritance,game-engine,Class,Inheritance,Game Engine,我和一位朋友正在制作一款鸡皮疙瘩式的冒险游戏,在每个阶段,用户都会看到一组潜在的4种选择,用户的选择会影响故事的结局 我应该为此使用什么数据结构 这是我的主要想法——对象 为了使游戏尽可能接近这些卡的真实想法,创建一个“卡”基类,并从中继承许多其他卡-超类将包含Stringx5(x1story X4ChoiceStores)intx5(X1CardNumber X4CardChoices) 这将允许我用我们已有的材料轻松地输出对象,并有一个系统类控制用户选择的所有处理和在屏幕上显示信息。同样,有

我和一位朋友正在制作一款鸡皮疙瘩式的冒险游戏,在每个阶段,用户都会看到一组潜在的4种选择,用户的选择会影响故事的结局

我应该为此使用什么数据结构

这是我的主要想法——对象

为了使游戏尽可能接近这些卡的真实想法,创建一个“卡”基类,并从中继承许多其他卡-超类将包含Stringx5(x1story X4ChoiceStores)intx5(X1CardNumber X4CardChoices)

这将允许我用我们已有的材料轻松地输出对象,并有一个系统类控制用户选择的所有处理和在屏幕上显示信息。同样,有了这个系统和一个基本的卡片类,它将允许将来发生不同的故事等等。尽量使其可重用,并尽可能少地编写代码(我不会编写超过一千条
if
语句)

有一件事我还不清楚(我在《找不到答案》一文中提出这个问题的真正原因是):继承不是应该用于其他类似但略有不同的类,例如经理和员工,这使我的想法完全错误,造成了大量的内存浪费

我已研究过以下事项:

  • 哈希表:示例似乎更倾向于电话簿,我认为它不适合我的需要
  • 定义故事类型的抽象:似乎也不适合我的需要

    • 这应该不会太糟糕。本质上,您需要一个树结构

      您的主要类可能看起来像(请原谅我缺乏c++知识)

      因此,您的
      节点
      实例可以指向
      节点
      的其他实例

      最好是有一些节点实例的集合,这样就可以有任意多或任意少的节点实例。您可以向节点添加一个字段,指示它是哪个选项(1、2等)


      您唯一需要的另一件事是引用初始节点。

      不需要继承,因为卡片完全相同,只是上面的数据发生了变化。如果有特殊的卡需要与其他卡不同的行为,我会使用继承

      您可以使用类似以下伪代码的内容执行任何操作:

      class Card {
          Card getChoice(int i); // returns choices[i]
          string storyText;
          Card[] choices; // Use an stl collection rather than an array for ease of addition.
      }
      
      基本上,您创建每张卡,使其链接到所有其他卡(这里的诀窍是确保您以正确的顺序创建卡-简单的解决方案:创建它们时没有选择,稍后通过
      addChoice(card)
      方法添加不同的选择

      您的
      游戏
      类从第一张牌开始(基本上是所有牌的树首),并执行如下操作:

      Card runCard(Card card)
      {
          Card nextCard = null;
          showStoryText(card);
          // Display a line for each choice in the card and get the user's response.
          // Convert the response to the correct index.
          int selection = promptForAction(card);
          if (selection >= 0 && selection < card.numChoices()) {
              nextCard = card.getChoice(selection);
          }
          return nextCard;
      }
      
      void run()
      {
          Card card = firstCard;
          while(card != null) {
              card = runCard(card);
          }
      }
      
      卡片运行卡(卡片)
      {
      卡片nextCard=null;
      showStoryText(卡片);
      //为卡中的每个选项显示一行,并获取用户的响应。
      //将响应转换为正确的索引。
      int选择=提示(卡片);
      如果(选择>=0&&selection
      是的,基本上就是这样。一个类的实例,我不知道为什么我会考虑创建很多类……FacePalm使用John3136的循环思想,应该会让它很棒,只需添加数据就可以了。BunnyDrug,你可以从文本文件或lite weight数据库中读取数据。
      Card runCard(Card card)
      {
          Card nextCard = null;
          showStoryText(card);
          // Display a line for each choice in the card and get the user's response.
          // Convert the response to the correct index.
          int selection = promptForAction(card);
          if (selection >= 0 && selection < card.numChoices()) {
              nextCard = card.getChoice(selection);
          }
          return nextCard;
      }
      
      void run()
      {
          Card card = firstCard;
          while(card != null) {
              card = runCard(card);
          }
      }