上一章我们学习了方法,方法相对于前两张有点难,大家要稍微花费功夫。

今天这节课我们继续深入学习,今天我们来学习——类与对象。

创造世界的蓝图——类与对象

  • 类 是蓝图。它定义了“敌人”应该有什么(数据)和能做什么(行为)。

  • 对象 是根据蓝图造出来的具体实例。哥布林、巨龙,都是“敌人”类的具体对象。

比如说怪物哥布林,哥布林本身是一个对象,哥布林拥有100生命,会攻击,这就是类。

1. 我们先来解剖一个类,初始魔物史莱姆

我们把人见人爱的史莱姆做成一个类。在 Program.cs 里,class Program 的外面(但在 namespace 里面),创建一个新的类:

// 史莱姆的蓝图
class Slime
{
    // --- 字段 (Fields):史莱姆拥有的数据 ---
    public string name;
    public int hp;
    public int attackPower;

    // --- 方法 (Methods):史莱姆能做的行为 ---
    public void TakeDamage(int damage)
    {
        hp = hp - damage;
        Console.WriteLine(name + “ 受到了” + damage + “点伤害!剩余HP:” + hp);
        
        if (hp <= 0)
        {
            Console.WriteLine(name + “ 被打败了!化为一滩液体。”);
        }
    }

    public void Attack()
    {
        Console.WriteLine(name + “ 跳起来砸向你!造成了” + attackPower + “点伤害。”);
    }
}

(我的表述可能不够清楚,可以看一下我的树状图)

上面这段代码放在Slime里面

关键词 public:表示“公开的”,外部代码可以访问。目前先用上,后面会细讲。

2.然后我们来说一下对象

现在回到 Main 方法,我们就像在游戏编辑器里一样,拖出两只属性不同的史莱姆:

static void Main(string[] args)
{
    // 用 new 关键字 + 类名() 创建一个具体对象
    Slime slimeA = new Slime();
    slimeA.name = “绿色史莱姆”;
    slimeA.hp = 30;
    slimeA.attackPower = 5;

    Slime slimeB = new Slime();
    slimeB.name = “蓝色史莱姆”;
    slimeB.hp = 20;
    slimeB.attackPower = 8;

    // 现在,它们就是两个独立的、有自己数据的个体了!
    slimeA.Attack(); // 调用绿色史莱姆的攻击
    slimeB.TakeDamage(15); // 蓝色史莱姆挨打
    slimeA.TakeDamage(25);

    Console.ReadKey();
}

这就是面向对象:用同一张蓝图,可以轻松创建无数个独立、互不干扰的对象,每个都有自己的状态。

让出生更简单——构造函数

每次创建史莱姆都要手动设三行属性,太麻烦。而构造函数能在对象诞生时,就自动给它设定好属性。它是与类同名的特殊方法,没有返回值。

class Slime
{
    public string name;
    public int hp;
    public int attackPower;

    // 这就是构造函数
    public Slime(string slimeName, int slimeHp, int slimeAttack)
    {
        name = slimeName;
        hp = slimeHp;
        attackPower = slimeAttack;
        Console.WriteLine(name + “ 诞生了!”);
    }

    // ... 其他 TakeDamage 和 Attack 方法不变 ...
}

现在,创建史莱姆就变成了 一行代码:

Slime slimeA = new Slime(“绿色史莱姆”, 30, 5);
Slime slimeB = new Slime(“蓝色史莱姆”, 20, 8);

当 new Slime(...) 运行时,构造函数被自动调用,参数传入,对象直接带着数据诞生。这一步是游戏开发中创建角色、道具的标准做法。

学习完了类和对象, 我们就可以创建两个史莱姆,让它们对打,直到一方被打败为止

using System;

namespace MyGame
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建两只史莱姆
            Slime slimeA = new Slime("绿色史莱姆", 30, 5);
            Slime slimeB = new Slime("蓝色史莱姆", 20, 8);

            Console.WriteLine("\n=== 史莱姆竞技场!===\n");

            int round = 1; // 记录回合数

            // 只要两只都还活着,就继续打
            while (slimeA.hp > 0 && slimeB.hp > 0)
            {
                Console.WriteLine("--- 第" + round + "回合 ---");

                // 绿色史莱姆攻击蓝色史莱姆
                Console.Write(slimeA.name + " 攻击!");
                slimeB.TakeDamage(slimeA.attackPower);

                // 检查蓝色史莱姆是否死了
                if (slimeB.hp <= 0)
                {
                    Console.WriteLine("\n🏆 " + slimeA.name + " 获胜!");
                    break; // 跳出循环,战斗结束
                }

                // 蓝色史莱姆反击绿色史莱姆
                Console.Write(slimeB.name + " 反击!");
                slimeA.TakeDamage(slimeB.attackPower);

                // 检查绿色史莱姆是否死了
                if (slimeA.hp <= 0)
                {
                    Console.WriteLine("\n! " + slimeB.name + " 获胜!");
                    break;
                }

                Console.WriteLine(); // 空一行,让回合之间更清晰
                round = round + 1; // 回合数加1
            }

            Console.WriteLine("\n战斗结束!");
            Console.ReadKey();
        }
    }
}
using System;

namespace MyGame
{
    // 史莱姆的蓝图
    class Slime
    {
        public string name;
        public int hp;
        public int attackPower;

        // 构造函数
        public Slime(string slimeName, int slimeHp, int slimeAttack)
        {
            name = slimeName;
            hp = slimeHp;
            attackPower = slimeAttack;
            Console.WriteLine(name + " 诞生了!");
        }

        public void TakeDamage(int damage)
        {
            hp = hp - damage;
            Console.WriteLine(name + " 受到了" + damage + "点伤害!剩余HP:" + hp);

            if (hp <= 0)
            {
                Console.WriteLine(name + " 被打败了!化为一滩液体。");
            }
        }

        public void Attack()
        {
            Console.WriteLine(name + " 跳起来砸向你!造成了" + attackPower + "点伤害。");
        }
    }
}

代码简单好懂,只要你认真学习了这节课一定能看懂。

(这里注意一下,文章中一些代码双引号不小心打错成中文双引号了,如果运行不了可能是这个原因)

好了这节课就说到这里,关注我,下一章更精彩!

更多推荐