簡體   English   中英

為什么這個數組超出范圍?

[英]Why is this array out of bounds?

class Program
{
    static void Main(string[] args)
    {
        string[] deck = {"1♥","2♥","3♥","4♥","5♥","6♥","7♥","8♥","9♥","10♥","11♥","12♥","13♥",
                     "1♦","2♦","3♦","4♦","5♦","6♦","7♦","8♦","9♦","10♦","11♦","12♦","13♦",
                     "1♣","2♣","3♣","4♣","5♣","6♣","7♣","8♣","9♣","10♣","11♣","12♣","13♣",
                     "1♠","2♠","3♠","4♠","5♠","6♠","7♠","8♠","9♠","10♠","11♠","12♠","13♠"};

        string[] player = new string[26];
        string[] computer = new string[26];

        deck = Shuffle(deck);

        foreach (string d in deck)
        {
            Console.WriteLine(d);
        }

        Console.WriteLine(deck.Length);

        for (int i = 0; i < 26; i++)
        {
            player[i] = deck[i];
            Console.WriteLine(player[i]);
        }

        for (int j = 26; j < 52; j++)
        {
            computer[j] = deck[j];
            Console.WriteLine(computer[j]);
        }


    }

    static string[] Shuffle(string[] deck)
    {
        Random r = new Random();

        for (int i = deck.Length; i > 0; i--)
        {
            int j = r.Next(i);
            string k = deck[j];
            deck[j] = deck[i - 1];
            deck[i - 1] = k;
        }
        return deck;
    }

}

所以我嘗試做的是制作一副紙牌。 然后,我所做的就是使用Shuffle方法對數組進行混洗並更改了Deck數組。

它將把紙牌陣列的一半分配給播放器和計算機(播放器獲得上半部,計算機獲得下半部)。 現在先將其改組,是的,這似乎很公平。

所以我越界錯誤的行是這行:

computer[j] = deck[j];

您需要從0而不是26開始索引computer

for (int j = 26; j < 52; j++)
{
    computer[j - 26] = deck[j];
    Console.WriteLine(computer[j - 26]);
}

或者,偏移deck索引:

for (int i = 0; i < 26; i++)
{
    computer[i] = deck[i + 26];
    Console.WriteLine(computer[i]);
}

如果您不需要打印初始卡片,則可以使用LINQ更加簡潔地實現:

player = deck.Take(26).ToArray();
computer = deck.Skip(26).ToArray();

您的計算機陣列長度為26因此最大索引為25.但是您嘗試在該循環中將元素添加到26.索引,這是錯誤的原因

for (int j = 26; j < 52; j++)
{
     computer[j] = deck[j];
     Console.WriteLine(computer[j]);
}

解決方案是在這里從j中減去26:

computer[j - 26] = deck[j];

也在該行之后:

Console.WriteLine(computer[j-26]);

應該是computer[j-26] = deck[j];

但是,由於computer的長度僅為26 ,因此j26開始到52為止。

索引computer ,您需要使用26的偏移量,

for (int j = 26; j < 52; j++)
{
    computer[j - 26] = deck[j];

    Console.WriteLine(computer[j]);
} 

在循環中,因為deck足夠大,所以索引正確。 但是, computer只有26個元素長。 您的i從26開始,這已經超出了computer 您需要針對兩個數組調整一種或另一種方式,請參見下文

for (int j = 26; j < 52; j++)
{
    computer[j-26] = deck[j];
    //        ^ <-adjust for smaller array
    Console.WriteLine(computer[j]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM