программа на c , текст постоянно дрожит в cmd

#c #cmd

#c #cmd

Вопрос:

Предполагается, что в этой программе есть карта, состоящая из точек, и игрок, которого вы можете перемещать.

Но когда я однажды открыл эту программу, текст мерцал и двигался вверх и вниз.

Он использует Windows.h для перерисовки на консоли без мерцания и для скрытия курсора

Нужно ли что-то делать со свойствами cmd, кодом или заголовочным файлом Windows.h?

 
#include <iostream>
#include <conio.h>
#include <Windows.h>

char map[1000][1000];
int width = 100;
int height = 10;
char Tmt = '.';

void cls()
{
    COORD cursorPosition;
    cursorPosition.X = 0;
    cursorPosition.Y = 0;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPosition);
}

void hidcur()
{
    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO info;
    info.dwSize = 100;
    info.bVisible = FALSE;
    SetConsoleCursorInfo(consoleHandle, amp;info);
}

class Player {
public:

    int x;
    int y;
    char sym;

    void Draw()
    {
        map[x][y] = sym;
    }

    void Logic()
    {
        if (x < 1) { x  ; }
        if (y < 1) { y  ; }
        if (x > width) { x--; }
        if (y > height) { y--; }
    }

    void Input()
    {
        if (_kbhit())
        {
            switch (_getch())
            {
            case 'w':
                map[x][y] = Tmt;
                y--;
                break;
            case 'a':
                map[x][y] = Tmt;
                x--;
                break;
            case 's':
                map[x][y] = Tmt;
                y  ;
                break;
            case 'd':
                map[x][y] = Tmt;
                x  ;
                break;
            case 'p':
                system("cls");
                break;
            }
        }
    }

    void PrintPos()
    {
        printf("Pos:n");
        if (x >= 10) { printf("    %dn", x); }
        else { printf("    0%dn", x); }
        if (y >= 10) { printf("    %dn", y); }
        else { printf("    0%dn", y); }
    }
};

Player player1;

void Setup()
{
    player1.x = 2;
    player1.y = 2;
    player1.sym = '@';
    player1.Draw();
    player1.Logic();

    for (int mapsui = 1; mapsui <= width; mapsui  )
    {
        for (int mapsuj = 1; mapsuj <= height; mapsuj  )
        {
            map[mapsui][mapsuj] = Tmt;
        }
    }
}

void DrawMap()
{
    player1.PrintPos();
    printf("nnn");
    for (int drawi = 1; drawi <= width; drawi  )
    {
        for (int drawj = 1; drawj <= height; drawj  )
        {
            printf("%c", map[drawj][drawi]);
        }
        printf("n");
    }
}

int main()
{
    Setup();

    while (1)
    {
        DrawMap();
        player1.Input();
        player1.Logic();
        player1.Draw();

        cls();
        hidcur();
    }

    return 0;
}

 

Ответ №1:

В методе DrawMap, когда у вас есть два цикла for , вы проверяете ширину во внешнем цикле и высоту во внутреннем цикле, в то время как должно быть наоборот. Обратите внимание, что внешний цикл контролирует количество строк, и поскольку вы ограничиваете его шириной (100), вы отображаете 100 строк, большинство из которых пустые, потому что программа установки просто инициализирует 10 строк. Поскольку в окне командной строки отображается меньше строк (я думаю, что по умолчанию это около 30 или что-то в этом роде), карта увеличивается, и это приводит к мерцанию, которое вы видите. Это должно быть:

 for (int drawi = 1; drawi <= height; drawi  )
{
    for (int drawj = 1; drawj <= width; drawj  )
    {
        printf("%c", map[drawj][drawi]);
    }
    printf("n");
}
 

Обратите внимание, что при настройке вы также используете циклы таким образом (внешний цикл проверяет ширину, а внутренний цикл проверяет высоту), но в этом случае вы позже используете индексы для карты наоборот (сначала i, а затем j), что приводит к правильной инициализации карты (10 строк по 100 столбцов).