按字典或列表分隔项目

时间:2016-07-23 07:04:41

标签: c#

我正在为游戏客户端开发游戏服务器。与任何其他游戏一样,游戏的角色有一个库存。该库存有4个标签:

装备,药水,额外,现金

目前,List<Item>类是Item,其中每个Slot对象都包含一个Dictionary<InventoryTab, Dicitionary<int, Item>>属性,该属性指示窗口内项目的位置(窗口为4乘4)。

我真的不喜欢这种方法,因为它并没有真正指出每个项目的位置,在哪里有字典我可以为每个标签设置键,然后组织项目。但是,我还需要使用插槽索引项目。那么如何在字典中使用这种方法呢?我不需要这样的两个词典吗? InventoryTab,其中using System; using System.Collections.Generic; using System.Linq; namespace InventoryTest { class Program { static void Main(string[] args) { var inventory = new Inventory(); while (true) { var mapleId = new Random().Next(1000000, 5999999); short str = 0; short dex = 0; short intt = 0; short luk = 0; if (mapleId >= 1000000 && mapleId <= 1999999) { str = (short)new Random().Next(0, 5); dex = (short)new Random().Next(0, 5); intt = (short)new Random().Next(0, 5); luk = (short)new Random().Next(0, 5); } var item = new Item() { MapleId = mapleId, Str = str, Dex = dex, Int = intt, Luk = luk }; inventory.Add(item); Console.ReadLine(); } } } class Item { public int MapleId { get; set; } public short Str { get; set; } public short Dex { get; set; } public short Int { get; set; } public short Luk { get; set; } public Tab Tab { get { return (Tab)(this.MapleId / 1000000); } } } enum Tab : byte { Equip = 1, Use, Setup, Etc, Cash } class Inventory : Dictionary<Tab, Dictionary<sbyte, Item>> { public Inventory() : base() { foreach (var tab in Enum.GetValues(typeof(Tab)).Cast<Tab>()) { base.Add(tab, new Dictionary<sbyte, Item>(96)); } } public void Add(Item item) { var nextFreeSlot = this.GetNextFreeSlot(item.Tab); this[item.Tab].Add(nextFreeSlot, item); Console.WriteLine("Added new item to {0} tab. Info:", item.Tab); Console.WriteLine("Slot: {0}", nextFreeSlot); Console.WriteLine("MapleId: {0}", item.MapleId); if (item.Str > 0) { Console.WriteLine("Str: {0}", item.Str); } if (item.Dex > 0) { Console.WriteLine("Dex: {0}", item.Dex); } if (item.Int > 0) { Console.WriteLine("Int: {0}", item.Int); } if (item.Luk > 0) { Console.WriteLine("Luk: {0}", item.Luk); } } private sbyte GetNextFreeSlot(Tab tab) { sbyte slot = 0; foreach (var item in this[tab]) { if (item.Key == slot) { slot += 1; } else { break; } } return slot; } } } 是某个标签,并且键控集合是由项目的插槽编入索引的?看起来太混乱了,也许这个有更好的评价?

此外,角色还有可穿戴设备。所以这意味着我必须在字典中为配备选项卡创建另一个定义,这有点破坏了逻辑。

这是我之前提到的apparoach的测试:

DataService

0 个答案:

没有答案