1

可能重复:
3人纸牌游戏回合系统

我正在制作一个 GUI 3 玩家纸牌游戏(1 人和 2 台计算机)。每个玩家手上有3张牌。在每一轮中都有一个庄家,第一个打牌的玩家是庄家右边的玩家。每个玩家只能在左边的玩家玩完后才能玩。(这是纸牌游戏的基础)

在每个玩家都把 3 张牌放在桌子上之后。庄家按钮传给右边的玩家,新一轮开始。

我需要帮助来做一个控制转弯的功能,它可以看到轮到谁玩。我轮到人类了,它等待输入。如果是电脑转,则调用类的动作函数。

我现在拥有的是一个带有 Suit 和 Value 的 Card 类。

作为卡片列表的 Deck 类(此类具有 suffle 功能和抽牌功能)

我有一个包含卡片列表的 Table 类(这是玩家玩卡片时卡片所在的位置)

我有一个 Player 类(同一类适用于人类和计算机玩家 - 这很好吗?)

Player 类有一个 Hand 类(那是玩家的 3 张牌所在的位置)

游戏类有一张牌、一张桌子和 3 名玩家。

我的功能是人类先玩并将一张牌移到桌子上,然后2个电脑玩家各移一张牌。这只有在人类玩家是第一个玩的时候才有效。一旦每个玩家的3张牌被打出,开始另一轮,在这一轮中不是玩家而是计算机首先玩。

我不知道如何制作一个系统来控制它。我不想要代码,而是想法本身。

谢谢

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));
   }


}

当然,您可以只使用列表的索引,而完全跳过使用 TurnOrder,尽管如果您想扩展您的游戏,使用索引作为回合顺序可能会在以后伤害您。我认为 TurnOrder 属性要灵活得多。

要在回合中获得下一个玩家,只需使用以下命令:

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