基于文本的游戏 - 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" && string2 == "somethingelse")
之类的吗?请改写您的问题,以便更容易理解您正在尝试的内容。
您正在阅读来自cin
的两个单词,因此您需要在输入中的一行或两行中提供两个单词。
谢谢@GillBates 我添加了错误的符号来加在一起。我用+而不是&&,但是|| sum 在这一点上的工作原理相同,所以再次感谢您:)
加法是 OR 运算,因为如果任一输入为非零 (true),则结果为非零 (true)。乘法是 AND 运算,因为仅当两个输入均非零 (true) 时结果才非零 (true)。所以不要使用+
,使用*
(或者,更好的是&&
)。
要让它重新开始,您需要使用循环结构,例如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 功能?