C++. Можно ли сделать динамический вывод на экран?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Есть двухмерный массив.
Забиваются значения. После по определенному алгоритму значения меняются.

Есть функции:
void display(char array[][COLUMN];
void generate(char array [][COLUMN];

Первая выводит матрицу, вторая меняет значения.

Но выходит, что матрицы выводятся на экран одна за одной и видно остаток предыдущего вывода. Можно ли сделать (возможно иммитировать) смену незаметно, чтобы было ощущение, что данные сменяются динамически?

вывожу данные так:

Код: Выделить всё

const int ROW = 10;
const int COLUMN = 10;

void display(char world[][COLUMN])
{
    int index1, index2;

    for(index1 = 0; index1 < ROW; index1++)
    {
        for(index2 = 0; index2 < COLUMN; index2++)
        {
            cout << world[index1][index2];
        }
        cout << endl;
    }
}
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Это можно сделать двумя способами:
1. В промежутке между выводом первого и второго массивов делать очистку консоли.
2. Позиционировать вывод на консоль, т.е. указывать в какую конкретно позицию консоли выводить каждое значение.
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

У меня выглядит так вся эта история:

Код: Выделить всё

for(; ;)
{
    system("cls");
    display(world);
    generation(world);
}
Но видно, как моргает экран и видно как накладывается новое значение ячейки на старое.
Возник такой вопрос: можно ли как-то сделать паузу в секунду-две перед новой итерацией (перед очисткой экрана ит.д.)? Т.е. отобразилась матрица, следующий шаг это изменение содержимого ячеек, очистка консоли, затем вывод нового наполнения матрицы. Если перед очисткой консоли сделать задержку в 1-2 секунды, тогда наложения ячеек не будут напрягать глаз и исчезнуть мерцания из-за частого стирания консоли.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Для задержки по времени можно использовать функцию Sleep() из Windows API.
Вместо system("cls") лучше использовать функции Windows API, они намного быстрее работают.
Вот как выглядит функция clrscr() для очистки консоли на Windows API


BOOL clrscr()
{
static HANDLE _ConsoleOut = ::GetStdHandle(STD_OUTPUT_HANDLE);
COORD cr = {0, 0}; DWORD dw(0);
CONSOLE_SCREEN_BUFFER_INFO csbi = {0};
::GetConsoleScreenBufferInfo(_ConsoleOut, &csbi);
::SetConsoleCursorPosition(_ConsoleOut, cr);
return ::FillConsoleOutputCharacter(_ConsoleOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, cr, &dw);
}
Аватара пользователя
rrrFer
Сообщения: 237
Зарегистрирован: 07 сен 2008, 14:15
Контактная информация:

Dragon можно вывести матрицу,определить какие элементы надо изменить,использовать задержку, очистить экран, вывести ту же матрицу(но изменяемые элементы выделить цветом), использовать задержку, очистить экран ивывести измененную матрицу.
Вместо задержки можно ожидать нажатия клавиши пользователем - это ИМХО лучше если пользователь должен обязательно успеть разглядеть какие элементы изменяются.
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

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