如何在您的网站中连接两个人

有一个名为Verbosity的游戏(它是一个有目的的游戏),它就在这个链接上
www.gwap.com

在游戏中他们随机连接两个玩家互相玩,游戏是玩家1应该向他的伙伴(玩家2)描述一个单词,玩家2应该猜对话。
我正在尝试建立一个类似的网站,但我想知道
1-我如何随机连接两个玩家让他们一起玩,虽然他们不是注册用户(他们只是网站的访客)?
2-如何让他们在私人比赛中打球,我的意思是每两名球员都在玩自己的比赛?
3-我需要使用什么? 使用ASP.Net是否足够? 我需要银光吗?
谢谢

根据我的理解,我们有两个逻辑实体:

游戏:涉及两个私人玩家之间的互动

玩家:网站的访客(匿名)

我将从玩家开始,因为它更容易。 访客登陆您的网站,需要(唯一)识别他。 最简单的解决方案是Guid,它可以用作会话参数或会话cookie(我的建议)。 Guid不是可以为空的类型,所以任何32个零的Guid都将成为我们未定义的Guid。

拥有GUIDed访问者后,您需要一个将其连接到游戏的键/值集合。

场景1:每个访问者一次只能是一个游戏的玩家。 字典可以完成这项工作,非玩家的访客可以很容易地被追踪(游戏=未定义的Guid)

场景2:每个访问者可以同时成为许多游戏的玩家。 字典>是解决方案,但game = undefinedGuid将成为List.Count = 0

现在让我们看看你可以用游戏做些什么。 首先,您可以使用GUID来识别您的游戏。 这意味着您的玩家字典将为场景1的词典或场景2的词典>。显然,您需要为游戏设置键/值集合,让我们说的forms为字典。 GameDetails必须是一个包含必要信息的类,可以定义玩家之间的交互性。 在其他世界中,这个类必须包括每个玩家的角色(角色1:要求的人或角色2:正在猜测的人)以及他们作为键/值集合交换的消息,其中key是玩家Guid和值是一个字符串消息。

总而言之,您需要在global.asax中定义两个静态词典,一个用于玩家,一个用于游戏。 您还需要一个类似于此的GameDetails类(基本概念实现):

class GameDatails { public Guid Role1 { get; set; } // holds the guid of the player who asks public Guid Role2 { get; set; } // holds the guid of the player who guesses public List> Messages; // holds the player/message pairs public GameDetails(Guid role1, Guid role2) { this.Role1 = role1; this.Role2 = role2; this.Message = new List>(); } } 

添加和删​​除玩家很容易,游戏也很简单(玩家与游戏相关)。

你可以做很多其他的事情(即猜测退出的人,你随机分配另一个玩家继续等)。

或多或少这也是与私人房间进行asp.net聊天的方式。 您可以找到并检查一个简单的asp.net聊天脚本的好样本,查看逻辑和实现并使其适应上述内容。 此外,您可以扩展聊天脚本以支持私人房间,并且有两个应用程序而不是一个。

毋庸置疑,asp.net对您的项目来说已经足够了。 您需要考虑的是,如果您无法控制应用程序池的回收,您还需要一个持久层,否则您可能会丢失您的词典。

如果您需要更多帮助,请告诉我。

1-我如何随机连接两个玩家让他们一起玩,虽然他们不是注册用户(他们只是网站的访客)?

注册用户没有什么神奇之处。 ASP.NET可以跟踪匿名用户的状态。

2-如何让他们在私人比赛中打球,我的意思是每两名球员都在玩自己的比赛?

您只需要跟踪哪两个用户在一起玩。 这就像存储他们的SessionID一样简单

3-我需要使用什么? 使用ASP.Net是否足够? 我需要银光吗?

不要去Silverlight,你不需要它来实现这一点,我相信微软正在放弃它而转而支持HTML5。 此外,它的市场份额约为60%,而Flash约为100%,因此如果您使用Silverlight插件路线,那么人们将能够使用您的网站。

正如其他人所说,你的想法可以通过客户端AJAX和ASP.NET服务器端的组合来完成。 我推荐jQuery用于客户端代码,它使JavaScript和DOM操作变得轻而易举。

最后一件事,请查看http://browserquest.mozilla.org/ ,了解如何在没有今天浏览器技术插件的情况下完成的任务。

我想如果有两个人访问您的网站,他们可以分别访问数据并独立玩游戏

要控制站点中的并发用户数,您必须创建一个Application State变量并将两个选定的用户ID存储到该变量中。

每次用户尝试玩游戏时,您都必须检查其ID是否存在于应用程序状态变量中,如果存在则允许其他情况不允许。

当然你必须写很多代码

  1. 将userid添加/删除到Global.ascx文件中的Application State变量
  2. 实现身份validation以了解用户是谁以及用户validation。
  3. 如果您希望它们在一段时间后自动退出(空闲/固定),您必须在Global.ascx文件的Session_End事件中编写代码。

如果您想要具体答案,请告诉我更多细节。

创建一个类GameSession {int gameid; string player1; string player2}

假设最多只有一个游戏和2个用户

用户注册过程:如果第一个用户进入您的网站,检查用户是否已注册检查他的用户ID pwd并从表中获取用户ID,如果他是访客生成随机密钥(guid)或询问他是否有唯一密钥(uniquenickname) 。

状态管理:创建此类的对象,指定gameid = 1并指定player1 =用户的唯一键。 创建GameSession对象的集合,比如说GameSessions,将GameSession添加到GameSessions Store GameSessions到Application State。

下次如果其他用户登录,请按照相同的用户注册流程进行操作。 在GameSessions中检查空槽(空播放器2),如果找到则将此用户分配给GameSessions的第一个或选定的空槽。 现在这个GameSession已准备就绪。

将对象保存回应用程序状态。

允许用户玩游戏

为上述场景写下否定案例。

这样你就可以做到这一点。

客户端上的ASP.NET服务器端和Ajax(javascript)足以实现此目的。

粗略地说,您希望将客户端设置为以给定间隔轮询服务器以获取信息。 服务器将响应客户端随后作出反应的状态更新。

您为客户端提供唯一的令牌,服务器会跟踪哪些令牌在一起播放。 您将需要使用某种数据库来管理游戏中的待处理状态更新。

示例对话:

客户:加入

服务器:Join-Accepted,Token:55164145

客户:更新55164145

服务器:空闲,“等待对手”

客户:更新55164145

服务器:对手发现,“匿名用户31”

客户:更新55164145

服务器:描述“花”

客户:更新55164145

服务器:等待描述

客户:提交 – 描述55164145,“带花瓣的植物”

服务器:已接受 – 说明

客户:更新55164145

服务器:等待对手

客户:更新55164145

服务器:对手断开连接

你明白了。

使用SingleIR通过在Web浏览器中运行的javascript连接两个用户

http://signalr.net/

我建议使用NodeJS。 转到http://nodejs.org/下载并安装

它现在可以在Windows(我使用它)以及Linux上运行良好,并且您可以轻松地创建相关的微站点。

在线书籍http://www.nodebeginner.org/将帮助您快速上手。