Программа неправильно выполняется в консоли linux

Я делаю рогалик, но столкнулся с проблемой, когда я двигаю героя, он иногда перестаёт ходить, причём в коде есть проверка можно ли вставать на следующий блок, я внедрил проверку происходит ли перемещение и выяснил, что иногда он не видит нужных значений, так же я обнаружил что этот баг проявляется лишь в *nix консолях, когда как в cmd например, всё нормально.

Код рогалика:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "coniox/coniox.h"

char field[2048][2048]; 

int main() {
    int steps = 15, feel = 50, range = 5, grade = 3, x = 0, y = 0; // 35
    int userX = 0, userY = 0, in = 0;

    srand(time(NULL));

    clean();
    for (int i = 0; i < steps; i++, feel -= grade, range += grade) {
        for (int j = 0; j < feel; j++) {
            x = rand() % range;
            y = rand() % range;

            if (x < 2048 && y < 2048) {
                field[x][y] = '#';

                setColor(BLACK, GREEN, NORMAL);
                mvCursor(x, y);
                putc('#', stdout);
                setColor(BLACK, WHITE, NORMAL);
            }
        }
    }

    mvCursor(0, 0);
    setColor(BLACK, YELLOW, BRIGHT);
    putc('@', stdout);
    setColor(BLACK, WHITE, NORMAL);

    in = readKb();
    while (in != 'q') {
        switch (in) {
            case 'k':
                if (field[userX][userY-1] == '#') {
                    mvCursor(userX, userY);
                    putc(',', stdout);
                    userY--;
                }
                else puts("error");
            break;

            case 'h':
                if (field[userX-1][userY] == '#') {
                    mvCursor(userX, userY);
                    putc(',', stdout);
                    userX--;
                }
                else puts("error");
            break;

            case 'j':
                if (field[userX][userY+1] == '#') {
                    mvCursor(userX, userY);
                    putc(',', stdout);
                    userY++;
                }
                else puts("error");
            break;

            case 'l':
                if (field[userX+1][userY] == '#') {
                    mvCursor(userX, userY);
                    putc(',', stdout);
                    userX++;
                }
                else puts("error");
            break;
        }
        mvCursor(userX, userY);
        setColor(BLACK, YELLOW, BRIGHT);
        putc('@', stdout);
        setColor(BLACK, WHITE, NORMAL);

        in = readKb();
    }

    clean();
    return 0;
}

В коде используются функции setColor, mvCursor, readKb и clean, все они проверены ошибок нет.


Ответы (0 шт):