2014-01-28 69 views
0
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方法來洗牌數組並改變牌組數組。爲什麼這個數組越界了?

它會將一半的甲板陣列分配給玩家和電腦(玩家獲得前半部電腦後半部分)。現在這首先洗牌,看起來似乎公平。

所以我得到一個出界失誤的線是這一行:

computer[j] = deck[j]; 
+1

更改爲'電腦[J-26] =甲板[J]' –

+1

電腦的大小爲26,但因爲數組基於0,從0到25;計算機[j]從26到51,這超出了計算機的範圍。 –

+0

另外,這裏的錯誤很明顯。這是超越界限。所以,只要你遇到這樣的錯誤,你應該在那裏貼一個斷點,跟蹤你的循環,並檢查索引是你認爲他們應該是什麼。 –

回答

8

你需要從0開始的索引computer,而不是26:

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(); 
4

您的計算機數組的長度26因此最大指數25.但你試圖元素在添加到26.指數循環,這是錯誤的原因

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

而且解決方案是減26 FR OM j在這裏:

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

該行也是經過:

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

也許發佈正確的代碼?像'電腦[j-26]' – x4rf41

2

因爲computer只有長度26,然而,j在開始26並上升到52

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

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

    Console.WriteLine(computer[j]); 
} 
2

在你的循環,你的索引是正確的,因爲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]); 
}