使用类/方法时,代码不起作用

时间:2017-10-12 13:56:26

标签: c#

我有一个非常简单的C#程序,有几个切换案例。 每个案例都使用相同的函数和唯一的差异变量值 - 也就是说,所有内容都是硬编码的。不漂亮,但它的工作原理。

我试图定义被调用的类/方法,而不是重复相同的函数。但它没有按预期工作。

首先,在我的程序中,我声明了以下变量;

int hp = 100;
int gold = 10;

然后我有一个带有以下(部分)功能的开关/案例;

int monster2 = 10;
gold = gold - 2;

while (monster2 > 0 && hp > 0)
{
    int dmgdone = rnd.Next(5, 15);
    Console.WriteLine("You deal " + dmgdone);
    monster2 = monster2 - dmgdone;
    int dmg = rnd.Next(1, 10);
    Console.WriteLine("You take " + dmg);
    hp = hp - dmg;

    if (monster2 <= 0)
    {
        Console.WriteLine("Monster is slain");
        gold = gold + 1;
    }

    if (hp <= 0)
    {
        Console.WriteLine("You where killed");
    }
}
Console.ResetColor();
break;

点是函数调整变量hp和gold,当函数结束时,用户以“正确”的hp和gold值返回到开关函数的开头。

我确实尝试使用相同的函数为每个具有正确参数值的开关案例编写类/方法。然而,当使用这种方法时,hp和gold的变量值总是100和10,它在主方法中没有变化。如何从其他类中的函数/方法更改main方法中的变量?

以下是我使用新解决方案的方法;

我用这个方法调用了;

loc.goToLocation1();

这是上面的类;

class location1
{
    public void useYourSword(int hp, int gold, string name, string age)
    {
        Random rnd = new Random();
        int monster = 10;
        gold = gold - 1;

        while (monster > 0 && hp > 0)
        {
            int dmgdone = rnd.Next(1, 10);
            Console.WriteLine("You deal " + dmgdone);
            monster = monster - dmgdone;
            int dmg = rnd.Next(1, 10);
            Console.WriteLine("You take " + dmg);
            hp = hp - dmg;

            if (monster <= 0)
            {
                Console.WriteLine("Monster is slain");
                gold = gold + 1;             
            }

            if (hp <= 0)
            {
                Console.WriteLine("You where killed");
            }
        }

        Console.ResetColor();
    }
}

2 个答案:

答案 0 :(得分:1)

intfloat类型的原始变量是所谓的值类型,这意味着变量引用这些项的值,如果复制变量,或将其传递给一个函数,你复制它包含的数据。

还有引用类型,例如类(AKA对象)的实例,其中变量引用地址,并且该地址指向数据。在这些情况下,每个对象只有一组数据,当您复制变量或将其传递给函数时,您只复制指向相同数据的地址。

所以,如果您有一个Player的课程,并且您将该播放器传递给您的方法,并且您更改了它的HP,那么您将能够从您的调用者方法中观察到该更改

示例:

public class Player
{
    public int HP{get; set;}

    public Player()
    {
        HP = 100;
    }
}

...

public static void Main(string[] args)
{ 
    Player player = new Player();
    reduceHP(player);
    Console.WriteLine("HP: {0}, player.HP);
}

public static void reduceHP(Player player)
{
    player.HP -= 10;
}

当然,你也可以使用refout关键字,但使用它们不是一个很好的设计,除非它们真的需要

答案 1 :(得分:1)

即使你定义不应该使用OOP(即使用类和对象),你也可以使用引用。它会像那样工作:

internal static class P
{
    private static void Main ()
    {
        int hp = 100;
        int gold = 10;
        Console.WriteLine("Before:");
        Console.WriteLine($"\tHP: {hp}\n\tGold: {gold}\n");

        location1 loc1 = new location1();

        loc1.useYourSword(ref hp, ref gold, "", "");

        Console.WriteLine("After:");
        Console.WriteLine ($"\tHP: {hp}\n\tGold: {gold}");

        Console.ReadLine ();
    }
}

class location1
{
    public void useYourSword (ref int hp, ref int gold, string name, string age)
    {
        Random rnd = new Random ();
        int monster = 10;
        gold = gold - 1;

        while (monster > 0 && hp > 0)
        {
            int dmgdone = rnd.Next (1, 10);
            Console.WriteLine ("You deal " + dmgdone);
            monster = monster - dmgdone;
            int dmg = rnd.Next (1, 10);
            Console.WriteLine ("You take " + dmg);
            hp = hp - dmg;

            if (monster <= 0)
            {
                Console.WriteLine ("Monster is slain");
                gold = gold + 1;
            }

            if (hp <= 0)
            {
                Console.WriteLine ("You where killed");
            }
        }

        Console.ResetColor ();
    }
}

结果是:

Before:
        HP: 100
        Gold: 10

You deal 5
You take 8
You deal 4
You take 2
You deal 5
You take 1
Monster is slain
After:
        HP: 89
        Gold: 10