我在Main中声明了两个变量,并在一个非静态方法中更改了它们,这个方法接收了一些变量(包括我改变的两个变量)并返回另一个变量,但Main在使用后无法识别其他变量的变化return();,并且值保持重置。如何让它识别出变化?
string Attack(int Mhp, int Chp, int Cdmg, int Mdmg, string charname)
{
string res;
Mhp -= Cdmg;
Chp -= Mdmg;
Console.WriteLine();
res=charname + "'s Health has been reduced to " + Chp +", and Monster's Health reduced to " + Mhp;
return(res);
}
Mhp和Chp保持与我在Main()中声明的相同;如果角色的健康状况不断重置,我的代码将毫无意义。
提前致谢!
答案 0 :(得分:7)
使用
string Attack(ref int Mhp, ref int Chp, int Cdmg, int Mdmg, string charname)
如果要在过程中更改值类型,则必须通过引用传递。这是C#琐事 - 读一些东西:)
答案 1 :(得分:2)
Integer是一个值类型,它通过复制传递给方法,而不是通过引用传递给方法。您正在更改副本和原始值保持不变。通过引用传递值类型,或创建将包含整数值的引用类型Character
,并将字符传递给此方法。
public class Character
{
private int health;
public event Action<Character> HealthChanged;
public Character(string name, int hp, int cdmg)
{
Name = name;
health = hp;
Damage = cdmg;
}
public string Name { get; private set; }
public int Damage { get; private set; }
public bool IsAlive { get { return Health > 0; } }
public int Health
{
get { return health; }
private set
{
if (!IsAlive)
return;
health = value;
if (HealthChanged != null)
HealthChanged(this);
}
}
public void Attack(Character target)
{
if (IsAlive)
target.Health -= Damage;
}
}
此课程有通知游戏核心关于角色健康变化的事件(考虑通知治疗也)。在Main中创建两个角色并订阅健康变化事件。然后开始战斗:
var character = new Character("Bob", 100, 70);
character.HealthChanged += CharacterHealthChanged;
var monster = new Character("Monster", 200, 10);
monster.HealthChanged += CharacterHealthChanged;
while (character.IsAlive && monster.IsAlive)
{
character.Attack(monster);
monster.Attack(character);
}
事件处理程序:
static void CharacterHealthChanged(Character characer)
{
if (!characer.IsAlive)
Console.WriteLine("{0} was killed", characer.Name);
else
Console.WriteLine("{0}'s health reduced to {1}",
characer.Name, characer.Health);
}
输出
Monster's health reduced to 130
Bob's health reduced to 90
Monster's health reduced to 60
Bob's health reduced to 80
Monster is dead
答案 2 :(得分:1)
原语按值传递给函数,而不是通过引用...所以你要更改变量的副本......原始版本永远不会看到变化......
答案 3 :(得分:1)
你必须明确地引用它们:
int something = 5;
CallMethod(ref something);
private void CallMethod(ref int x) {
x += 10;
}
Console.WriteLine(something); // Output: 15
您现在的方式只会更改方法中的值,但不会将这些更改反映到其外部的变量中。整数是值类型,这意味着它们将按值发送。您必须明确定义它们作为参考发送。
答案 4 :(得分:0)
在我看来,最好在类中全局声明Mhp和Chp(或包含它们的结构/类)。 如果你真的想在你的main中声明它们,那么使用ref关键字,这样程序就会将攻击函数传递给你的main的var的引用,而不是包含在调用时从它们获取的值的浅拷贝。袭击正在发布
string Attack(ref int Mhp, ref int Chp, int Cdmg, int Mdmg, string charname)
请注意,我建议的第一种方法更容易(声明类级别变量),因为这样,它们可以通过类的任何成员方法直接访问(而不是通过引用)。
干杯