1

異なるブラウザで2人がプレイするブラウザゲームに問題があります。ゲームの状態は、ゲームクラスとプレーヤーがクリックするボタンを使用したセッション変数によって制御されます。ゲームの終了時に、プレーヤーには3つの選択肢があります。同じプレーヤーを再戦するか、別のプレーヤーを見つけるか、ゲームを完全に切断するかです。プレーヤーが切断した場合、ゲームはゲームオブジェクトを完全に破棄し、すべてのセッション変数を元に戻すことができます。

私が抱えている問題は、プレイヤーが選択した他の2つのボタンを同期させることです。両方のプレーヤーが同じボタンを選択した場合、ゲームは再びプレイに進みます。ただし、一方のプレーヤーが再戦を希望し、もう一方のプレーヤーが再度プレイしたい場合は、同意しないプレーヤーの両方が新しいプレーヤーを見つける必要があります。

私は2つのSession変数を使用します。PlayWithSamePlayerは、同じプレーヤーとの再戦を望んでいることを意味します。また、ContinueChoicesMadeを使用して、両方のプレーヤーが同じオプションを選択するようにします。ContinueChoicesMadeがfalseの場合、2人のプレーヤーが同意しなかったことを意味し、別のプレーヤーを検索するためにゲームマネージャーに戻されます。両方のプレーヤーのアクションを聞くことができるように、ゲームクラスに配置される2人のプレーヤーの同期メソッドで作業する方法を理解できます。現時点でゲームを実行すると、メソッドに到達するとNullExceptionとして出力されます。

ゲームの終了時に、一方のプレーヤーがボタンを選択し、ブラウザーがもう一方のブラウザーがボタンをクリックするのを待ってから、押したものが同じかどうかを確認し、次に同じかどうかを確認するようにします。ゲームは進行し、クリックしたものが異なる場合。ゲームが進みます。プレーヤーが再一致をクリックした後、または新しいプレーヤーを見つけた後、セッション変数を同期するための最良の方法は何ですか。以下は、2人のプレーヤーを処理するゲームクラスのメソッドと、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を使用するのは良い考えではないと思います。(そして、セッションのデータを別のスレッドから読み取ることができる/すべきではないと思います。おそらく私は間違っています)
これらのデータを少なくとも2種類のエンティティでデータベース(SQL / NoSQL)に格納する必要があると思います。

  • 一致レコードのSessionIdが2つあるもの
  • プレイヤーのSessionIdとその選択肢を備えたもの

したがって、彼らの選択を保存して、彼らが再戦をプレイするかどうかを確認することができます。
ある種のポーリングまたはコメットソリューションがあるとすると、再戦条件が成功した場合はテーブル/ゲームルームが作成され、プレーヤーが拒否した場合はメッセージが表示されます。

于 2012-10-06T19:31:46.190 に答える
1

共有されているデータにアクセスする場合は、データストレージ(他の回答で説明されているSQLなど)を使用するか、アプリケーションのキャッシュに情報を保存する必要があります。この場合、ゲーム全体を管理するGameクラスを作成してから、個々のユーザーのセッションを追加/削除します。

于 2012-10-06T19:38:39.730 に答える