You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编程新手求助:如何实现类属性的调用与分配(类宝可梦系统)

你的宝可梦风格武器系统代码问题讲解与修正

原代码的核心问题

  • 赋值白忙活: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:09:56