C# 12:如何遍历多个静态类共享属性优化游戏碰撞逻辑
控制台游戏物品系统优化方案
问题分析
当前用多个静态类(如Potion、Revive)存储物品数据,导致碰撞逻辑需要写大量重复的分支判断,且无法通过遍历统一处理物品。静态类虽然无需实例化,但缺乏统一的抽象和管理方式,扩展性差。
优化方案
改用接口抽象+单例实例+全局注册表的模式,既保留"无需重复实例化"的特性,又能统一管理所有物品,大幅简化碰撞逻辑。
步骤1:定义物品抽象接口
抽取出所有物品的公共属性和行为,统一规范:
public interface IItem { string ItemName { get; } string Description { get; } string Art { get; } char Appearance { get; } ConsoleColor Color { get; } bool Discovered { get; set; } }
步骤2:将静态类改为单例实现类
把原来的每个静态物品类,改成实现IItem接口的单例类,私有构造函数防止外部实例化:
public class Potion : IItem { // C# 12 静态成员直接初始化单例 public static Potion Instance { get; } = new Potion(); public string ItemName { get; } = "POTION"; public string Description { get; } = "A peculiar beverage that mends any wound."; public string Art { get; } = @"./data/art/potion"; public char Appearance { get; } = '+'; public ConsoleColor Color { get; } = ConsoleColor.Blue; public bool Discovered { get; set; } = false; private Potion() {} } // 同理实现Revive类 public class Revive : IItem { public static Revive Instance { get; } = new Revive(); public string ItemName { get; } = "REVIVE"; public string Description { get; } = "Brings you back from the brink of death."; public string Art { get; } = @"./data/art/revive"; public char Appearance { get; } = '!'; public ConsoleColor Color { get; } = ConsoleColor.Red; public bool Discovered { get; set; } = false; private Revive() {} }
步骤3:创建全局物品注册表
统一管理所有物品实例,方便后续遍历或快速查找:
public static class ItemRegistry { // 用字典缓存外观字符到物品的映射,提升查找效率 private static readonly Dictionary<char, IItem> _itemLookup; static ItemRegistry() { var allItems = new List<IItem> { Potion.Instance, Revive.Instance, // 新增物品时只需在这里添加实例即可 }; _itemLookup = allItems.ToDictionary(item => item.Appearance); } // 提供按外观字符查找物品的方法 public static IItem? GetItemByAppearance(char appearance) { _itemLookup.TryGetValue(appearance, out var item); return item; } // 也可提供所有物品的遍历入口 public static IEnumerable<IItem> AllItems => _itemLookup.Values; }
步骤4:简化碰撞逻辑
无需再写大量分支判断,直接通过注册表查找匹配的物品:
// 获取玩家碰撞到的字符 char collidedChar = map[playerPositionLeft][playerPositionTop]; // 查找对应的物品 var matchedItem = ItemRegistry.GetItemByAppearance(collidedChar); if (matchedItem != null) { items.Add(matchedItem.ItemName); matchedItem.Discovered = true; }
方案优势
- 消除重复代码:新增物品时只需添加单例类并注册到注册表,无需修改碰撞逻辑
- 可扩展性强:统一的接口规范方便后续添加物品的新属性或行为
- 性能更优:字典映射的查找时间复杂度为O(1),比遍历所有物品效率更高
- 保留单例特性:每个物品仅存在一个实例,符合原静态类的使用习惯
内容的提问来源于stack exchange,提问作者jeaniedabeanie
相关产品推荐
相关产品推荐

