还记得我们学过的数组吗

假设你要做一个背包系统,需要存放不同类型的数据:

// 存放物品名字的数组
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();
        }
    }
}

(🏆识别不出来可以换成别的符号)

好了,今天教程就到这里,关注我,下期更精彩

更多推荐