更改调用函数传递的变量的函数

时间:2014-11-27 19:58:15

标签: c#

我正在开发一款简单的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()函数的方式有什么问题?

5 个答案:

答案 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参数是原始值的副本。您只是在更改此副本。

您最好将逻辑与任何标签和文本框分开。也不要在scoreCardValue方法中创建副作用,即除了返回结果值之外不要更改内容。

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