Как заполнить массив, учитывая значение другой переменной?
Есть массив состоящий из 25 переменных типа int. Нужно заполнить его таким образом, чтобы первые N (N = numberMines) элементов массива равнялись 0, а остальные 1. Далее нужно просто перемешать массив.
public int numberMines = 3;
public int[] mines;
public int i = 0;
public void ArrayMines()
{
for (i=0;i <= numberMines;i++)
{
mines[i] = 0;
}
for (i=0; numberMines < i <= mines.Length; i++)
{
mines[i] = 1;
}
Начало моего кода, который я собирал из нескольких документаций. Я уверен, что тут далеко не одна ошибка, буду рад, если кто-нибудь поможет готовым кодом с объяснением.
Ответы (1 шт):
Для начала позволю себе немножко рефакторинга.
Метод ArrayMines переименуем в GetRandomMinesArray, т.к. название метода нужно начинать с глагола.
numberMines переименуем в _numberMines. Нижнее подчеркивание будет означать, что это поле будет видимым во всем классе. Поля без подчеркивания могут использоваться внутри методов, соответственно, такое поле будет видимым в пределах метода.
mines переименуем в _minesArray. Это дело вкуса, но мне так удобнее, когда по имени переменной сразу понятно, что это массив, и какой именно массив.
public int i = 0; вообще уберем. Поле i нам не нужно с видимостью по всему классу.
Далее. Поля внутри класса не должны быть public. Это нарушение инкапсуляции. Делаем поля private. Если вдруг нужно дать доступ к полям извне, используйте геттеры и сеттеры.
Теперь код (самое интересное) =)
В одном цикле перебираем все элементы и если индекс меньше _numberMines, то записываем в этот элемент массива 0, иначе записываем 1.
for (int i = 0; i < _minesArray.Length; i++)
{
if (i < _numberMines)
{
_minesArray[i] = 0;
}
else
{
_minesArray[i] = 1;
}
}
На выходе получим нужный нам массив, но без рандомного заполнения. Осталось рандомизировать.
Для этого воспользуемся этим примером. Алгоритм давно изобретен, в интернете встречается часто.
for (int i = _minesArray.Length - 1; i >= 1; i--)
{
int j = random.Next(i + 1);
var temp = _minesArray[j];
_minesArray[j] = _minesArray[i];
_minesArray[i] = temp;
}
Здесь random - это экземпляр класса Random
Всё! Остается только вернуть результат
return _minesArray
Весь класс выглядит так:
public class MinesCreator
{
private int _numberMines = 3;
private int[] _minesArray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
public int[] GetRandomMinesArray()
{
Random random = new Random();
for (int i = 0; i < _minesArray.Length; i++)
{
if (i < _numberMines)
{
_minesArray[i] = 0;
}
else
{
_minesArray[i] = 1;
}
}
for (int i = _minesArray.Length - 1; i >= 1; i--)
{
int j = random.Next(i + 1);
var temp = _minesArray[j];
_minesArray[j] = _minesArray[i];
_minesArray[i] = temp;
}
return _minesArray;
}
}
Массив здесь проинициализирован цифрами для того, чтобы убедиться, что всё работает как надо. Но инициализировать не обязательно. Массив у меня получился из 10 элементов, Вы просили 25. Но набирать 25 чисел я поленился. Думаю, Вы сами без проблем сможете добавить нужное количество элементов
Проверял в консольном приложении. Для проверки в классе Programm пишем что-то типа вот этого:
MinesCreator mines = new MinesCreator();
int[] result = mines.GetRandomMinesArray();
foreach (var item in result)
{
Console.WriteLine(item);
}
P.S. Кстати, Ваш вот этот код
for (i=0; numberMines < i <= mines.Length; i++)
вообще работать не будет.