我正在开发一款简单的Blackjack纸牌游戏。我正在使用此代码计算用户得分:
switch (label9.Text)
{
case "J": playerTotal = playerTotal + 10; break;
case "Q": playerTotal = playerTotal + 10; break;
case "K": playerTotal = playerTotal + 10; break;
case "A": playerTotal = playerTotal + 11; break;
default: playerTotal = playerTotal + Convert.ToInt32(label9.Text); break;
}
但我不想一遍又一遍地写这个。所以我把这段代码放在一个函数中:
public void score(Label n, int m)
{
switch (n.Text)
{
case "J": m += 10; break;
case "Q": m += 10; break;
case "K": m += 10; break;
case "A": m += 11; break;
default: m += Convert.ToInt32(n.Text); break;
}
}
现在,问题出现了:当我从另一个函数调用score(label7, playerTotal)
时,playerTotal
的值不会改变。例如:
public void hitPlayer()
{
//ilk hit
if (hitCounter == 0)
{
label7.Text = newDeck.Last();
playerHand[2] = newDeck.Last();
newDeck = newDeck.Take(newDeck.Count() - 1).ToArray();
label7.Visible = true;
pictureBox7.Visible = true;
score(label7, playerTotal); // <<===== 'playerTotal' does not change
aceFound(hitCounter);
label12.Text = playerTotal.ToString();
}
但是,当我使用switch/case
代码而将其包装在函数中时,playerTotal
的值会发生变化。我调用score()
函数的方式有什么问题?
答案 0 :(得分:4)
将m
作为参考
public void score(Label n, ref int m)
{
switch (n.Text)
{
case "J": m += 10; break;
case "Q": m += 10; break;
case "K": m += 10; break;
case "A": m += 11; break;
default: m += Convert.ToInt32(n.Text); break;
}
}
根据@Andrew
的建议public void score(Label n, ref int m)
{
switch (n.Text)
{
case "J":
case "Q":
case "K": m += 10; break;
case "A": m += 11; break;
default: m += Convert.ToInt32(n.Text); break;
}
}
score(label7, ref playerTotal);
答案 1 :(得分:3)
第三种选择,我更喜欢重新分配分数或通过引用传递分数:
public int getScore(Label n)
{
switch (n.Text)
{
case "J":
case "Q":
case "K":
return 10;
case "A":
return 11;
default:
return Convert.ToInt32(n.Text);
}
}
...
playerTotal += getScore(label7);
答案 2 :(得分:2)
你的得分方法需要返回m。 m是整数,不作为参考。方法中对m的任何更改都不会改变您传入的整数。
playerTotal =得分(label7,playerTotal);
您可以更改您的方法,以便通过添加“ref”将playerTotal视为参考,如另一个答案所指出的那样,但这不是一个好的设计,因为您的方法只有一个成功状态。
答案 3 :(得分:1)
问题是,Label是一个对象,所以它是通过引用传递的,但是,你传递的int是一个原始类型,因此它是通过值传递的(在方法中复制),所以你需要从中返回int你的方法。
public void hitPlayer()
{
//ilk hit
if (hitCounter == 0)
{
label7.Text = newDeck.Last();
playerHand[2] = newDeck.Last();
newDeck = newDeck.Take(newDeck.Count() - 1).ToArray();
label7.Visible = true;
pictureBox7.Visible = true;
**playerTotal** = score(label7, playerTotal);
aceFound(hitCounter);
label12.Text = playerTotal.ToString();
}
public int score(Label n, int m)
{
switch (n.Text)
{
case "J": m += 10; break;
case "Q": m += 10; break;
case "K": m += 10; break;
case "A": m += 11; break;
default: m += Convert.ToInt32(n.Text); break;
}
return m;
}
希望这有帮助。
答案 4 :(得分:1)
int m
方法中的score
参数是原始值的副本。您只是在更改此副本。
您最好将逻辑与任何标签和文本框分开。也不要在score
或CardValue
方法中创建副作用,即除了返回结果值之外不要更改内容。
public int CardValue(string card)
{
switch (card)
{
case "J": return 10;
case "Q": return 10;
case "K": return 10;
case "A": return 11;
default: return Convert.ToInt32(card);
}
}
使用它(它看起来更干净):
playerTotal += CardValue(label7.Text);