1

我的浏览器游戏有两个人在不同浏览器上玩的问题。游戏状态由使用 Game Class 的 Session 变量和玩家点击的按钮控制。游戏结束时,玩家有 3 种选择,要么重新匹配同一个玩家,要么寻找另一个玩家,要么完全断开游戏。如果玩家断开连接,游戏可以彻底销毁游戏对象并恢复所有 Session 变量。

我遇到的问题是同步玩家选择的其他两个按钮。如果两个玩家都选择了相同的按钮,那么游戏将再次进行。但是,如果一名球员想要复赛而另一名球员想再次比赛,那么意见不合的球员必须都找到新球员。

我使用了两个 Session 变量,PlayWithSamePlayer意味着他们想要与同一个玩家重赛。我还使用ContinueChoicesMade来确保两个玩家都选择相同的选项。如果ContinueChoicesMade为假,则表示两个玩家不同意,并被放回我的游戏管理器以搜索其他玩家。我可以弄清楚如何在我的 Game 类中使用我的两个玩家同步方法,以便可以听到两个玩家的动作。目前,如果我运行游戏,当它到达我的方法时,它会以 NullException 的形式出现。

我希望在游戏结束时,一个玩家选择一个按钮,浏览器等待另一个浏览器点击一个按钮,然后检查他们按下的是否相同,然后是否相同;游戏继续进行,如果他们点击的内容不同;游戏继续进行。在玩家点击重新匹配或找到新玩家后,同步 Session 变量的最佳方法是什么。下面是我在处理两个玩家的游戏类中的方法,以及在我的 aspx.cs 页面上调用的方法。

((Game)Session["Game"]).RoundOverSynchronizing(Session);//when should I call this out? this is not apart of the game class.


    public void RoundOverSynchronizing(HttpSessionState player)
{

    if (((bool)player1["PlayWithSamePlayer"]) == true
    && ((bool)player2["PlayWithSamePlayer"]) == true)
    {
        player1["ContinueChoicesMade"] = true;
        player2["ContinueChoicesMade"] = true;
    }
    else if (((bool)player1["PlayWithSamePlayer"]) == false
  && ((bool)player2["PlayWithSamePlayer"]) == false)
    {
        player1["ContinueChoicesMade"] = true;
        player2["ContinueChoicesMade"] = true;
    }
    else
    {
        player1["ContinueChoicesMade"] = false;
        player2["ContinueChoicesMade"] = false;
    }
}
4

2 回答 2

2

我不认为在这里使用 Session 是一个好主意。(而且我认为您不能/不应该从另一个线程读取会话的数据。也许我错了)
我认为您应该将这些数据存储在数据库(SQL/NoSQL)中,至少有两种实体:

  • 一个带有 2 个 SessionId 的匹配记录
  • 一个有玩家的 SessionId 和他们的选择

因此,您可以存储他们的选择并检查他们是否会参加复赛。
假设您有某种投票或彗星解决方案,如果重赛条件成功,则会创建一个桌子/游戏室,如果玩家拒绝,则会显示一条消息。

于 2012-10-06T19:31:46.190 回答
1

如果要访问共享的数据,则需要使用数据存储(如另一个答案中提到的 SQL),或者可以将信息存储在应用程序缓存中。在这种情况下,您要做的是创建一个 Game 类来管理整个游戏,然后为各个用户添加/删除会话。

于 2012-10-06T19:38:39.730 回答