我是Astroflux机器人(在线游戏)的创建者,名为ChatDaemon。为了开发更高级的功能,我需要程序(C#,在Windows Visual Studio 2017中编码)来跟踪哪些用户在哪个游戏室中,以便可以关闭特定房间或通知事件。基本上,我需要一个房间列表,每个房间都包含该房间内的玩家列表。
硬上限:
我曾尝试在这里寻找解决我问题的方法,但似乎所有以前的问题都是针对与我有太大不同的问题才有用。完全有可能我不知道怎么说出我的问题来找到我正在寻找的东西,所以如果这是重复的,请指出我正确的方向。
我尝试使用的代码(史诗般的失败: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
}
答案 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来举例:
并且:如果房间中的最后一个用户离开它,它将自动消失。
然后我会继续将该数据结构封装在一个类中,这样您就可以提供方便的访问。 (即IEnumerable<Player> GetPlayersInRoom( int roomId )
)等方法
1 不一定需要按字面意思List<KeyValuePair<string, string>>
。