【问题标题】:How to deal a deck of cards?如何处理一副牌?
【发布时间】:2014-08-19 23:00:11
【问题描述】:

我正在尝试创建一个应用程序来处理一副纸牌。我已经制作了套牌并洗牌了,但是如果玩家将其处理到 x 号,我将遇到麻烦 这是我目前所拥有的。

class Dealer
{
    private string[] suffeledDeck = new string[52];
    private static string[] playerOne = new string[26];
    private static string[] playerTwo = new string[26];
    private static string[] playerThree = new string[26];
    private static string[] playerFour = new string[26];
    private static string[] playerFive = new string[26];
    private static string[] playerSix = new string[26];
    private static string[][] allplayers = new string[][] { playerOne, playerTwo,playerThree,playerFour,playerFive,playerSix };

    private int counter = 0;
    private int playerCount = 6;

    public Dealer(string[] deck)
    { 
        suffeledDeck = deck;
    }

    private void deal()
    {
        for (int i = 0; i < suffeledDeck.Length; i++)
        {
            allplayers[counter][0] = suffeledDeck[i];
            counter++;
            if (counter == playerCount)
            {
                counter = 0;
            }
        }
    }
}

}

【问题讨论】:

  • 您似乎总是只给每个玩家一张牌。 allplayers[counter][0] = suffeledDeck[i] 总是覆盖第一张被放弃到最后一副牌的牌
  • @X.Li 感谢您改进帖子。但请仅进行实质性编辑。至少需要 3 人审核您的更改才能获得批准。这需要审稿人的时间。让它物有所值,并将少量编辑留给有足够代表进行编辑而无需批准的用户。谢谢。
  • @Taifun 谢谢你告诉我这个。直到我检查了我被捆绑的原因,我才知道编辑背后的机制。一旦我有足够的代表,我将继续修复小错误。谢谢大家的时间。

标签: c# arrays jagged-arrays


【解决方案1】:

这是一种方法,但我可能会使用 List&lt;T&gt;,正如 Selman22 建议的那样。

var sourceIndex = 0;
var handCount = 0;
while (sourceIndex < shuffledDeck.Length)
{
    for (var playerIndex = 0; playerIndex < allplayers.Length; playerIndex++)
    {
        allplayers[playerIndex][handCount] = shuffledDeck[sourceIndex++];
        if (sourceIndex == shuffledDeck.Length)
            break;
    }
    handCount++;
}

列表示例:

class Dealer
{
    private List<string> shuffledDeck= new List<string>();
    private static List<string> playerOne = new List<string>();
    private static List<string> playerTwo = new List<string>();
    private static List<string> playerThree = new List<string>();
    private static List<string> playerFour = new List<string>();
    private static List<string> playerFive = new List<string>();
    private static List<string> playerSix = new List<string>();
    private static List<List<string>> allplayers = new List<List<string>> { playerOne, playerTwo,playerThree,playerFour,playerFive,playerSix };

    private int counter = 0;
    private int playerCount = allplayers.Count;
    public Dealer(string[] deck)
    { 
        shuffledDeck= deck;
    }
    private void deal()
    {
        while (shuffledDeck.Count > 0)
        {
            foreach (var player in allplayers)
            {
                player.Add(shuffledDeck[shuffledDeck.Length - 1];
                shuffledDeck.RemoveAt(shuffledDeck.Length - 1];
                if (shuffledDeck.Length == 0)
                    break;
            }
        }
    }
}

这种方法的优点是可以从牌堆中取出已发牌。从最后开始发牌,因为RemoveAt(0) 复制了所有剩余的牌来填补空白。

更好的初始化,除非你真的需要 playerOne ... playerSix 变量:

private static int playerCount = 6;
private static List<List<string>> allplayers =
    Enumerable.Range(0, playerCount).Select(i => new List<string());

【讨论】:

  • 你能给我一个我们列出的例子吗?
  • 有没有一种简单的方法可以让我在 1-6 名玩家之间进行选择,并根据选择的玩家数量进行交易
  • @user2552211 当然可以。使用上一个代码示例中的初始化代码,并将 playerCount 设置为 1 到 6 之间的某个不同值。如果您的意思是从用户那里获取数字,那么这是一个相当不同的主题,因为它取决于这是什么类型的应用程序(控制台、web、winforms、wpf 等)。
【解决方案2】:

使用List&lt;string[]&gt; 代替string[][]

【讨论】:

  • 你不是说List&lt;string&gt;[]吗?
  • 你不是说List&lt;List&lt;Card&gt;&gt;吗?
  • 你的意思不是List&lt;Player&gt;包含List&lt;Card&gt;吗?
猜你喜欢
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 2014-11-14
  • 2012-05-26
  • 2012-06-07
  • 2021-10-06
  • 1970-01-01
  • 2014-02-08
相关资源
最近更新 更多