Отображать строки 2d-массива в обратном порядке

#c# #arrays #for-loop

#c# #массивы #for-цикл

Вопрос:

Я работаю над приложением, которое представляет собой «матрицу бедняка», т. Е. 1 и 0 выпадают на экране.

До сих пор мне удавалось заставить 2d-массив отображать одну строку при 1-м пользовательском вводе, 2 строки при 2-м пользовательском вводе, 3 строки при 3-м пользовательском вводе и т.д.

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

Пример — как это работает до сих пор:

мой 2d-массив:

 1 0 1 0 1 1 1 (1st row)
0 1 0 1 0 1 0 (2nd row)
0 0 1 0 1 0 1 (3rd row)
1 0 0 1 0 1 0 (4th row)
  

первый пользовательский ввод ( Console.ReadKey(); ):

 1 0 1 0 1 1 1 (1st row)
  

2-й пользовательский ввод ( Console.ReadKey(); ):

 1 0 1 0 1 1 1 (1st row)
0 1 0 1 0 1 0 (2nd row)
  

3-й пользовательский ввод:

 1 0 1 0 1 1 1 (1st row)
0 1 0 1 0 1 0 (2nd row)
0 0 1 0 1 0 1 (3rd row)
  

и т.д.

Чего я хотел бы достичь, так это чего-то подобного, но в «обратном» порядке.

Пример — чего я хотел бы достичь:

первый пользовательский ввод:

 1 0 1 0 1 1 1 (1st row)
  

2-й пользовательский ввод:

 0 1 0 1 0 1 0 (2nd row)
1 0 1 0 1 1 1 (1st row)
  

3-й пользовательский ввод:

 0 0 1 0 1 0 1 (3rd row)
0 1 0 1 0 1 0 (2nd row)
1 0 1 0 1 1 1 (1st row)
  

Итак, для подведения итогов я хотел бы изменить свой существующий код, чтобы 1-я строка всегда добавлялась последней. Или, возможно, начать чтение с конца массива — последней строки. Я пробовал это, но постоянно получаю outOfRange ошибку…

Любая помощь была бы приветствована.

Код, который просто добавляет дополнительные строки под существующую:

 public static int row = 0;
static void PrintRelevantLines()
{
    Console.Clear();
    if (rowl <= pnms.GetLength(0) - 1)
    {
        for (int i = 0; i <= row; i  )
        {
            for (int j = 0; j <= pnms.GetLength(1) - 1; j  )
            {
                Console.Write(pnms[i, j]);
            }
            Console.WriteLine();
        }
    }
    row  = 1;
}
  

Редактировать: Запрошенный мной ответ был

 for (int i = row; i >= 0; i--;)
  

который был предоставлен: Пранавом Хосангади

Но я принял ответ от Кая Джарда, поскольку он пошел дальше того, о чем я просил.

Спасибо.

Комментарии:

1. Что вы имеете в виду под «добавить столбцы ниже …» столбцы — это вертикальные объекты. Все, что находится ниже столбца, является .. тем же столбцом

2. Пожалуйста, посмотрите на пример. Я добавил 1-ю, 2-ю, 3-ю и т.д. Для упрощения

3. Просто для справки, кажется, что то, что вы называете столбцом, остальной мир называет строкой. Вы можете продолжать называть это столбцом, если хотите, но это будет источником постоянной путаницы для человека, к которому вы обращаетесь за помощью

4. Что плохого в повторении в обратном порядке? for (int i = rowl; i >= 0; i--) ?

5. @PranavHosangadi Я продолжаю получать outOfRange ошибку. Я попробую еще раз

Ответ №1:

Вот так; это матричный эффект:

             int width = 60; //draw 60 columns
            int height = 20; //draw 20 rows

            var chars = "1234567890-=qwertyuiop[]asdfghjkl;'#zxcvbnm,./!"£$%^amp;*()_ QWERTYUIOP{}ASDFGHJKL:@~ZXCVBNM<>?".ToCharArray(); //create an array of chars to randomly choose and pump onto screen

            var r = new Random(); //make only one Random. Never make a Random in a loop

            while (true) //forever
            {
                int randCol = r.Next(0, width); //pick which column we will draw now

                for (int i = 0; i < height; i  ) {              //for every row from top to bottom
                    Console.SetCursorPosition(randCol, i);      //put the cursor there
                    Console.Write(chars[r.Next(chars.Length)]); //pump a random char
                    Thread.Sleep(200);                          //it's a bit fast otherwise
                }
            }
  

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

Возможно, например, вы можете сохранить свои строки в 2D-буфере, и вы можете выбрать столбец случайным образом (как я сделал), и вы можете отображать его на экране строка за строкой, считывая столбец вниз (или вверх), записывая на экран тот же столбец, который вы выбрали из буфера, затем выберите другой столбец

Возможно, вы можете периодически вставлять строки в буфер (прокручивая через него новые данные).

Возможно также, вы можете сначала записать символ белым цветом, а затем перезаписать его серым непосредственно перед тем, как записать новый символ белым цветом (эффект трудно увидеть, когда экран заполнен)

Затем вы можете одновременно записать несколько символов с разными смещениями..

..затем вы можете предоставить это пользователям на codegolf.se.com и они напишут вам версию, например, в 15 символах 05AB1E или что-то в этом роде

Комментарии:

1. Спасибо. Попробовал, и это выглядит великолепно. Думаю, мне придется снова посмотреть matrix =) Я посмотрю, как это работает. Пока что я поставил вам 1. Я собираюсь дождаться ответа Пранава на вопрос, поскольку его код фактически решил мою проблему. Если он не отправит ответ через день или около того, я собираюсь принять ваш.

2. Я понятия не имею, что должно означать 05ABE

3. Действительно ли это отвечает на вопрос? Поскольку строки печатаются не так, как просил OP — они по-прежнему печатаются сверху вниз, при этом новое число появляется внизу столбца, а не так, как если бы они «падали», где каждое число перемещается вниз по строке по мере заполнения столбца.

4. Отредактировал мой вопрос, чтобы также предоставить ответ на вопрос. Поскольку другого ответа не было, а OP вышел за рамки того, о чем я просил, я принял этот ответ.

5. Хорошо, прошел всего час, но проблем нет. Если это решено, я оставлю это как есть!