【问题标题】:Game Room Population Tracker (C#)游戏室人口跟踪器 (C#)
【发布时间】:2017-10-24 15:51:39
【问题描述】:

我是一个名为 ChatDaemon 的 Astroflux(在线游戏)机器人的创建者。为了开发更高级的功能,我需要该程序(C#,在 Windows Visual Studio 2017 中编码)来跟踪哪些用户在哪个游戏房间中,以便可以关闭特定房间或通知事件。本质上,我需要一个房间列表,每个房间都包含该房间中的玩家列表。

硬上限:

  • 最多 150 名玩家
  • 最多 40 个房间
  • 每个房间最多 20 名玩家

我曾尝试在这里寻找解决问题的方法,但似乎之前的所有问题都是针对与我的差异太大而无用的问题。我完全有可能不知道如何表达我的问题以找到我正在寻找的内容,所以如果这是重复的,请指出我正确的方向。

我尝试使用的代码(史诗般的失败:D)是这样的:

Dictionary<List<string>, List<string>> WhoIsWhere = 
  new Dictionary<List<string>, List<string>>();

字典似乎可以使用,但我不知道如何根据需要使用它。

我需要的简单示例: 我们有 3 个房间和 5 个人分布在它们之间。

1:a,b,c

2:d

3:e

a 移动到空系统并创建房间 4,e 移动到房间 2,关闭房间 3。我们现在有:

1:b,c

2:d,e

4:a

简而言之,我需要能够将玩家从房间 1 移动到另一个房间,在我的列表列表中创建新房间,并在每个人离开特定房间时删除它们。我不知道该怎么做。有人可以提供一些建议吗?我会尽量关注这个帖子来回答你可能有的任何问题。

注意: 不用担心有人移动时如何通知程序,我已经处理好了。它每 10 秒扫描一次运动。

建议: 有没有可能像下面这样工作?

WhoIsWhere.Add("room1");
WhoIsWhere[room1].Add("newPlayer");
WhoIsWhere[room2].Remove("oldPlayer");
WhoIsWhere[room3].Clear();
WhoIsWhere.Remove("room4");
foreach (string userId in WhoIsWhere[room3])
{
    //send a message
}

【问题讨论】:

  • Dictionary&lt;List&lt;string&gt;, List&lt;string&gt;&gt; WhoIsWhere 看起来很奇怪 - List 键应该代表什么?此外,它会使使用这样的键相当尴尬(与例如:一个简单的string 作为键相比)
  • Dictionary&lt;List&lt;string&gt;, List&lt;string&gt;&gt; 即使这样可以编译,我认为你想使用Dictionary&lt;string&gt;, string&gt;,因为字典已经是一个集合
  • 哦,我明白你的意思了。它应该是 Dictionary> 而不是两个列表。我一定有这样的想法,既然我想要一个列表,它应该是字典中的两个列表。哎呀._.
  • 可以创建一个实际的 Room 类,它有一个 id/name 和一个里面的玩家列表吗?
  • 只要我可以像上面指定的那样操作和访问值,那就行了。我大约在 8-9 个月前开始编码,我知道的唯一代码是构建我目前所拥有的东西所需的代码。直到上周我才知道演员表是什么。

标签: c#


【解决方案1】:

我会为这个问题创建一些简单的类/接口。 在这种情况下,您有 2 个不同的实体。

第一个是玩家。一个简单的界面将是某事。喜欢:

public interface IPlayer{

    string Name { get; set; }

    ... other information about the player you need in you application...
}

另一个是包含可扩展玩家列表的房间。

public interface IRoom{

    string Name { get; set; }

    IList<IPlayer> Players { get; set; }

    // You can add players to the list with .Add(item) but maybe you want to validate the action or sth. like that.
    void AddPlayer(IPlayer player);
}

所以现在您可以创建实现接口的类,并在应用程序中的某处维护一个房间列表,其中包含您需要的信息。

【讨论】:

  • 这里真的需要接口吗?我理解问题的方式 OP 只有一种类型的房间和播放器,所以直接创建类应该没问题
  • @UnholySheep 当然他也可以只创建类,但我认为游戏可以包含不同类型的房间或玩家,创建界面并没有那么多工作。
  • ^^ 什么神圣的说加:球员名单真的不应该公开。接口不应定义实现者如何保留玩家。
【解决方案2】:

Dictionary&lt;GameRoom,List&lt;PlayerModel&gt;&gt; 在您的情况下会更好。GameRoom 是一个包含房间属性的类,例如房间 ID、名称、标题。对于玩家来说 PlayerModel 也是如此。您可以实现相同的目标不使用Dictionary。例如,GameRoom 可能包含活跃玩家列表。 我建议你在 GameRoom 类中使用玩家数组。你可以使用 observable 模式来跟踪活跃的玩家,它可能会通知你 - 谁活跃地留在房间里,谁离开了。

【讨论】:

    【解决方案3】:

    您想要做的基本上是查找一对多关系。 (一个房间包含1个以上的玩家,一个玩家只能在一个房间里)

    让我建议另一种方法:

    KeyValuePairs 列表1允许存在重复的键。这样你就可以拥有这样的数据结构:

    房间#玩家
    1 鲍勃
    1 辛迪
    2 LadysMan123
    3 射手92
    3 SuupaHaxxor

    这样你就可以使用 LinQ 来获取例如:

    • 房间 x 中的所有用户
    • 用户A的房间号

    并且:如果房间里的最后一个用户离开它,它会自动消失。

    然后我会继续将该数据结构封装在一个类中,以便您可以提供方便的访问。 (即 IEnumerable&lt;Player&gt; GetPlayersInRoom( int roomId ) 之类的方法)


    1 不一定是字面意义上的List&lt;KeyValuePair&lt;string, string&gt;&gt;

    【讨论】:

    • 除了键值对列表之外还有什么?也许我很天真。
    • @modtrafastroflux 好吧,您可以使用string[] 或具有两个字符串属性的自定义类或Tuple&lt;string,string&gt; 来代替KeyValuePair ...
    猜你喜欢
    • 1970-01-01
    • 2013-12-08
    • 2014-06-11
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多