Почему функция работает некорректно? C++

Создал функцию простейшей гравитации которая должна двигать персонажа вниз на 1 клетку, по координатам привязанным к массиву, вызываю функцию в вечном цикле затем идёт вызов функции рисования игрового окна и заново, но ничего не происходит, зато при нажатии персонаж уезжает очень далеко.

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

using namespace std;

const int size_x=15;
const int size_y=30;
char world[size_x][size_y];

class Player
{
private:
    int g = 1;
public:
    int jumpforce = 2;
    int point_x;
    int point_y;
    int HP;
    Player()
    {
        point_x = 0;
        point_y = 0;
        HP = 100;
    };
    Player(int x, int y, char skin) 
    {

        this->point_x = x;
        this->point_y = y;
        this->HP = 100;
        for (int i = 0; i < size_x; i++) 
        {
            for (int k = 0; k < size_y; k++) 
            {
                if (i == this->point_x && k == this->point_y) 
                {
                    world[i][k] = skin;
                    break;
                }
            }
        }
    };

    void ChangePositiont(char skin) 
    {
        for (int i = 0; i < size_x; i++)
        {
            for (int k = 0; k < size_y; k++)
            {
                if (i == this->point_x && k == this->point_y)
                {
                    world[i][k] = skin;                  
                }
                if(world[i][k] == skin&&(i!=this->point_x||k!=this->point_y))
                {
                    world[i][k] = '.';
                }
            }
        }
    }
###
    void Gravity() 
    {
        this->point_x=this->point_x + g;
    }
   
###
};

class Enemy :public Player 
{
public:
    Enemy(int x, int y, char skin)
    {

        this->point_x = x;
        this->point_y = y;
        this->HP = 100;
        for (int i = 0; i < size_x; i++)
        {
            for (int k = 0; k < size_y; k++)
            {
                if (i == this->point_x && k == this->point_y)
                {
                    world[i][k] = skin;
                    break;
                }
            }
        }
    };
};

void ArrFill(char a)
{
    for (int i = 0; i < size_x; i++)
    {

        for (int j = 0; j < size_y; j++)
        {
            world[i][j] = a;
        }
    }
};

void ShowScene()
{
    for (int i = 0; i < size_x; i++)
    {
        for (int k=0; k < size_y; k++)
        {
            cout << world[i][k];
        }
        cout << endl;
    }
    
}

void Move(Player &pl) 
{
    if (_kbhit())
    {
        char a = _getche();
        switch (a)
        {
        case 'a':
            pl.point_y = pl.point_y - 1;
            pl.ChangePositiont('$');
            break;
        case 'd':
            pl.point_y = pl.point_y + 1;
            pl.ChangePositiont('$');
            break;
        case 's':
            pl.point_x = pl.point_x + 1;
            pl.ChangePositiont('$');
            break;
        case 'w':
            pl.point_x = pl.point_x - 1;
            pl.ChangePositiont('$');
            break;
        }
    }
}

int main()
{
    setlocale(LC_ALL, "ru");
    ArrFill('.');
    Player player(size_x/2, size_y/2, '$');
    Enemy DrowRanger(5, 5, '%');
    while (1) 
    {
        cout << "Здоровье: " << player.HP << endl;
        player.Gravity();
        ShowScene();
        Move(player);
        system("cls");
    }
    return 0;
}

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

Автор решения: Dafter

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

Путей решения много, например использовать ChangePositiont() в функции Gravity()
Хотя правильнее тогда будет просто каждый кадр вызывать эту функцию (ведь Gravity() в любом случае так будет делать, но при нажатии кнопки движения ChangePositiont() будет вызываться 2 раза за кадр)

→ Ссылка