扑克牌游戏的转换顺序列表

时间:2016-12-07 09:18:22

标签: c# winforms

我正在开发一个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。

非常感谢任何有关实现这一目标的建议。

我最初的想法是,在每轮结束时,我可以重新订购清单,但我不确定这是否是正确的路线。

2 个答案:

答案 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
        }