Как предотвратить indexoutofrangeException? [закрыто] ⇐ C#

Место общения программистов C#
Anonymous
Как предотвратить indexoutofrangeException? [закрыто]

Сообщение Anonymous »

Я пишу простую игру консоли в C#, где карта хранится как 2 -й Char [,], а игрок движется с клавишами стрел. Вот ядро ​​моей логики движения: < /p>
using System;
using System.IO;
using System.Collections.Generic;

class Mezo { public int X, Y; public char T; }

class Program
{
static char[,] palya;
static int startX, startY;

static void Main()
{
Init();
RunGame();
}

static void Init()
{
var sorok = File.ReadAllLines("palya.txt");
int rows = sorok.Length, cols = sorok[0].Length;
palya = new char[rows, cols];
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
{
palya[i, j] = sorok[j];
if (palya[i, j] == '*')
{
startX = i;
startY = j;
palya[i, j] = ' ';
}
}
}

static void RunGame()
{
int x = startX, y = startY;
var kezdet = DateTime.Now;
while (true)
{
Console.Clear();
Draw(x, y);
Console.WriteLine($"Idő: {(DateTime.Now - kezdet).TotalSeconds:F1}s");

var k = Console.ReadKey(true).Key;
int nx = x, ny = y;
if (k == ConsoleKey.LeftArrow) ny--;
if (k == ConsoleKey.RightArrow) ny++;
if (k == ConsoleKey.UpArrow) nx--;
if (k == ConsoleKey.DownArrow) nx++;

if (palya[nx, ny] != 'X')
{
x = nx;
y = ny;
}
if (palya[x, y] == 'T')
{
Console.Clear();
Draw(x, y);
Console.WriteLine("Nyertél!");
break;
}
}
}

static void Draw(int px, int py)
{
int rows = palya.GetLength(0), cols = palya.GetLength(1);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
if (i == px && j == py)
Console.Write('*');
else
Console.Write(palya[i, j]);
}
Console.WriteLine();
}
}
}
< /code>
Проблема: Когда игрок находится на краю карты, и нажимает клавишу со стрелкой снаружи, я получаю индексаутофрангексэкспений на поиске Palya [NX, NY]. Я знаю, что мне нужно проверить, что NX и NY остаются внутри [0, ряды) и [0, cols), но я не уверен в самом чистом способе структурировать эти проверки без дублирования кода или создания логического грязного. Перед проверкой на стены, но это становится словесной. /> Должен ли я извлечь помощника, такого как Bool Canmoveto (int nx, int ny)? Если так, как это может выглядеть?>

Подробнее здесь: https://stackoverflow.com/questions/796 ... eexception

Вернуться в «C#»