2016-12-07 56 views
0

我正在研究一個Windows Form C#虛擬紙牌遊戲,有10個玩家,他們都輪流採取行動。每輪之後,首先行動的人隨着莊家的旋轉而旋轉(與大多數紙牌遊戲一樣,第一個行動的玩家位於發牌人的左側)。由於玩家可以在任何回合後坐下,我的計劃是使用一個列表來存儲當前活動的玩家(由每個玩家的複選框控制)。玩轉牌遊戲的轉換順序列表

我想用這個列表來確定哪些玩家需要進行移動以及按照什麼順序。

我跟蹤哪個球員是經銷商作爲單獨變量,但我不確定我將如何正確地對列表進行排序,或者根據誰是經銷商正確地對列表內容進行排序。

示例遊戲場景如下。

活躍玩家{1,2,3,5,8,9,10}

在圓一個播放機1列表將是經銷商,所以順序播放將是2> 3> 5> 8> 9> 10> 1.

但是假設沒有玩家離開遊戲,對於第3輪的順序將5> 8> 9> 10> 1> 2> 3。

上實現任何意見這將不勝感激。

我最初的想法是,在每輪結束時,我可以重新排列列表,但我不確定這是否是正確的路線。

回答

0

要旋轉列表中的實體,您基本上會刪除第一個,並在末尾添加他。這是一個小程序來闡明這個過程。

static void Main(string[] args) 
{ 
    List<int> players = new List<int> { 1, 2, 3, 5, 8, 9, 10 }; 

    for (int i = 1; i < 5; i++) 
    { 
     Console.WriteLine("Round Nr: " + i); 
     //rotate the List, shift dealer from first to last position 
     int dealer = players.First(); 
     players.Remove(dealer); 
     players.Add(dealer); 

     Console.WriteLine("order of moving:"); 
     Console.WriteLine(String.Join(" > ", players)); 
    } 

    Console.ReadKey(); 
} 
+0

這是偉大的,謝謝。我將如何處理重新添加一名球員。 玩家從經銷商左邊起依次相對於他們的位置。 因此,舉例來說,如果在第1輪中球員是{1,2,3,5,8,9,10},那麼經銷商將是1,所以首先行動將是2,然後是3,5,8,9 10。 如果一個新玩家從第7位開始回合,那麼我們需要將他添加到列表中(我們可以使用ListName.Add來完成,但這會將他添加到列表的末尾),但我們將需要在5和7之間添加他。因此,第2輪的新訂單將需要{3,5,7,8,9,10,1}。 – AntonZ

+0

@AntonZ「如果一個新玩家開始在第7個位置」和「但是我們需要在5到7之間添加他」並不真正連貫。舊名單中沒有7個。你如何確定新的職位?基於以前的元素?如果是這樣,那麼德米特里在他的評論 –

+0

Mong中有一個很好的解決方案,遊戲中最多有10個玩家位置。玩家可以在任何座位位置進入,1到10.當每一輪的順序都圍繞莊家旋轉時,莊家旁邊的玩家始終順時針方向回到莊家。它在撲克手中也是一樣。 因此,如果新玩家進入並從座位位置7開始玩,他將需要在座位位置6的玩家之間行動(如果有一個和8個(如果有的話)。 – AntonZ

0

我認爲一個好的解決辦法是在這種情況下使用的隊列, 因爲不是通過遍歷數組來獲得下一個玩家,你可以簡單地使用 Queue.dequeue()讓未來的球員。

asuming存儲您的現役球員陣列和經銷商是這樣的:

int[] activePlayers = { 1, 2, 3, 5, 8, 9, 10 }; 
    int dealer = 1; 

我做了一個簡單的方法爲你(當然,不是那麼簡單的,意大利麪條其實代碼,但它工作得很好)。

 private Queue<int> getNextRoundQueue(int lastRoundDealer) { 
     Queue<int> roundQueue = new Queue<int>(); 
     int indexOfDealer = -1; 
     //if last round dealer is still active player 
     if(activePlayers.Contains(lastRoundDealer)) { 
      indexOfDealer = Array.IndexOf(activePlayers, lastRoundDealer); 
     } 
     //if last round dealer left get next player as a dealer 
     //side note: there's gotta be a better way of doing that, but nothing came me to mind right now 
     else { 
      indexOfDealer = -1; 
      for(int i = 0; i < activePlayers.Length; i++) { 
       if(activePlayers[i] > lastRoundDealer) { 
        indexOfDealer = i; 
        break; 
       } 
      } 
      if(indexOfDealer == -1) indexOfDealer = 0; 
     } 
     //create the queue 
     //add dealer as first item into the queue 
     roundQueue.Enqueue(activePlayers[indexOfDealer < activePlayers.Length ? indexOfDealer : indexOfDealer - activePlayers.Length]); 
     for(int i = 0; i < activePlayers.Length - 1; i++) { 
      //add next player to the queue 
      roundQueue.Enqueue(activePlayers[indexOfDealer + i + 1 < activePlayers.Length ? indexOfDealer + i + 1: (indexOfDealer + i + 1) - activePlayers.Length]); 
     } 
     return roundQueue; 
    } 

它將爲下一輪爲您準備隊列,使用它,你只需要做:

 //you get the queue using my method, you pass last round dealer as argument 
     Queue<int> roundQ = getNextRoundQueue(dealer); 
     //first element of the queue is the dealer of next round 
     dealer = roundQ.Dequeue(); 
     //while there are still players in the queue 
     while(roundQ.Count > 0) { 
      //get current player 
      int currentPlayer = roundQ.Dequeue(); 
      // do something with him 
     }