2011-10-11 42 views
1

我有兩個函數,我將隨機數添加到總值。增加陳述後值不會增加嗎?

問題是,我每次調用函數並打印總數時,都不會添加。如果它生成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; 
} 
+0

這是功課嗎? – Rob

+1

不要重複自己。這兩個職能應該是一個。 –

+5

以前從未見過一個7面骰子... – tenfour

回答

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作爲參數,並做compscore內的變化該函數在變量var中被反映爲compscorevar,因爲該特定調用僅僅是相同變量的別名。

在C相同的效果與指針來實現的:

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

int var = 0; 
computer(&var); 

函數的這個調用給它應被改變的變量的地址。對於一般用途,您可以假設使用引用的第一個實現將自動生成類似於最後一個片段的編譯器的解決方案。

+0

所以我只需要添加&?我不udnerstand什麼&是。 – mystycs

+1

它會將您正在更改的'int'變成您請求擲骰子的地方的'int'的指針,而不是複製並更改副本,然後丟棄副本。 – darvids0n

+0

@mystycs:如果您不熟悉參考資料,請在使用前更好地瞭解它們。與此同時,您可以使用指針。 –

1

你是cout這裏是diceRoll,所以它只打印當前卷,而不是總數。

假設您正確地打印骰子滾動,您還需要在這些函數的末尾寫入return humanscore;return compscore;以傳回新的結果。

1

您正在按值傳遞參數。這意味着當函數完成時,對它們所做的任何更改都會被丟棄。如果你想讓你的分數持續下去,你有幾個選擇。您可以通過引用傳遞參數,在C++中可以通過將指針傳遞給分數來完成。您可以讓您的函數返回新分數,然後在您下次調用它時將返回的值傳遞給該函數。你也會有使用全局變量的不太理想的解決方案。