1

重複の可能性:
3 プレイヤー カード ゲームのターン システム

GUI 3 プレーヤー カード ゲーム (1 人の人間と 2 台のコンピューター) を作成しています。各プレイヤーは 3 枚の手札を持っています。各ラウンドにはディーラーがいて、最初にカードをプレイするのはディーラーの右側のプレイヤーです。各プレイヤーは、左のプレイヤーがプレイした後にのみプレイできます。(カードゲームの基本です)

各プレイヤーが 3 枚のカードをテーブルに置いた後。ディーラー ボタンが右側のプレイヤーに渡され、新しいラウンドが始まります。

ターンを制御する機能を実行するには、助けが必要です。これにより、誰のターンをプレイするかを確認できます。私は人間の番で、入力を待ちます。コンピュータのターンであれば、calss のアクション関数を呼び出します。

私が今持っているのは、Suit と Value を持つ Card クラスです。

カードのリストである Deck クラス (このクラスには、suffle 機能とドローカード機能があります)

カードのリストを持つ Table クラスがあります (これは、プレイヤーがカードをプレイするときにカードが移動する場所です)

私は Player クラスを持っています (同じクラスが人間とコンピュータのプレーヤー用です - これは良いですか?)

プレーヤー クラスにはハンド クラスがあります (プレーヤーの 3 枚のカードがある場所)。

Game クラスには、1 つのデッキ、1 つのテーブル、および 3 人のプレイヤーがいます。

私は、人間が最初にプレイして 1 枚のカードをテーブルに移動し、次に 2 人のコンピューター プレイヤーがそれぞれ 1 枚のカードを移動するという機能を持っています。これは、人間のプレイヤーが最初にプレイする場合にのみ機能します。各プレイヤーの 3 枚のカードがプレイされると、別のラウンドが開始されます。このラウンドでは、プレイヤーではなく、コンピューターが最初にプレイします。

これを制御する 1 つのシステムを作成する方法がわかりません。私が欲しいのはコードではなく、アイデアそのものです。

ありがとう

4

1 に答える 1

1

私のPlayerクラスには、次のようなプロパティがあります。

public bool IsComputer { get; set; }
public bool IsCurrentTurn { get; set; }
public int TurnOrder { get; set; }

そうすれば、彼らが人間であるかどうか、そしてそれが彼らの番であるかどうかに基づいてロジックを書くことができます。TurnOrderプロパティを使用して、次のターンを決定します。

したがって、次のようにPlayerオブジェクトを作成する場合:

Player player1 = new Player();

メインロジックに次のようなものを追加できます。

if (player1.IsComputer) 
{
   PerformTurn();
}
else //Human
{
   //Logic to wait and allow human player to do his or her turn here
}

編集:

誰の番かを判断するために、最初にプレーヤーをプレーヤーのリストに入れます。例:

List<Player> players = new List<Player>
{
new Player {Name = "Player 1", IsComputer = false, TurnOrder = 0, IsCurrentTurn = true},
new Player {Name = "Player 2", IsComputer = true, TurnOrder = 1, IsCurrentTurn = false},
new Player {Name = "Player 3", IsComputer = true, TurnOrder = 2, IsCurrentTurn = false}
};

次に、各プレーヤーのTurnOrderプロパティを使用して、次のターンを決定する関数を作成します。このような方法はそれを行います:

public Player GetNextPlayer()
{
   Player currentPlayer = players.First(x => x.IsCurrentTurn);

   //if player is last in the turn order return first player
   if (currentPlayer.TurnOrder == players.Max(x => x.TurnOrder).TurnOrder)
   {
       return players.Min(x => x.TurnOrder);
   }
   else 
   {
      return players.First(x => x.TurnOrder == (currentPlayer.TurnOrder + 1));
   }


}

Of course, you could just use the index of the list and skip using the TurnOrder altogether, although if you wanted to expand your game, using the index as the turn order may hurt you later on. I think the TurnOrder property is much more flexible.

To get the next player in the turn, just use this:

Player currentPlayer = GetNextPlayer();
于 2012-09-24T18:30:43.937 に答える