编程新手求助:如何实现类属性的调用与分配(类宝可梦系统)
你的宝可梦风格武器系统代码问题讲解与修正
原代码的核心问题
- 赋值白忙活:Weapons类里的
Name、HP这些是类的专属字段,但你写的Dagger()这类方法里又定义了同名参数,方法里的Name = "Dagger"其实是给方法的局部参数赋值,根本没改到类本身的字段,等于做了无用功。 - 外部拿不到属性:Weapons类的字段默认是私有(private),就算赋值成功,外部代码也没法读取这些属性来展示。
- 方法调用报错:比如
CallDagger()里调用weapon.Dagger(),但你的Dagger()方法要求传7个参数,这里没传直接编译报错;而且Console.WriteLine(weapon.Dagger())里,Dagger()是无返回值的void类型,不能直接打印。 - 没法保存武器:每个Call方法都新建一个Weapons对象,调用完就扔了,没法把这个武器分配给玩家存下来。
修正后的代码(新手友好版)
我们重新设计,让每个武器都是独立的实例,能直接读取属性,还能方便分配给玩家:
1. 武器类:直接生成带属性的武器实例
using System; namespace ConsoleApp1 { // 每个实例代表一把具体的武器 public class Weapon { // 把字段改成public,外部能直接读取 public string Name; public int HP; public int Atk; public int Def; public int Spd; public int Spl; public string Ability; // 私有构造函数:不让外部随便创建空武器 private Weapon() { } // 静态方法:直接返回一把配置好的匕首 public static Weapon CreateDagger() { return new Weapon() { Name = "Dagger", HP = 9, Atk = 10, Def = 10, Spd = 19, Spl = 15, Ability = "Speed" }; } // 同理生成其他武器 public static Weapon CreateSword() { return new Weapon() { Name = "Sword", HP = 11, Atk = 12, Def = 12, Spd = 16, Spl = 15, Ability = "Piercing" }; } public static Weapon CreateAxe() { return new Weapon() { Name = "Axe", HP = 13, Atk = 14, Def = 14, Spd = 14, Spl = 15, Ability = "Boomeranxe" }; } public static Weapon CreateHammer() { return new Weapon() { Name = "Hammer", HP = 15, Atk = 16, Def = 15, Spd = 11, Spl = 15, Ability = "Big Chance" }; } // 封装展示属性的方法,不用重复写打印代码 public void ShowStats() { Console.WriteLine($"=== {Name} 属性 ==="); Console.WriteLine($"HP: {HP}"); Console.WriteLine($"攻击: {Atk}"); Console.WriteLine($"防御: {Def}"); Console.WriteLine($"速度: {Spd}"); Console.WriteLine($"特殊值: {Spl}"); Console.WriteLine($"特性: {Ability}\n"); } }
2. 玩家类:用来持有和装备武器
// 模拟宝可梦训练家,能装备武器 public class Player { public string PlayerName; public Weapon EquippedWeapon; // 玩家当前装备的武器 // 创建玩家时传入名字 public Player(string name) { PlayerName = name; } // 装备武器的方法 public void EquipWeapon(Weapon weapon) { EquippedWeapon = weapon; Console.WriteLine($"{PlayerName} 装备了 {weapon.Name}!"); } // 展示当前装备的武器 public void ShowEquippedWeapon() { if (EquippedWeapon != null) { Console.WriteLine($"{PlayerName} 当前装备的武器:"); EquippedWeapon.ShowStats(); } else { Console.WriteLine($"{PlayerName} 还没装备武器!"); } } }
3. 主程序:测试功能(创建武器、分配给玩家)
class Program { static void Main(string[] args) { // 创建玩家 Player trainer = new Player("小智"); // 创建一把匕首并展示属性 Weapon dagger = Weapon.CreateDagger(); dagger.ShowStats(); // 把匕首分配给玩家 trainer.EquipWeapon(dagger); trainer.ShowEquippedWeapon(); // 换一把剑试试 Weapon sword = Weapon.CreateSword(); trainer.EquipWeapon(sword); trainer.ShowEquippedWeapon(); Console.ReadKey(); } } }
改完后的好处
- 每个武器是独立个体:就像宝可梦每个精灵都是单独的存在,这里每把武器都是
Weapon类的一个对象,属性不会互相干扰。 - 创建武器更简单:调用
Weapon.CreateDagger()直接拿到一把属性全配置好的匕首,不用手动赋值。 - 武器能分配给玩家:通过
EquipWeapon方法把武器绑定给玩家,就像训练家宝可梦,玩家对象里的EquippedWeapon就是当前装备的武器。 - 代码复用性强:把打印属性的逻辑封装到
ShowStats方法里,不用每次写一堆重复的Console.WriteLine。
运行效果
控制台会输出:
=== Dagger 属性 === HP: 9 攻击: 10 防御: 10 速度: 19 特殊值: 15 特性: Speed 小智 装备了 Dagger! 小智 当前装备的武器: === Dagger 属性 === HP: 9 攻击: 10 防御: 10 速度: 19 特殊值: 15 特性: Speed 小智 装备了 Sword! 小智 当前装备的武器: === Sword 属性 === HP: 11 攻击: 12 防御: 12 速度: 16 特殊值: 15 特性: Piercing
内容的提问来源于stack exchange,提问作者Shamant Bagrecha
相关产品推荐
相关产品推荐

