Как заполнить массив, учитывая значение другой переменной?

Есть массив состоящий из 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 шт):

Автор решения: Serge-V

Для начала позволю себе немножко рефакторинга.

Метод 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++)

вообще работать не будет.

→ Ссылка