2016-12-07 8 views
0

私はWindowsフォームC#バーチャルトランプカードゲームに取り組んでいます.10人のプレイヤーが参加しています。各ラウンドの後、最初に行動する人は、ディーラーが回転するにつれて回転する(ほとんどのトランプゲームのように、最初に行動するプレーヤーは、処理した人の左にある)。トランプカードゲームの注文リストを変更する

プレイヤーはいつでも出席できますので、リストを使用して現在のアクティブプレイヤー(各プレイヤーのチェックボックスで管理)を保存するという計画でした。

このリストを使用して、どのプレイヤーが移動を必要とし、どの順番で行うかを決定したいと考えています。

私は、どのプレーヤーがディーラーであるかを別々の変数として把握していますが、正しく並べ替える方法や、現在ディーラーである人に基づいてリストの内容を正しく並べ替える方法がわかりません。

ゲームシナリオの例を以下に示します。ラウンド1プレーヤー1においてアクティブプレーヤー{1,2,3,5,8,9,10}

一覧ディーラーになり、従って再生の順序は2> 3> 5であろう>達成するために上の任意のアドバイス> 10> 1.

しかし何のプレイヤーがゲームを終了しないと仮定すると、ラウンド3のための順序は次のようになり5> 8> 9> 10> 1> 2> 3

8> 9これは非常に高く評価されます。

最初の考えでは、各ラウンドの終わりにリストを並べ替えることができましたが、これが正しいルートかどうかはわかりません。

答えて

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

モンに良い解決策を持っています、ゲームには最大10人のプレイヤーポーションがあります。プレイヤーは1から10の任意の座席位置に来ることができます。各ラウンドの順序はディーラーの周りを回転しますが、ディーラーの隣にいるプレイヤーは常に時計回りに動作します。それはポーカーの手で同じです。 新しいプレイヤーが来て座席位置7からプレイを開始した場合、座席位置6のプレイヤーの間で行動する必要があります(1と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 
     } 
関連する問題