我正在开发一个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 :(得分: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();
}
答案 1 :(得分:0)
我认为一个好的解决方案是在这种情况下使用队列,
因为不是通过数组迭代来获得下一个玩家,你可以简单地使用
Queue.dequeue()
获得下一位玩家。
假设你存储你的活跃玩家阵列和经销商:
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
}