从零开发游戏需要学习的c#模块,第四章(类与对象)
上一章我们学习了方法,方法相对于前两张有点难,大家要稍微花费功夫。
今天这节课我们继续深入学习,今天我们来学习——类与对象。
创造世界的蓝图——类与对象
-
类 是蓝图。它定义了“敌人”应该有什么(数据)和能做什么(行为)。
-
对象 是根据蓝图造出来的具体实例。哥布林、巨龙,都是“敌人”类的具体对象。
比如说怪物哥布林,哥布林本身是一个对象,哥布林拥有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 + "点伤害。");
}
}
}
代码简单好懂,只要你认真学习了这节课一定能看懂。

(这里注意一下,文章中一些代码双引号不小心打错成中文双引号了,如果运行不了可能是这个原因)
好了这节课就说到这里,关注我,下一章更精彩!
更多推荐

所有评论(0)