我正在制作一个GUI 3玩家纸牌游戏(1台人和2台电脑)。每位玩家手中有3张牌。在每一轮都有一个经销商,第一个玩牌的玩家是经销商右边的玩家。每个玩家只能在左玩家玩完后玩。 (这是纸牌游戏的基础)
每个玩家将3张牌放在桌子上之后。经销商按钮传递给右边的玩家并开始新一轮。
我需要帮助来做一个控制转弯的功能,这可以看出轮到谁来玩。我是人为转,它等待输入。如果是计算机转,它会调用calss的动作功能。
我现在拥有的是具有套装和价值的卡类。
作为卡片列表的Deck类(此类具有填充功能和绘图卡功能)
我有一个Table类,其中包含一个卡片列表(当玩家玩牌时,卡片就会出现)
我有一个Player类(同一个类适用于人类和计算机播放器 - 这样好吗?)
Player类有一个Hand类(这就是玩家的3张牌)
Game类有一个套牌,一个桌子和3个玩家。
我的功能是人类是第一个玩牌并将一张牌移到桌面上,然后两个电脑玩家各自移动一张牌。这只适用于人类玩家是第一个玩的人。一旦玩了每个玩家的3张牌,开始另一轮,在这一轮不是玩家而是首先玩电脑。
我不知道如何制作一个系统来控制它。我不想要代码,而是想法本身。
由于
答案 0 :(得分:1)
我的播放器类中会有以下属性:
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();