2012-02-22 24 views
0

私の配列では、私は指数を超えていると言います。私のプログラムは、5人のプレイヤー(5つのインデックス)が行う数字推測ゲームです。私は配列を使ってオブジェクトクラスとプレーヤークラスを作成しました。 ゲームの第2または第3ラウンドでプログラムがクラッシュする箇所に達しました。私は2回目のラウンドでインデックスがループしなかったことに気付きました。ループは最初のループでインデックスを1から5までカウントし、2番目のループで2から5をカウントし、さらに3番目のループすべてのインデックスがシャッフルされ、1から5には行くことができません。IndexOutofRangeExceptionは何を意味しますか?

各プレイヤーは3つの推測を得るため、これらの3つの推測値とあなたの値を使用します。私はプレーヤーのために作成したオブジェクトの配列を取得し、以前の配列よりも小さい一時配列を作成し、現在の配列を得るために参照しました。

私はコード内の私の参照を見て、私が修正することができるほど多くのコードを見つけた、私はSystem.IndexOutOfRangeExceptionの原因となっているバグを見つけることができません。それは私の推測ゲームクラスによって引き起こされています。それはあなたが配列よりも大きなインデックスにアクセスしようとしていることを意味

using System; // only this using statement is needed here. 

namespace GuessingGame 
{ 

class GuessingGame 
{ 
    #region instance attributes 
    private const int GUESSES_ALLOWED = 3; 
    private const int NUMBER_OF_PLAYERS_TO_START = 5; 
    private const int MIN_VALUE = 1; 
    private const int MAX_VALUE = 15; 
    private Player[] players; 
    private Random randomSource; 
    #endregion 

    public GuessingGame() 
    { 
    Console.WriteLine("Starting Constructor of GuessingGame"); 
    players = new Player[NUMBER_OF_PLAYERS_TO_START]; 
    randomSource = new Random(); 

    string playerName = ""; 
    for (int index = 0; index < players.Length; index++) 
    { 
     Console.Write("What is the name for player #" 
       + (index +1) + "?\t"); 
     playerName = Console.ReadLine(); 
     players[index] = new Player(playerName, randomSource); 
     Console.Write("\n"); 
    } 
    Console.WriteLine("Ending GuessingGame Constructor"); 
    } 

    public GuessingGame(string [] playerNames) 
    { 

    Console.WriteLine("Starting Constructor of GuessingGame"); 
    players = new Player[playerNames.Length]; 
    randomSource = new Random(); 
    for (int index = 0; index < playerNames.Length; index++) 
    { 
     players[index] = new Player(playerNames[index], randomSource); 
    } 
    } 

    public void playGame() 
    { 
    int numberOfPlayersWhoHavePlayedThisRound = 0; 
    int index = 0; 

    bool[] playedThisRound = null; 
    string playerGuessEntry = ""; 
    int playerGuessValue = -1; 
    Player[] tempArray = new Player[players.Length - 1]; 
    bool roundOver = false; 

    Console.WriteLine(
      "Starting playGame - press any key to continue"); 
    //Console.Read() 

    while (roundOver == false) // Is this the right condition? 
    { 

     playedThisRound = new bool[players.Length]; 


     while (playedThisRound[index] == false) 
     { 
      do 
      { 
       Console.Write(players[index].getName() 
         + ", Enter a number between " 
         + MIN_VALUE.ToString() 
         + " and " + MAX_VALUE.ToString() 
         + " inclusive\t"); 
       playerGuessEntry = Console.ReadLine(); 
       Console.Write("\n"); 
      } 
      while (!int.TryParse(playerGuessEntry, 
         out playerGuessValue) 
        || playerGuessValue < MIN_VALUE 
        || playerGuessValue > MAX_VALUE); 
      if(playerGuessValue < MIN_VALUE || playerGuessValue > MAX_VALUE) 
      { 
       Console.Write("Invalid guess- try again"); 
      } 
      else 
      { 

       Console.WriteLine("You entered " 
         + playerGuessValue.ToString()); 

       players[index].makeAGuess(playerGuessValue); 
       playedThisRound[index] = true; 
       if (index == players.Length) 
       { 
        Console.WriteLine("End of Round"); 
        index = 0; //edit? 
        numberOfPlayersWhoHavePlayedThisRound = 0; 
       } 

      } 
      if (players[index].getGuessesUsed() == 3) 
      {//creating a temp array 
       Console.WriteLine("Guesses MAXED"); 
       tempArray = players[index].deletePlayerFromArray(players, index); 
       players = tempArray; // referencing 
       bool[] tempBooleanArray = new bool[playedThisRound.Length - 1];//reducing size of played this round array 
       Console.WriteLine("Playedthisround length: " + playedThisRound.Length + " \nThe Index: " + index.ToString()); 
       tempBooleanArray = players[index].deletePlayerBool(playedThisRound, index); 
       playedThisRound = tempBooleanArray; 
       Console.WriteLine("New Player Array Size: " + players.Length); 
       Console.WriteLine("New Boolean Array Size: " + playedThisRound.Length); 
      } 
      if (index == players.Length - 1) 
      { 
       index = 0; 
       numberOfPlayersWhoHavePlayedThisRound = 0; 
      } 
      if (players.Length == 1) 
      { 
       roundOver = true; 
      } 
      index++; 
      numberOfPlayersWhoHavePlayedThisRound++; 
     } 
      Console.WriteLine("WINNER:" + players[index].getName() + 
       "\nWins: " + players[index].getWins() + "\nArray Size: " + players.Length.ToString()); 

    }//end of while 

    Console.WriteLine("Ending playGame - " 
      + "press any key to continue"); 
    Console.Read(); 
    } 
     public bool playersAlreadyPlayed(bool[] thePlayer) 
     { 
      bool havePlayed = false; 
      for (int plays = 0; plays < thePlayer.Length; plays++) 
      { 
       if (thePlayer[plays] == false) 
       { 
        havePlayed = false; 
       } 
       else 
       { 
        havePlayed = true; 
       } 
      } 
      return havePlayed; 
     } 

    static void Main(string[] args) 
    { 
    GuessingGame newGame = new GuessingGame(); 
    newGame.playGame(); 
    } 
} 

}

そして、ここでプレイヤークラス

using System; 

namespace GuessingGame 
{ 

    class Player 
    { 

     private String name; 
     private int winningNumber; 
     private int guessesUsed; 
     private int wins; 
     private Random myWinningNumberSource; 

     public Player(string newName, Random random) 
     { 
     name = newName; 
     guessesUsed = 0; 
     wins = 0; 
     myWinningNumberSource = random; 
     winningNumber = myWinningNumberSource.Next(1, 16); 
     } 


     public bool makeAGuess(int guessValue) 
     { 
      bool isWinner = false;//edit 
     if (guessValue == winningNumber) 
     { 
      wins++; 

      Console.WriteLine("Congradulations, You have guessed correct number!\n"); 
      Console.WriteLine("You have a total of " + wins + " wins!"); 
      Console.WriteLine("You have " + (3 - guessesUsed) + " guesses left!\n"); 
      winningNumber = myWinningNumberSource.Next(1, 16); 
      isWinner = true; //edit 

     } 
     else 
     { 
      guessesUsed++; 

      Console.WriteLine("Oh no! You have guessed incorretly!"); 
      Console.WriteLine("You have used " + guessesUsed + " and have " + (3 - guessesUsed) + " guesses left!"); 
      Console.WriteLine("HINT: You should have guessed " + winningNumber); 
      isWinner = false; 


      if (guessesUsed > 3) 
      { 
       Console.WriteLine("Sorry you have Lost, Game Over"); 

      } 

     } 
     return isWinner; 
     } 

     public int getGuessesUsed() 
     { 
     return guessesUsed; 
     } 

     public string getName() 
     { 
     return name; 
     } 
     public int getWins() 
     { 
      return wins; 
     } 
     public Player[] getWinner(Player[] nPlayers) 
     { 
      int maxScore = 0; //edit 
      Player[] winningPlayers; 
      winningPlayers = new Player[5]; 
      for (int i = 0; i < nPlayers.Length; i++) 
      { 
       if (nPlayers[i].wins >= maxScore) 
       { 
        winningPlayers[i].wins = nPlayers[i].getWins(); 
        winningPlayers[i].name = nPlayers[i].getName(); 
       } 
      } 
      return winningPlayers; 
     } 
     public bool[] deletePlayerBool(bool[] playedThisRound, int removeIndex)//edit 
     { 
      bool[] newArray = new bool[playedThisRound.Length - 1]; 
      int tempIndex = 0; 
      for (int i = 0; i < playedThisRound.Length; i++) 
      { 
       if (i != removeIndex) 
       { 
        newArray[tempIndex++] = playedThisRound[i]; 
       } 
      } 
      return newArray; 
     } 
     public Player[] deletePlayerFromArray(Player[] nPlayers, int removeIndex) 
     { 
      Player[] newArray = new Player[nPlayers.Length - 1]; 
      int tempIndex = 0; 
      for (int i = 0; i < nPlayers.Length; i++) 
      { 
       if (i != removeIndex) 
       { 
        newArray[tempIndex++] = nPlayers[i]; 
       } 
      } 
      return newArray; 
     } 

    } 
} 
+1

ここで、デバッガを使用する必要があります。例外はどのコード行に投げられるのですか? –

+1

タイトルに答えるには:http://msdn.microsoft.com/en-us/library/system.indexoutofrangeexception.aspx –

+0

一般に、 'IndexOutofRangeException'は、配列の要素に大きなインデックスでアクセスしようとしていることを意味します配列の長さに等しいか、または等しい。覚えておいてください:**配列インデックスはゼロから始まり、**は1ではありません。 –

答えて

1

iは、0〜4でないnPlayerの長さの範囲内にあります。

public Player[] getWinner(Player[] nPlayers) 
    { 
     int maxScore = 0; //edit 
     Player[] winningPlayers; 
     winningPlayers = new Player[5]; 
     for (int i = 0; i < nPlayers.Length; i++) 
     { 
      if (nPlayers[i].wins >= maxScore) 
      { 
       winningPlayers[i].wins = nPlayers[i].getWins(); 
       winningPlayers[i].name = nPlayers[i].getName(); 
      } 
     } 
     return winningPlayers; 
    } 
0

です:

は、ここに私のGuessingGameクラスです。行内:

while(playedThisRound[index] == false) 

インデックスを使用する前に境界を確認していないため、クラッシュが発生している可能性があります。

+0

[OK]をクリックします。playsThisRound.Lengthの境界線を確認しますか? – GivenPie

0

つまり、配列の制限よりも大きいインデックスを持つ配列内の項目にアクセスしようとしています。

+0

...または0より小さい。 – phoog

関連する問題