1

好的,我觉得这应该非常简单,但是对于我的生活,我无法弄清楚。我正在尝试编写一个函数来在一个刽子手程序的字符串中查找一个字符。所以我想出了:

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
}

建议?

4

3 回答 3

6

您已经找到了如何检查一个字符是否在给定字符串(find函数)中。保持简单:

bool isInside(const std::string & str, char c)
{
    return str.find(c) != std::string::npos;
}

尝试将每个任务分成一个执行一件简单事情的函数。查找一个字符是否在给定字符串中的函数应该只做这些。计算这个函数返回多少次false是另一个函数的事情,因为这是一个不相关的任务(即与搜索无关)。

您的drawHangman函数应该只关注实际绘制刽子手,例如通过参数给出用户失败的次数。

于 2014-05-02T16:56:17.180 回答
2

如果我对您的理解正确,那么您需要的是以下内容

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();

重置错误尝试。

如果您需要不区分大小写的搜索,则可以使用标准算法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();
于 2014-05-02T16:56:40.947 回答
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;
}

其他地方将根据返回的数字处理绘制刽子手显示每个部分的逻辑,以及结束游戏的逻辑。

于 2014-05-02T17:00:54.173 回答