游戏室人口跟踪器(C#)

时间:2017-10-24 06:58:43

标签: c#

我是Astroflux机器人(在线游戏)的创建者,名为ChatDaemon。为了开发更高级的功能,我需要程序(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
}

3 个答案:

答案 0 :(得分:0)

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

第一个是玩家。一个简单的界面将是......像:

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);
}

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

答案 1 :(得分:0)

在您的情况下,

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

答案 2 :(得分:0)

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

让我建议另一种方法:

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

Room# Player
1     Bob
1     Cindy
2     LadysMan123
3     Shooter92
3     SuupaHaxxor

这样你就可以使用LinQ来举例:

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

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

然后我会继续将该数据结构封装在一个类中,这样您就可以提供方便的访问。 (即IEnumerable<Player> GetPlayersInRoom( int roomId ))等方法

1 不一定需要按字面意思List<KeyValuePair<string, string>>