2015-08-16 3 views
0

Я не понимаю, почему я получаю исключение из диапазона вне диапазона, когда я вызываю любую из функций перемещения. У меня есть игрок, установленный в правом нижнем углу «карты», чтобы он мог двигаться на север или на запад, но по какой-то причине я все время получаю исключение из диапазона.Почему я получаю исключение из диапазона исключений

Это основная программа:

namespace DungeonWalk 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     int length, width; 
     Console.WriteLine("What size dungeon do you want to traverse?"); 
     try 
     { 
      Console.Write("Length: "); 
      length = Int32.Parse(Console.ReadLine()); 
      Console.Write("Width: "); 
      width = Int32.Parse(Console.ReadLine()); 
     } 
     catch 
     { 
      Console.WriteLine("Invalid parameters."); 
      return; 
     } 
     var map = Tile.CreateMap(length, width); 
     var player = new Player(map.GetLength(0) - 1, map.GetLength(1) - 1); 
     while(true) 
     { 
      Console.WriteLine("What do you want to move next?"); 
      var move = Console.ReadLine().ToLower(); 
      while (true) 
      { 
       switch (move) 
       { 
        case "north": 
         Move.North(player, map[player.YPosition, player.XPosition]); 
         break; 
        case "south": 
         Move.South(player, map[player.YPosition, player.XPosition]); 
         break; 
        case "east": 
         Move.East(player, map[player.YPosition, player.XPosition]); 
         break; 
        case "west": 
         Move.West(player, map[player.YPosition, player.XPosition]); 
         break; 
        default: 
         Console.WriteLine("Not a vaild direction. Use cardinal directions."); 
         break; 
       } 
      } 
     } 
    } 
} 
} 

Это код для перемещения:

namespace DungeonWalk 
{ 
class Move 
{ 
    public static void North(Player player, Tile tile) 
    { 
     if(tile.NorthWall) 
     { 
      Console.WriteLine("There is a wall before you. You cannot proceed any further."); 
     } 
     else 
     { 
      player.YPosition -= 1; 
     } 
    } 

    public static void South(Player player, Tile tile) 
    { 
     if (tile.SouthWall) 
     { 
      Console.WriteLine("There is a wall before you. You cannot proceed any further."); 
     } 
     else 
     { 
      player.YPosition += 1; 
     } 
    } 

    public static void West(Player player, Tile tile) 
    { 
     if (tile.WestWall) 
     { 
      Console.WriteLine("There is a wall before you. You cannot proceed any further."); 
     } 
     else 
     { 
      player.XPosition -= 1; 
     } 
    } 

    public static void East(Player player, Tile tile) 
    { 
     if (tile.EastWall) 
     { 
      Console.WriteLine("There is a wall before you. You cannot proceed any further."); 
     } 
     else 
     { 
      player.XPosition += 1; 
     } 
    } 
} 
} 

И, наконец, вот код для CreateMap

public static Tile[,] CreateMap(int length, int width) 
    { 
     var map = new Tile[length, width]; 
     for (int i = 0; i < length; i++) 
     { 
      for (int j = 0; j < width; j++) 
      { 
       map[i, j] = new Tile(j, i, length, width); 
      } 
     } 
     return map; 
    } 
+2

Какая линия бросает это исключение? –

+0

Можете ли вы предоставить трассировку стека? – Sweeper

+2

Я уверен, что есть очень хороший шанс, что если Майкл сначала посмотрит на стек, прежде чем опубликовать его здесь, он сможет быстро исправить проблему самостоятельно – elgonzo

ответ

0

Два while петли в основной программе выглядят немного странно, и я не уверен, что это намеренно.

Текущая реализация:

while(true) 
{ 
    Console.WriteLine("What do you want to move next?"); 
    var move = Console.ReadLine().ToLower(); 
    while (true) 
    { 
     switch (move) 
     { 
      // Move player... 
     } 
    } 
} 

только запрашивает у пользователя шаг один раз, то внутренний цикл while продолжает движение игрока в заданном направлении навсегда. (Обратите внимание, что break выйдет только из инструкции switch, а не из внутреннего while).

Если устранить внутреннюю петлю вы получаете возможность выполнить один шаг за один раз:

while(true) 
{ 
    Console.WriteLine("What do you want to move next?"); 
    var move = Console.ReadLine().ToLower(); 

    switch (move) 
    { 
     // Move player... 
    } 
} 

Если есть что-то фанки происходит в Tile аксессорах (например NorthWall или XPosition), я не» t видят что-нибудь в методах Move, которые могут вызвать IndexOutOfRangeException.

Индексирование map может выходить за пределы, хотя, например. эта линия:

map[player.YPosition, player.XPosition] 

Если стены не сконфигурированы правильно, то, как описано выше, внутренний while цикл будет держать игрок навсегда не движется в том же направлении до тех пор, индекс массива увеличивается за пределы карты, генерируя исключение.

+0

Вау ... Я полностью упустил тот факт, что случайно случайно поставил два петель. Я чувствую себя очень глупым. Большое спасибо. – Michael