从零开发游戏需要学习的c#模块,第六章(泛型与集合,关于背包系统的开发)
还记得我们学过的数组吗
假设你要做一个背包系统,需要存放不同类型的数据:
// 存放物品名字的数组
string[] itemNames = new string[10];
// 存放物品数量的数组
int[] itemCounts = new int[10];
// 存放物品价格的数组
float[] itemPrices = new float[10];
一个背包系统,我们得准备3组数组,用来存放不同的物品类型。
这显然很难修改,也很难继续扩展,管理很麻烦。
所以,我们需要一种大小可变、类型安全的容器,这就是 List<T>,它属于泛型集合。
1. 什么是泛型?
比喻:一个万能模具。你可以用同一个模具铸造金条、银条、铜条,只需要告诉模具“这次倒什么材料进去”。
泛型的语法是尖括号 <T>,T 代表“类型参数”,你可以替换成任何类型。
你玩过我的世界吗?比如金镐子,铁镐子,本质上都是镐子,只是材料不同,而泛型听名字就知道它是镐子的本质,你要做的是选择制作材料
2. List<T> —— 动态数组,你的万能背包
List<T> 就像数组,但想加多少加多少,想删就删。
第一步,在文件最上面引入命名空间:
using System.Collections.Generic;
第二步,创建一个 List:
// 创建一个只能装字符串的列表
List<string> inventory = new List<string>();
// 创建一个只能装整数的列表
List<int> scores = new List<int>();
第三步,操作它:
// 添加物品
inventory.Add("铁剑");
inventory.Add("生命药水");
inventory.Add("魔法卷轴");
// 获取数量
Console.WriteLine("背包里有 " + inventory.Count + " 件物品。");
// 像数组一样访问(索引从0开始)
Console.WriteLine("第一件物品是:" + inventory[0]);
// 删除物品
inventory.Remove("生命药水"); // 删除指定物品
inventory.RemoveAt(0); // 删除索引为0的物品(第一个)
// 检查是否存在某物品
if (inventory.Contains("铁剑"))
{
Console.WriteLine("背包里有铁剑!");
}
// 清空背包
inventory.Clear();
ok,你大概应该明白了,让我们来制作一个背包
3.实战:做一个完整的背包系统
新建一个文件 Inventory.cs,用来存放背包逻辑:
using System;
using System.Collections.Generic;
namespace MyGame
{
class Inventory
{
private List<string> items; // 私有列表,存储物品名字
public Inventory()
{
items = new List<string>();
Console.WriteLine("背包已创建!");
}
// 添加物品
public void AddItem(string itemName)
{
items.Add(itemName);
Console.WriteLine("获得物品:" + itemName);
}
// 移除物品
public void RemoveItem(string itemName)
{
if (items.Contains(itemName))
{
items.Remove(itemName);
Console.WriteLine("失去了物品:" + itemName);
}
else
{
Console.WriteLine("背包里没有" + itemName + "!");
}
}
// 显示背包内容
public void ShowInventory()
{
Console.WriteLine("\n=== 当前背包 ===");
if (items.Count == 0)
{
Console.WriteLine("(空)");
}
else
{
for (int i = 0; i < items.Count; i++)
{
Console.WriteLine(" [" + (i + 1) + "] " + items[i]);
}
}
Console.WriteLine("总物品数:" + items.Count);
}
// 检查是否拥有某物品
public bool HasItem(string itemName)
{
return items.Contains(itemName);
}
}
}
4. Dictionary<TKey, TValue> —— 键值对,你的快速查询表
比喻:游戏里的角色属性面板。你想查“力量”是多少,直接用“力量”这个词去查,立刻得到数值,而不是翻遍整个数组。
// 创建一个字典:键是属性名(string),值是属性值(int)
Dictionary<string, int> stats = new Dictionary<string, int>();
// 添加键值对
stats.Add("力量", 15);
stats.Add("敏捷", 20);
stats.Add("智力", 10);
// 通过键来查询值
int strength = stats["力量"];
Console.WriteLine("力量值为:" + strength);
// 修改值
stats["力量"] = 18;
// 检查是否存在某个键
if (stats.ContainsKey("幸运"))
{
Console.WriteLine("幸运值为:" + stats["幸运"]);
}
else
{
Console.WriteLine("没有幸运属性!");
}
// 遍历字典
foreach (var pair in stats)
{
Console.WriteLine(pair.Key + ":" + pair.Value);
}
最后我们来学习一下一种更简单的循环
5.foreach 循环 —— 专门遍历集合的利器
List<string> names = new List<string>() { "战士", "法师", "盗贼" };
// foreach:依次取出列表里的每一个元素
foreach (string name in names)
{
Console.WriteLine("职业:" + name);
}
// 输出:
// 职业:战士
// 职业:法师
// 职业:盗贼
最后,还记得上节课学习的史莱姆吗,我们将史莱姆和背包系统结合起来,来应用一下我们的所学知识

现在来给大家讲一下如何修改
首先,保留我们背包系统,然后,在 Slime 类里添加一个字段:
public string dropItem; // 死亡时掉落的物品
在构造函数里初始化它(顺便把构造函数改一下,增加一个参数):
public Slime(string slimeName, int slimeHp, int slimeAttack, string drop)
{
name = slimeName;
hp = slimeHp;
attackPower = slimeAttack;
dropItem = drop;
Console.WriteLine(name + " 诞生了!它会掉落:" + dropItem);
}
修改 Program.cs,加入背包和掉落逻辑:
using System;
namespace MyGame
{
class Program
{
static void Main(string[] args)
{
// 创建玩家背包
Inventory playerBag = new Inventory();
// 创建史莱姆,并指定掉落物
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 + "回合 ---");
// A 攻击 B
slimeB.TakeDamage(slimeA.attackPower);
if (slimeB.hp <= 0)
{
Console.WriteLine("\n🏆 " + slimeA.name + " 获胜!");
Console.WriteLine("它掉落了:" + slimeB.dropItem);
playerBag.AddItem(slimeB.dropItem); // 拾取掉落物
break;
}
// B 攻击 A
slimeA.TakeDamage(slimeB.attackPower);
if (slimeA.hp <= 0)
{
Console.WriteLine("\n🏆 " + slimeB.name + " 获胜!");
Console.WriteLine("它掉落了:" + slimeA.dropItem);
playerBag.AddItem(slimeA.dropItem);
break;
}
Console.WriteLine();
round++;
}
// 展示最终背包
playerBag.ShowInventory();
Console.WriteLine("\n战斗结束!");
Console.ReadKey();
}
}
}
(🏆识别不出来可以换成别的符号)
好了,今天教程就到这里,关注我,下期更精彩
更多推荐
所有评论(0)