[英]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
,因此j
從26
開始到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.