Змейка C++ SDL2. не могу разобрать код, помогите. завтра сдача)

Здраствуйте народ.
Такая проблема, значится, завтра надо сдать курсовую работу, но у меня не готов 3 раздел, где надо описать код игры, а проблема в том, что я его не полностью понимаю. Поэтому я прошу вас помочь его разобрать, желательно очень подробно и в ближайшие пару часов, извините за мою дерзость, думал смогу за одну ончь сделать, но как только начал понял что не справлюсь. Использовал библиотеку SDL2. Думаю стоит упоминуть сразу, код я взял с интернета.
Надеюсь на вашу помощь.

вот собственно и сам код:

#include <SDL.h>
#include <iostream>
#include <vector>



using namespace std;

const int SQUARE_LENGTH = 20;   // размер ячейки
const int SW = 800;             // размеры окна
const int SH = 800;

SDL_Window* window = NULL;
SDL_Renderer* render = NULL;
SDL_Texture* background = NULL;
SDL_Texture* snake = NULL;
SDL_Texture* fruit = NULL;



bool quit = false;
int snake_x;   // координаты змейки
int snake_y;
int fruit_x;   // координаты фруктов
int fruit_y;
int snake_length = 2;  // длина змейки
int s = 175;


enum Direction {   // направление змейки
    LEFT,
    RIGHT,
    UP,
    DOWN
}; Direction dir;



struct Pos {
    int x;
    int y;
};

vector<Pos> snake_body;

bool init()
{
    bool success = true;

    if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
    {
        success = false;
    }

    window = SDL_CreateWindow("Snake game", 250, 75, SW, SH, SDL_WINDOW_ALLOW_HIGHDPI);
    if (window == NULL) { success = false; }

    render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (render == NULL) { return false; }

    
    SDL_Surface* temp_serf = NULL;
    temp_serf = SDL_LoadBMP("C:/Users/abaka/source/repos/1.1/marimo.bmp");
    background = SDL_CreateTextureFromSurface(render, temp_serf);
    if (!background) { return false; }

    SDL_Surface* atemp_serf = NULL;
    atemp_serf = SDL_LoadBMP("C:/Users/abaka/source/repos/1.1/snake.bmp");
    snake = SDL_CreateTextureFromSurface(render, atemp_serf);

    if (!snake) { return false; }

    SDL_Surface* stemp_serf = NULL;
    stemp_serf = SDL_LoadBMP("C:/Users/abaka/source/repos/1.1/apple.bmp");
    fruit = SDL_CreateTextureFromSurface(render, stemp_serf);;
    if (!fruit) { return false; }

    //Замените расположение изображений для текстур, подстать вашему компьютеру


    return success;
}




void close()
{
    SDL_DestroyTexture(background);
    SDL_DestroyTexture(snake);
    SDL_DestroyTexture(fruit);
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);
    background = NULL;
    snake = NULL;
    fruit = NULL;
    render = NULL;
    window = NULL;

    SDL_Quit();
}

void generate_fruit()
{
    srand(static_cast<unsigned int>(time(0)));

    int slots_x = SW / SQUARE_LENGTH;
    int slots_y = SH / SQUARE_LENGTH;

    fruit_x = (rand() % slots_x) * SQUARE_LENGTH;
    fruit_y = (rand() % slots_y) * SQUARE_LENGTH;
}



void check_collisions() {

    if (snake_x > SW) { snake_x = 0; }
    if (snake_y > SH) { snake_y = 0; }
    if (snake_x < 0) { snake_x = SW; }
    if (snake_y < 0) { snake_y = SH; }

    // если попался фрукт съедаем
    if (snake_x == fruit_x && snake_y == fruit_y) {
        snake_length++;
        s = s * 0.99;
        generate_fruit();
    }

    // если змейка попала в себя, игра заканчивается
    for (int i = 0; i < snake_body.size() - 1; ++i)
    {
        if (snake_x == snake_body[i].x && snake_y == snake_body[i].y)
        {
            quit = true;
        }
    }
}

void draw() {


    SDL_RenderCopy(render, background, NULL, NULL);
    // рисуем фрукт
    SDL_Rect fruit_r = { fruit_x, fruit_y,20,20 };
    SDL_RenderCopy(render, fruit, NULL, &fruit_r);



    if (dir == UP)
    {
        snake_y -= SQUARE_LENGTH;
    }
    else if (dir == DOWN)
    {
        snake_y += SQUARE_LENGTH;
    }
    else if (dir == LEFT)
    {
        snake_x -= SQUARE_LENGTH;
    }
    else if (dir == RIGHT)
    {
        snake_x += SQUARE_LENGTH;
    }


    Pos new_pos;
    new_pos.x = snake_x;
    new_pos.y = snake_y;
    snake_body.push_back({ snake_x, snake_y });


    for (int i = 0; i < snake_body.size(); i++)
    {
        SDL_Rect snake_r = { snake_body[i].x, snake_body[i].y,20 - 1,20 - 1 };
        SDL_RenderCopy(render, snake, NULL, &snake_r);
    }

    if (snake_body.size() >= snake_length) // если размер змейки больше или равен изначальной длине
    {
        snake_body.erase(snake_body.begin());
    }
}
void input() {

    const Uint8* key = SDL_GetKeyboardState(NULL);     // дает нам массив с состоянием клавиш

    if (key[SDL_SCANCODE_UP] && dir != DOWN) {
        dir = UP;
    }
    if (key[SDL_SCANCODE_DOWN] && dir != UP) {
        dir = DOWN;
    }
    if (key[SDL_SCANCODE_LEFT] && dir != RIGHT) {
        dir = LEFT;
    }
    if (key[SDL_SCANCODE_RIGHT] && dir != LEFT) {
        dir = RIGHT;
    }

}

int main(int argc, char* args[])
{
    if (!init()) {
        cout << "Failed to initialize SDL" << endl;
    }

    generate_fruit();

    SDL_Event e;
    while (!quit)
    {
        while (SDL_PollEvent(&e)!=0) {

            if (e.type == SDL_QUIT)
            {
                quit=true;
            }

            input();
        }

        //Clear screen
        SDL_RenderClear(render);
        draw();
        check_collisions();
        //Update screen
        SDL_RenderPresent(render);
        SDL_Delay(s);
    }


    close();

    return 0;

Так а помочь-то как, что именно непонятно?

Ну, буду честен, очень многое. допустим рендер. у меня одногруппник тоже делал с SDL2, я думал у него возьму, но у него он по другому реализован, никак у меня.

так ещё не понимаю вот эти строки

Извините если отвлекаю, но мне стоит рассчитывать на вашу помощь?

Что именно?

В этой функции перерисовка всего поля.
В этих строках новая текущая позиция добавляется в массив квадратов змейки, и в цикле они рисуются.

Не понял зачем

перед удалением хвоста змейки, по идее это всегда должно происходить. Может быть это для обработки роста когда съели фрукт.
То есть тогда будет

и хвост один раз не удалится.

В целом код так себе, смешана логика игры и рендер :laughing:

И еще автор не знает про относительные пути или получение пути папки программы :facepalm:

чтож, и на этом спасибо)

Кстати да. Если юзер будет не abaka или программа в другой папке, получится Error ))