基于文本的游戏 - std::string 来自新手的一些问题

Posted

技术标签:

【中文标题】基于文本的游戏 - std::string 来自新手的一些问题【英文标题】:Text based game - std::string some questions from a newbie 【发布时间】:2016-11-28 14:39:11 【问题描述】:

我可能有一个非常简单的问题,但作为一个编程新手,即使多次尝试和错误,我也无法找到解决方案。我在一个简单的基于文本的冒险游戏上训练我迄今为止学到的东西,但我遇到了问题。首先,我使用的是字符串,但我无法在 if 中使用两个字符串来找出合适的情况。

#include<iostream>
#include <string>
using namespace std;

int main ()

    string podpalam = "podpalam";
    string papier = "papier";
    cout << "Stoisz w wielkim ciemny pokoju. W reku trzymasz kawalek PAPIERU, \n a w kieszeni spoczywa pudelko ZAPALEK. Co robisz?" << endl;
    cin >> podpalam >> papier;
    if ( podpalam == "podpalam")
        cout << "Pokoj rozswietla sie od plomieni palacej sie kartki.";
    else
        cout << "Pomysl przez chwile. To niekoniecznie prawidlowe wyjscie." << endl;
    cout << " \nKoniec" << endl;
    return 0;

所以你可以看到我有两个字符串,都叫不同,但只有一个被添加到 if,但你仍然需要 cin 另一个字符串来继续冒险,但第二个字符串可以只是一个简单的字母或符号。我尝试向 if 添加两个字符串,但我不能。也许这是不可能的,我正在与空气作斗争,但我见过像 Zork 这样的游戏使用两个词并且效果很好。

另一件事是我不希望我的程序在你出错时结束,我希望它重新启动。就像你犯了一个错误,你死了,现在你可以重新开始。真的不知道它的命令,也无法在 Google 或 Youtube 中找到答案。

【问题讨论】:

“我尝试在 if 中添加两个字符串,但我无法...” 你的意思是 if ( string1 == "something" &amp;&amp; string2 == "somethingelse") 之类的吗?请改写您的问题,以便更容易理解您正在尝试的内容。 您正在阅读来自cin 的两个单词,因此您需要在输入中的一行或两行中提供两个单词。 谢谢@GillBates 我添加了错误的符号来加在一起。我用+而不是&&,但是|| sum 在这一点上的工作原理相同,所以再次感谢您:) 加法是 OR 运算,因为如果任一输入为非零 (true),则结果为非零 (true)。乘法是 AND 运算,因为仅当两个输入均非零 (true) 时结果才非零 (true)。所以不要使用+,使用*(或者,更好的是&amp;&amp;)。 要让它重新开始,您需要使用循环结构,例如while 语句。 【参考方案1】:

对于初学者,尤其是在学习编程时,如果使用大括号,管理代码块会容易得多。它们使查看哪些行与哪个块更容易(尽管您有很好的缩进)。例如:

cin >> podpalam >> papier;
if ( podpalam == "podpalam")
    cout << "Pokoj rozswietla sie od plomieni palacej sie kartki." << endl;

else
    cout << "Pomysl przez chwile. To niekoniecznie prawidlowe wyjscie." << endl;


cout << " \nKoniec" << endl;

其次,您的部分问题可能是您在 else 中有 endl,但在 if 中没有。将其添加到 if 应该会有所帮助,因为行尾字符会强制控制台刷新输出。如果没有,可能是您的字符串正在打印,但它保存在尚未显示在屏幕上的缓冲区中。

【讨论】:

谢谢。我猜这个 endl 没有做任何事情,但是在 if 中添加两个单词的问题已经消失了,但是重启问题仍然存在。我的意思是,我希望程序重置购买它自己重新运行它:)【参考方案2】:

我认为您正在寻找布尔和 (&&) 运算符。这将检查语句的两个部分是否为真,如果不是则返回假。

例如:

if(podpalm == "podpalm" && papier== "papier") ... //this code won't run unless both variables 
//are set to what you specify

另一方面(对于未来的问题),您可能需要 OR (||) 运算符。如果语句的任何一部分为真或两半都为真,这将返回真。

还有其他布尔运算符,例如 NOT(!) 和 XOR(^),但您将使用 && 和 ||最多。

编辑:

如果您希望游戏像您描述的那样重新启动,请将整个事情放在一个 while 循环中以检查条件,然后在代码中设置该条件。这是一个例子:

#include<iostream>
#include <string>
using namespace std;

int main ()

  bool gameOver = false;
  while(gameOver == false)  //condition is met, start loop
    string podpalam = "podpalam";
    string papier = "papier";
    cout << "Stoisz w wielkim ciemny pokoju. W reku trzymasz kawalek PAPIERU, \n a w kieszeni spoczywa pudelko ZAPALEK. Co robisz?" << endl;
    cin >> podpalam >> papier;
    if ( podpalam == "podpalam") 


 cout << "Pokoj rozswietla sie od plomieni palacej sie kartki.";
        gameOver = true; //if it receives this input, end the game
    
    else 
        cout << "Pomysl przez chwile. To niekoniecznie prawidlowe wyjscie."   << endl;
        gameOver = false; //otherwise, keep the game going.
      
    cout << " \nKoniec" << endl;
    return 0;

【讨论】:

感谢您的帮助,但我已经在 Gill Bates 的帮助下解决了它,但重新启动仍然存在问题。我希望这个游戏在玩家做出错误决定时自行重置。我的意思是你玩,死了,游戏说,你死了,然后重置为一格。如何循环它或什么?【参考方案3】:

我不希望我的程序在你犯错时结束,我想要 它重新启动。

只需将游戏的主代码放入一个单独的函数中,然后在玩家做出“错误决定”时调用它:

#include<iostream>
#include <string>
using namespace std;

void game()

    string podpalam = "podpalam";
    string papier = "papier";
    cout << "Stoisz w wielkim ciemny pokoju. W reku trzymasz kawalek PAPIERU, \n a w kieszeni spoczywa pudelko ZAPALEK. Co robisz?" << endl;
    cin >> podpalam >> papier;
    if ( podpalam == "podpalam")
        cout << "Pokoj rozswietla sie od plomieni palacej sie kartki.";
    else
        cout << "Pomysl przez chwile. To niekoniecznie prawidlowe wyjscie." << endl;
    cout << " \nKoniec" << endl;

    //somewhere where the player made a bad decision:
    game(); //restart the game.
    return; // return from the function.


int main ()

  game();
  return 0;

不要尝试在 main() 内调用 main(),因为这是未定义的行为。

【讨论】:

所以我按照你说的做了这个,它有效,再次感谢你,但让我直截了当。虚空游戏正在作为一个实际上是游戏的功能工作,对吗?比你对编译器说的“从这里开始听 int main () 并在游戏代码运行的地方运行 game () 函数,而不是从 void game () 代码开始游戏?我想了解构建结构。顺便说一句。它工作得很好,现在我喜欢 c++ :) 我可以把这个无效的游戏代码放在一个单独的文件中,然后把它放在 int 主代码括号中吗?如果是,我该怎么做?

以上是关于基于文本的游戏 - std::string 来自新手的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

使用来自 boost::array 与 std::array 的 std::string::assign 不兼容

std::string,std::vector,std::accumulate注意事项

如何在带有来自 std::string 的 unordered_map 的字符串文字上使用 is_transparent 功能?

C++11 中 COW std::string 实现的合法性

清理来自 irc 的输入

如何获得 std::string 的准确长度?