好吧,我觉得这应该非常简单,但对于我的生活,我无法理解。我正在尝试编写一个函数来查找一个字符串中的字符,以用于一个hangman程序。因此,我想出了:
int drawHangman(char trY, string wordA)
{
int wrongTries = 0,
if(wordA.find(trY) != string::npos) //checking to see if char is in word
wrongTries++; //if its not, ++
else
wrongTries = wrongTries; //if it is, do wrong tries remains the same
return wrongTries; //return # wrong tries
}
Suggetions?
答案 0 :(得分:5)
您已经找到了如何检查某个字符是否在给定字符串中(find
函数)。保持简单:
bool isInside(const std::string & str, char c)
{
return str.find(c) != std::string::npos;
}
尝试将每个任务分成一个执行一个简单操作的函数。查找字符是否在给定字符串中的函数应该只执行此操作。计算此函数返回false
的次数是另一个函数的问题,因为这是一个无关的任务(与搜索无关)。
你的drawHangman
函数应该专注于实际绘制刽子手,例如通过参数给出用户失败的次数。
答案 1 :(得分:1)
如果我理解正确,那么你需要的是以下
size_t drawHangman( const std::string &word, char c )
{
static size_t wrongTries = 0;
if ( word.find( c ) != std::string::npos )
{
return ( wrongTries = 0 );
}
else
{
return ( ++wrongTries );
}
}
如果您需要重置wrongTries,可以使用某些任意值调用i,例如
drawHangman( " ", ' ' );
如果您不想按照我上面显示的方式调用函数来重置wrongTries,那么您可以通过以下方式定义它
size_t drawHangman( const std::string &word = " ", char c = ' ' )
{
static size_t wrongTries = 0;
if ( word.find( c ) != std::string::npos )
{
return ( wrongTries = 0 );
}
else
{
return ( ++wrongTries );
}
}
你可以简单地称之为
drawHangman();
重置wrongTries。
如果您需要不区分大小写的搜索,则可以使用标准算法std::find_if
。例如
#include <algorithm>
size_t drawHangman( const std::string &word, char c )
{
static size_t wrongTries = 0;
suto it = std::find_if( word.begin(), word.end(),
[=]( char t ) { return ( std::toupper( t ) == std::toupper( c ) ); } );
if ( it != word.end() )
{
return ( wrongTries = 0 );
}
else
{
return ( ++wrongTries );
}
}
另一方面,如果您需要计算字符串中不存在字符的所有情况,您可以按以下方式编写函数
int drawHangman( const std::string &word = "", char c = '\0' )
{
static int wrongTries = 0;
if ( word.empty() )
{
wrongTries = 0;
return wrongTries;
}
if ( word.find( c ) != std::string::npos )
{
return ( -wrongTries );
}
else
{
return ( ++wrongTries );
}
}
因此,您可以通过以下方式检查字符串中是否存在字符
if ( drawHangman( SomeString, SomeChar ) <= 0 )
{
// the character is found in the string
}
else
{
// the character is not found in the string
}
如果您需要重置wrongTries,可以将该函数调用为
drawHangman();
答案 2 :(得分:1)
它会区分大小写,所以如果wordA =“space”(我将假设这个单词已全部为小写),你会找到'C',你将找不到'C'寻找'c'但会找到'c'。
您可以使用std::tolower确保trY字符设置较低,再次假设wordA已经是小写。*
bool IsValidLetter(char trY, const std::string& wordA)
{
if (wordA.find(std::tolower(trY)) != std::string::npos)
{
return true;
}
return false;
}
注意我在这种情况下删除了wrongTries计数器,因为你只是测试(此时)字母中是否存在字母。
然后你想要保留一个容器,可能是一个向量,包含到目前为止已尝试过的所有字母,这可能是有用的伪代码。
int CountWrongLetters(attemptedLetters, wordA)
{
int wrong = 0;
foreach letter in attemptedLetters
{
if (IsValidLetter(letter, wordA) == false)
{
wrong++;
}
}
return wrong;
}
其他地方会处理根据返回的数字绘制刽子手显示的每个部分的逻辑,以及结束游戏的逻辑。