0

mainDeckトランプのデッキの値を保持するという名前の配列があります。私が次にしなければならないことは、その配列内のカードを and という名前の 2 つの別個の配列に配布することですplayerDeckcomputerDeck各デッキには一意のカードが含まれている必要があります。

私が抱えている問題は、デッキごとに 26 枚という独自の価値を持つカードを配布することです。私はいくつかの異なるアプローチを試しましたが、コメントの一番下にあるコーディングは、私がクラスに出なければならない前にやろうとしていたことの最後の名残です。

注:私のプログラミングスキルは、私の理解を深めないため、単に解決策を提供するのではなく、あなたの答えを説明してください.

static void Main(string[] args)
{
        // 1 = Ace , 13 = King : 0 = Hearts, 1 = Diamonds, 2 = Clubs, 3 = Spades
        int[] mainDeck = new int[52];
        FillDeck(mainDeck);

        int[] playerDeck = new int[26];
        int[] computerDeck = new int[26];
        // Check mainDeck elements
        foreach (int number in mainDeck)
        {
            Console.WriteLine(number);
        }

    }
    public static void FillDeck(int [] mainDeck)
    {
        int cardType = 1;
        List<int> deck = new List<int>();            

        // Add cards to a list
        for (int x = 0; x < 13; x++)
        for(int y = 0; y < 4; y++)
        {
            deck.Add(cardType);
            if (y == 3)
                ++cardType;
        }

        // Insert deck list into a new Array
        int[] cards = deck.GetRange(0, 52).ToArray();

        // Add cards array to mainDeck
        for (int x = 0; x < 52; ++x)
        {
            mainDeck[x] = cards[x];
        }
    }
    //public static void Distribute()
    //{
    //    RandomNumber number = new RandomNumber();
    //    int value = number.RandomNum;

    //    List<int> playerCards = new List<int>();
    //    for (int x = 0; x < 2; ++x)
    //    {
    //        Console.WriteLine(number.RandomNum);
    //    }
    //}
}
//class RandomNumber
//{
//    private int randomNum;
//    Random ranNumberGenerator;

//    public RandomNumber()
//    {
//        ranNumberGenerator = new Random();
//    }

//    public int RandomNum
//    {
//        get
//        {
//            randomNum = ranNumberGenerator.Next(1, 26);
//            return randomNum;
//        }
//    }
//}
4

5 に答える 5

1

ここでは、デッキ内で値を一意に保つための 2 つのオプションがあります。ランクとスーツのプロパティを持つカードを表す新しいクラスを作成するか、(とにかくコンパイラの観点から) シンプルに保ちたい場合は、値を使用してランクとスーツの両方を示すことができます。ランクのみを示すために 1 ~ 13 を使用しています。

後者のソリューションでは、0 から 12 の数字を使用してエースからキング オブ ハートまでを示し、13 から 25 までの数字を使用してエースからキング オブ ダイヤモンドを示します。使用するカードのランクを取得し、使用するcard % 13カードのスートを取得しますcard / 4

ただし、前者のソリューションを好み、次のようなクラスを作成します (さらに読みやすくするために、int プロパティを列挙型に置き換えることもできます)。

public class Card
{
    public int Rank { get; set; }
    public int Suit { get; set; }
}

その後、メイン デッキが空になるまで実行され、メイン デッキからランダムなカードを選んで他の 2 つのデッキに入れるループを作成できます。疑似コードでは、次のようになります。

while (mainDeck has any elements)
    num = random number between 0 and elements in mainDeck - 1, inclusive
    deckToAddTo = alternate between playerDeck and computerDeck
    remove card num from mainDeck and insert into deckToAddTo
于 2012-05-30T17:52:55.467 に答える
0
Random  rnd = new Random();
// you can Shuffle Array and Take random 26 items using Linq as below
int[] playerDeck = mainDeck.OrderBy(x => rnd.Next()).Take(26).ToArray();
// get rest of the items using Except linq method 
int[] computerDeck = mainDeck.Except(playerDeck).ToArray();
于 2012-05-30T17:54:47.587 に答える