1

わかりました、これは非常に単純であるべきだと思いますが、私の人生ではそれを理解することはできません. ハングマン プログラムの文字列内の char を検索する関数を作成しようとしています。だから私は思いついた:

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;
}

各タスクを 1 つの単純なことを実行する関数に分割するようにしてください。文字が特定の文字列に含まれているかどうかを検出する関数は、それ以上のことを行うべきではありません。この関数が何回返さ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();

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();
于 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 に答える