You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:05:14