Проблемы с тетрисом на c++ с применением библиотеки SFML

Я жесткий лейм в программировании, но судьба заставила быстро "изобрести" тетрис на c++. Именно поэтому я нашёл первый попавшийся гайд на ютубе, где тетрис выглядел весьма солидно. Однако, по непонятным мне причинам код попросту выдает ошибку, хотя сделано всё так же, как и в ролике. Код следующий:

#include <SFML/Graphics.hpp>
#include <time.h>

using namespace sf;

const int M = 20;// высота игрового поля
const int N = 10;// ширина игрового поля

int field[M][N] = { 0 };// игровое поле
int w = 34;

struct Point
{
    int x, y;
}a[4], b[4];

// Массив фигурок-тетрамино
int figures[7][4] = {
    1,3,5,7, // I
    2,4,5,7, // S
    3,5,4,6, // Z
    3,5,4,7, // T
    2,3,5,7, // L
    3,5,7,6, // J
    2,3,4,5, // O
};

// Проверка на выход за границы игрового поля
bool check() {
    for (int i = 0; i < 4; i++)
        if (a[i].x < 0 || a[i].x >= N || a[i].y >= M)
            return 0;
        else if (field[a[i].y][a[i].x])
            return 0;

    return 1;
}

int main()
{
    srand(time(0));

    RenderWindow window(VideoMode(N * w, M * w), "Tetris!");

    // Создание и загрузка текстуры
    Texture t;
    t.loadFromFile("C:/Users/Андрей/Desktop/Paint/tiles.png");
    // Создание спрайта
    Sprite tiles(t);

    // Переменные для горизонтального перемещения и вращения
    int dx = 0;// Переменная для горизонтального перемещения тетрамино
    int colorNum = 1;
    bool rotate = false;// переменная для вращения тетрамино
    // Переменные для таймера и задержки
    float timer = 0, delay = 0.3;
    // Часы (таймер)
    Clock clock;
    bool ad = true;

    // Главный цикл приложения: выполняется, пока открыто окно
    while (window.isOpen())
    {
        // Получаем время, прошедшее с начала отсчета, и конвертируем его в секунды
        float time = clock.getElapsedTime().asSeconds();
        clock.restart();
        timer += time;

        // Обрабатываем события в цикле
        Event event;
        while (window.pollEvent(event))
        {
            // Пользователь нажал на «крестик» и хочет закрыть окно?
            if (event.type == Event::Closed)
                // тогда закрываем его
                window.close();

            // Была ли нажата клавиша на клавиатуре?
            if (event.type == Event::KeyPressed)
                // Эта кнопка – стрелка вверх?
                if (event.key.code == Keyboard::Up)
                    rotate = true;
                // Или стрелка вправо?
                else if (event.key.code == Keyboard::Right)
                    dx = 1;
                // Или может стрелка влево?
                else if (event.key.code == Keyboard::Left)
                    dx = -1;
        }


        if (Keyboard::isKeyPressed(Keyboard::Down))
            delay = 0.05;

        // Горизонтальное перемещение
        for (int i = 0; i < 4; i++) {
            b[i] = a[i];
            a[i].x += dx;
        }

        // Если вышли за пределы поля после перемещения, то возвращаем старые координаты 
        if (!check()) {
            for (int i = 0; i < 4; i++)
                a[i] = b[i];
        }

        // Вращение
        if (rotate) {
            Point p = a[1];// указываем центр вращения
            for (int i = 0; i < 4; i++) {
                int x = a[i].y - p.y;// y - y0
                int y = a[i].x - p.x;// x - x0

                a[i].x = p.x - x;
                a[i].y = p.y + y;
            }

            // Если вышли за пределы поля после поворота, то возвращаем старые координаты 
            if (!check()) {
                for (int i = 0; i < 4; i++)
                    a[i] = b[i];
            }
        }

        // Движение тетрамино вниз («тик» таймера)
        if (timer > delay) {
            // Горизонтальное перемещение
            for (int i = 0; i < 4; i++) {
                b[i] = a[i];
                a[i].y += 1;
            }

            // Если вышли за пределы поля после перемещения, то возвращаем старые координаты
            if (!check()) {
                for (int i = 0; i < 4; i++)
                    field[b[i].y][b[i].x] = colorNum;
                colorNum = 1 + rand() % 7;
                int n = rand() % 7;// задаем тип тетрамино
                // Первое появление тетрамино на поле?
                for (int i = 0; i < 4; i++) {
                    a[i].x = figures[n][i] % 2;
                    a[i].y = figures[n][i] / 2;
                }
            }

            timer = 0;
        }

        // Первое появление тетрамино на поле?
        if (ad) {
            int n = rand() % 7;// указываем тип тетрамино
            // Первое появление тетрамино на поле?
            if (a[0].x == 0)
                for (int i = 0; i < 4; i++) {
                    a[i].x = figures[n][i] % 2;
                    a[i].y = figures[n][i] / 2;
                }
            ad = false;
        }

        int k = M - 1;
        for (int i = M - 1; i > 0; i--) {
            int count = 0;
            for (int j = 0; j < N; j++) {
                if (field[i][j])
                    count++;
                field[k][j] = field[i][j];
            }
            if (count < N)
                k--;
        }

        dx = 0; // горизонтальное перемещение
        rotate = false;// вращение
        delay = 0.3;// цвет

        // Отрисовка окна
        window.clear(Color::White);

        for (int i = 0; i < M; i++)
            for (int j = 0; j < N; j++) {
                if (field[i][j] == 0)
                    continue;
                tiles.setTextureRect(IntRect(field[i][j] * w, 0, w, w));
                tiles.setPosition(j * w, i * w);
                window.draw(tiles);
            }

        for (int i = 0; i < 4; i++) {
            tiles.setTextureRect(IntRect(colorNum * w, 0, w, w));
            // Устанавливаем позицию каждого кусочка тетрамино
            tiles.setPosition(a[i].x * w, a[i].y * w);
            // Отрисовка спрайта
            window.draw(tiles);
        }

        // Отрисовка окна
        window.display();
    }

    return 0;
}

На скрине показываю ситуацию с Visual Studio: в коде ошибки не подсвечивается (скрин 3), но выводится следующее: при попытке запустить (скрин 4), выдаёт скрин 2 и ошибки на скрине 5.


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