1

合計値に乱数を追加する 2 つの関数があります。

問題は、関数を呼び出して合計を出力するたびに加算されないことです。2 を生成すると、合計が 2 であると表示されます。その後、もう一度呼び出して 5 を生成すると、合計が 5 であると表示され、加算されません (これが発生した場合は 7 になるはずです)。

ここではすべてがうまく見えます...

int human(int humanscore)
{
    int diceRoll= rand() % 7;
    cout << "player rolled: ";
    humanscore+= diceRoll;
    cout << diceRoll;
    cout << "human score is: " << humanscore;
}

int computer(int compscore)
{
    int diceRoll= rand() % 7;
    cout << "computer rolled: ";
    compscore+= diceRoll;
    cout << diceRoll;
    cout << "computer score is: " << compscore;
}
4

3 に答える 3

9

関数に渡された引数の内部コピーの値を変更しています。外部変数で変更を行う場合は、代わりに参照を取るように関数定義を変更しますint& score

rand() % 7また、範囲[0、6]の値が得られることに注意してください。サイコロの値は [1, 6] の範囲にあり、1 + rand() % 6代わりに使用する必要があります。

* アップデート: *

これは、C++ 参照で行うことができます。

int computer(int& compscore)
{
    ...
    compscore += diceRoll;
    ...
}

int var = 0;
computer( var );

この宣言では、関数は実際の変数を引数として取り、関数内でvar行われた変更は変数に反映されます。その特定の呼び出しは、同じ変数のエイリアスにすぎません。compscorevarcompscorevar

C では、ポインターを使用して同じ効果が得られます。

int computer(int* compscore)
{
    ...
    *compscore += diceRoll;
    ...
}

int var = 0;
computer( &var );

この関数の呼び出しにより、変更する必要がある変数のアドレスが与えられます。一般的な使用では、参照を使用した最初の実装では、この最後のスニペットと同様のソリューションがコンパイラによって自動的に生成されると想定できます。

于 2011-10-11T23:11:50.100 に答える
1

あなたはcoutここdiceRollにいるので、合計ではなく現在のロールのみを印刷します。

サイコロの出目を正しく出力していると仮定すると、これらの関数の最後にreturn humanscore;andを記述return compscore;して、新しい結果に戻す必要もあります。

于 2011-10-11T23:12:38.640 に答える
1

パラメータを値で渡しています。これは、関数が完了すると、それらへの変更が破棄されることを意味します。スコアを維持したい場合は、いくつかの選択肢があります。パラメータを参照で渡すことができます。C++ では、スコアへのポインタを渡すことでこれを行うことができます。関数が新しいスコアを返すようにし、次に関数を呼び出すときに、返された値を関数に渡すことができます。また、グローバル変数を使用するという、あまり望ましくない解決策もあります。

于 2011-10-11T23:16:18.783 に答える