@Wirsak

Где ошибка в коде C#?

Пишу Крестики-Нолики. При вводе координат появляется ошибка "Индекс находился вне границ массива", которая указывает на строку(покажу в коде).

using System;

namespace MyGame
{
	class Field
	{
		//Двумерный массив для поля.
		int[,] array = new int[3, 3];

		//Заполнение массива единицами, единица обозначает, что клетка пуста.
		private void fill_array()
		{
			for (int i = 0; i < 3; i++)
				for (int j = 0; j < 3; j++)
					array[i, j] = 1;
		}

		//Вывод поля на экран
		private void draw_array()
		{
			for (int i = 0; i < 3; i++)
			{
				for (int j = 0; j < 3; j++)
					Console.Write(array[i,j] + " ");
				Console.WriteLine();
			}
		}

		public Field()
		{
			fill_array();
			draw_array();
		}

		//Ввод нуля и последующая проверка на выигрыш.
		public void Enter0()
		{
			int x, y;

			x = Console.Read();
			y = Console.Read();
			array[x, y] = 0;
			draw_array(); <== Указывает на этот метод
			if (Check(x, y))
				Player.Win();
		}

		//Проверка на выигрыш. Проверяет содедние клетки по горизонтали и вертикали. 
		//Если есть три нуля - возвращает истину.
		private bool Check(int x, int y)
		{
			int count = 0;

			for (int i = 0; i < 3; i++)
			{
				if (array[x, i] == 0)
					count++;
				else
					break;
			}

			if (count == 3)
				return true;
			else
			{
				count = 0;
				for (int i = 0; i < 3; i++)
				{
					if (array[i, y] == 0)
						count++;
					else
						break;
				}

				if (count == 3)
					return true;
				else
					return false;
			}
		}
	}
}

using System;

namespace MyGame
{
	static class Player
	{
		public static void Win()
		{
			Console.Clear();
			Console.WriteLine("You win!");
		}
	}
}


using MyGame;
using System;

class Game
{
	static void Main()
	{
		Field field = new Field();

		while (true)
		{
			field.Enter0();
		}
	}
}
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
WNeZRoS
@WNeZRoS
Зачастую дебаггер показывает на следующую строку (инструкцию) после проблемной, как в этом случае.
У вас, чтобы всё работало, x и y должны быть равны числу 0, 1 или 2. А Console.Read читает символ, а не число. Т.е. введя 0, вы получите символ '0', что соответствует числу 48.
Вам нужно обработать ввод, отсечь не правильные символы и преобразовать символы в числа.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Exomode
@Exomode
Архитектор ПО
const int FieldWidth = 3;
    const int FieldHeight = 3;

    int[,] array = new int[FieldWidth, FieldHeight];

    //Ввод нуля и последующая проверка на выигрыш.
    public void Enter0()
    {
      int x, y;

      while (!int.TryParse(Console.Read(), out x) || x < 0 || x >= FieldWidth) continue; // Здесь можно обработать неверный ввод.
      while (!int.TryParse(Console.Read(), out y) || y < 0 || y >= FieldHeight) continue; // Здесь можно обработать неверный ввод.

      array[x, y] = 0;
      draw_array();
      if (Check(x, y))
        Player.Win();
    }


И везде в коде тройки замените на константы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы