2012-10-06 44 views
1

我有兩個人在不同的瀏覽器上播放我的瀏覽器遊戲的一個問題。遊戲狀態由使用遊戲類和按鈕玩家點擊的會話變量控制。在遊戲結束時,玩家有3種選擇,可以重新匹配同一個玩家,找到另一個玩家,或完全斷開遊戲。如果玩家斷開連接,遊戲可以乾淨地銷燬遊戲對象並恢復所有的Session變量。如何知道兩會已單擊按鈕在瀏覽器遊戲ASP.NET C#

我遇到的問題是另外兩個按鈕的玩家選擇同步。如果兩個玩家選擇相同的按鈕,則遊戲繼續再次玩。但是如果一名球員想要複賽而另一名球員想再次參賽,那麼不同意的球員必須同時找到新球員。

我使用兩個會話變量,PlayWithSamePlayer意味着他們想要與同一個玩家重新匹配。我也使用ContinueChoicesMade來確保雙方玩家選擇相同的選項。如果ContinueChoicesMade是錯誤的,那麼這意味着兩個玩家不同意,並且被放回到我的遊戲經理中去尋找另一個玩家。 我可以弄清楚如何在我的兩個玩家同步方法中工作以放置在我的遊戲類中,這樣玩家的動作就可以被聆聽到。目前,如果我運行遊戲,當它到達我的方法時,它會作爲NullException出現。

我希望在遊戲結束時,一個玩家選擇一個按鈕,瀏覽器等待另一個瀏覽器點擊一個按鈕,然後檢查他們按下的是否相同,然後如果是相同;遊戲繼續前進,如果他們點擊的內容不同,遊戲繼續前進。玩家點擊重新匹配或找到新玩家後,同步會話變量的最佳方法是什麼?下面是我在遊戲類中處理兩個玩家的方法,以及我在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; 
    } 
} 
+0

會話數據不共享。使用相同的*正確共享* - 也就是*不*會話,*不* *視圖狀態,*不*靜態 - 資源來傳遞這個狀態,就像遊戲狀態的*休息*一樣。也就是說,「繼續」遊戲與「玩」遊戲時進行選擇/移動沒有區別。 – 2012-10-06 19:15:33

+0

上面的方法在運行遊戲的遊戲類中。它需要的參數是將信息發送給遊戲類的瀏覽器會話,然後將2 Sessions分離爲player1和player2。我發現當確認我的ContinueChoicesMade會話變量被選中時,會感到困惑。當兩位玩家點擊不同的按鈕時,這只是錯誤的。 – GivenPie

+0

會話數據在客戶端之間*不共享。我很困惑這是如何工作的。如果有一些魔術棒正在使用,那麼應該在上下文中加以說明。 – 2012-10-06 19:25:28

回答

2

我不認爲在這裏使用Session是個好主意。 (我不認爲你可以/應該從另一個線程讀取一個會話的數據。也許我錯了)
我想你應該在數據庫(SQL/NoSQL的)有至少2種實體的那些數據存儲:

  • 一個與2的SessionID的比賽記錄
  • 一個與玩家的會話ID和他們的選擇

所以,你可以存儲他們的選擇,並檢查他們是否會或不會打複賽。
假設您有某種投票或彗星解決方案,如果複賽條件成功,則會創建一個表格/遊戲室,如果玩家拒絕,則會顯示一條消息。

1

如果您要訪問共享數據,你需要使用一個數據存儲(如SQL作爲對方的回答中提到),也可以存儲在應用程序緩存中的信息。在這種情況下,您要做的是創建一個Game類來管理整個遊戲,然後爲單個用戶添加/刪除會話。

+0

我認爲這裏的「緩存」不適用。一個緩存可以存儲*可能在別處可用的東西 - 關鍵字是*可能*。除了特殊配置的環境外,沒有任何保證。使用SQL(或其他*有保證的*持久性機制)是最好的選擇。 – 2012-10-06 20:59:02

+0

我不明白你對Cache的看法。爲什麼「可能」它不在緩存中? –

+0

術語[緩存](http://en.wikipedia.org/wiki/Cache_(計算))通常用於指一個*臨時存儲*,其中的數據可能並不總是可用的(出於各種原因:驅逐,傳播,非持久重啓,範圍/地點,競態條件等),主要目的是加速數據訪問 - *不*存儲數據。因此,我不會依賴一個「緩存」來達到這個目的。 (不同的緩存 - 例如*非常*特定的配置 - 可能會或可能不會在特定的環境中提供更強的保證。) – 2012-10-06 22:44:35