【问题标题】:how to connect two people in your website如何在您的网站中连接两个人
【发布时间】:2012-04-05 17:09:09
【问题描述】:

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

在游戏中他们随机连接两个玩家互相玩,游戏是玩家1向他的伙伴(玩家2)描述一个单词,玩家2应该猜出这个单词。
我正在尝试建立一个做类似事情的网站,但我想知道
1-如何随机连接两个玩家让他们一起玩,尽管他们不是注册用户(他们只是网站的客人)?
2-如何让他们玩私人游戏,我的意思是每两个玩家都在玩自己的游戏?
3-我需要使用什么?使用 ASP.Net 就够了吗?我需要银光吗?
谢谢

【问题讨论】:

  • 这个问题过于宽泛。你真的需要缩小范围。
  • 您应该添加更多信息,例如您在应用程序中使用的层。你会用银光吗?还是普通的 asp.net?
  • 老实说,我不知道我是否应该使用 Silverlight。这就是为什么我要问我需要什么,使用 ASP.Net 就足够了吗?
  • 我建议研究 SignalR

标签: c# asp.net web


【解决方案1】:

据我了解,我们有两个逻辑实体:

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

玩家:网站的访问者(匿名)

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

拥有引导访问者,您需要一个键/值集合将他们连接到游戏。

场景 1: 每个访问者一次只能成为一个游戏的玩家。 Dictionary 可以完成这项工作,并且可以轻松追踪非玩家的访问者(game = undefined Guid)

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

现在让我们看看您可以用游戏做什么。首先,您可以使用 GUID 来识别您的游戏。这意味着您的玩家字典将是场景 1 的 Dictionary 或场景 2 的 Dictionary> 。显然,您将需要游戏的键/值集合,假设形式为字典。 GameDetails 必须是一个包含可以定义玩家之间交互性的必要信息的类。在其他世界中,这个类必须包括每个玩家的角色(角色 1:提问者或角色 2:猜测者)和他们作为键/值集合交换的消息,其中键是玩家 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<KeyValuePair<Guid, string>> Messages; // holds the player/message pairs
  public GameDetails(Guid role1, Guid role2)
  {
    this.Role1 = role1;
    this.Role2 = role2;
    this.Message = new List<KeyValuePair<Guid, string>>();
  }
}

添加和删除玩家和游戏一样简单(玩家连接到游戏)。

您还可以做很多其他事情(即猜中的人退出,而您随机分配另一名玩家继续等)。

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

不用说,asp.net 对您的项目来说已经绰绰有余了。您必须考虑的是,如果您无法控制应用程序池回收,您还需要一个持久层,否则您可能会丢失您的字典。

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

【讨论】:

  • 我问过我的一些朋友,他们说 Silverlight 比 ASP.Net 更容易构建这个项目!我现在很困惑!我该怎么办?
【解决方案2】:

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

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

2-如何让他们玩私人游戏,我的意思是每两个玩家都在玩自己的游戏?

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

3- 我需要使用什么?使用 ASP.Net 就够了吗?我需要银光吗?

不要使用 Silverlight,您不需要它来完成此任务,而且我相信 Microsoft 正在放弃它,转而支持 HTML5。另外,它的market share 大约是 60%,而 Flash 大约是 100%,因此如果您采用 Silverlight 插件路线,那么能够使用您网站的人就会减少。

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

最后一件事,请查看http://browserquest.mozilla.org/,了解在当今浏览器技术上不使用插件可以完成的工作示例。

【讨论】:

    【解决方案3】:

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

    要控制站点中的并发用户数,您必须创建一个应用程序状态变量并将两个选定的用户 ID 存储到其中。

    每次用户尝试玩游戏时,您必须检查其ID是否存在于Application State变量中,如果存在则允许他,否则不允许。

    当然要写很多代码来

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

    如果您需要具体答案,请告诉我更多详细信息。

    创建一个类 GameSession { int gameid;字符串播放器1;字符串播放器2}

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

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

    状态管理: 创建此类的对象,分配 gameid = 1 并分配 player1 = 用户的唯一键。 创建 GameSession 对象的集合,比如 GameSessions,将 GameSession 添加到 GameSessions 将 GameSession 存储到应用程序状态。

    下次如果有其他用户登录,请遵循相同的用户注册流程。检查 GameSessions 中的空槽(空 player2),如果找到,则将此用户分配给 GameSessions 的第一个或选定的空槽。现在这个 GameSession 已准备就绪。

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

    允许用户玩游戏

    写出上述情况的否定案例。

    这样你就可以做到了。

    【讨论】:

    • 1.应用程序状态或会话状态变量?因为应用程序状态变量对所有用户都是通用的。正确的? 2. 我如何识别特定游戏是私人的?我的意思是,假设我们都在玩,不使用数据库,我怎样才能阻止第三个用户允许访问这个游戏?请建议...
    • 看到我已经更新了我的答案,这是基本思想,当然你必须编写更多代码并修改一些方法。如果您需要更多信息,请告诉我。
    • 每次用户尝试玩游戏时,您必须检查其 ID 是否存在于 Application State 变量中,如果存在则允许他,否则不允许。 我应该考虑哪个 ID在客人的情况下?以及将哪个 ID 保存在 Application 变量中?
    • offcourse你必须为每个用户生成id,无论是注册用户还是访客,如果是注册用户没问题你可以获取唯一密钥,但如果是访客你必须强制他发送任何唯一的 id 或自己生成(通过在内部为他启动会话)。您也可以尝试使用用户的 IP 地址作为他的唯一 ID(尽管少数组织员工共享相同的组织 IP)
    • 如果两个人来自同一个域,那么公开的IP是一样的。
    【解决方案4】:

    ASP.NET 服务器端和客户端上的 Ajax (javascript) 足以完成此任务。

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

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

    对话示例:

    客户:加入

    服务器:接受加入,令牌:55164145

    客户:更新 55164145

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

    客户:更新 55164145

    服务器:找到对手,“匿名用户 31”

    客户:更新 55164145

    服务器:描述“花”

    客户:更新 55164145

    服务器:等待描述

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

    服务器:接受的描述

    客户:更新 55164145

    服务器:等待对手

    客户:更新 55164145

    服务器:对手断开连接

    你明白了。

    【讨论】:

      【解决方案5】:

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

      http://signalr.net/

      【讨论】:

        【解决方案6】:

        我建议为此使用 NodeJS。 前往http://nodejs.org/下载安装

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

        在线书籍http://www.nodebeginner.org/ 会让您快速上手。

        【讨论】:

          猜你喜欢
          • 2023-02-11
          • 1970-01-01
          • 2023-01-17
          • 2020-07-23
          • 1970-01-01
          • 2018-12-05
          • 1970-01-01
          • 2022-06-21
          • 1970-01-01
          相关资源
          最近更新 更多