user: Привет, можешь ли ты написать игру на C++ и OpenGL? Предоставь мне инструкцию как скомпилировать это спомощью G++ и напиши мне Makefile для этого

assistant: Ок, напишем с вами простую игру "Змейка" на C++ и OpenGL.

Для начала, удостоверьтесь, что есть необходимое:

```bash
sudo apt-get install make g++ freeglut3-dev
```

Потом создайте файл `main.cpp` со следующим содержимым:
```c++
#include <GL/glut.h>

const int width = 500;
const int height = 500;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    // TODO: Нарисовать змейку и еду

    glutSwapBuffers();
}

void timer(int = 0)
{
    // TODO: Обновить позиции змейки, проверить коллизии с едой и стенками

    glutPostRedisplay();
    glutTimerFunc(100, timer, 0);
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(width, height);
    glutCreateWindow("Snake Game");

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, height, 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);

    glutDisplayFunc(display);
    glutTimerFunc(100, timer, 0);

    glutMainLoop();
    return 0;
}
```

Создайте файл `snake.cpp` и добавьте туда:
```c++
#include <vector>
#include <utility>

enum Direction { UP, DOWN, LEFT, RIGHT };

class Snake
{
public:
    Snake(int x, int y, int len) : direction(RIGHT)
    {
        for (int i = 0; i < len; ++i)
            body.push_back(std::make_pair(x - i, y));
    }

    void move()
    {
        int x = body.front().first;
        int y = body.front().second;
        switch (direction)
        {
        case UP:
            body.insert(body.begin(), std::make_pair(x, y - 1));
            break;
        case DOWN:
            body.insert(body.begin(), std::make_pair(x, y + 1));
            break;
        case LEFT:
            body.insert(body.begin(), std::make_pair(x - 1, y));
            break;
        case RIGHT:
            body.insert(body.begin(), std::make_pair(x + 1, y));
            break;
        }
        body.pop_back();
    }

    void set_direction(Direction dir) { direction = dir; }

    std::vector<std::pair<int, int>> body;

private:
    Direction direction;
};

class Food
{
public:
    Food(int x, int y) : x(x), y(y) {}

    int x, y;
};
```

И файл `game.cpp`, в котором будет следующее:
```c++
#include "snake.cpp"
#include <stdlib.h>

Snake snake(width / 2, height / 2, 5);
Food food(rand() % (width - 10) + 5, rand() % (height - 10) + 5);

void draw_snake()
{
    glColor3f(1, 1, 1);
    for (auto& segment : snake.body)
    {
        glRecti(segment.first * 10, segment.second * 10,
                (segment.first + 1) * 10, (segment.second + 1) * 10);
    }
}

void draw_food()
{
    glColor3f(1, 0, 0);
    glRecti(food.x, food.y, food.x + 10, food.y + 10);
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    draw_snake();
    draw_food();

    glutSwapBuffers();
}

void timer(int = 0)
{
    snake.move();

    // Проверить коллизии со стенами
    if (snake.body.front().first < 0 || snake.body.front().first >= width / 10 ||
        snake.body.front().second < 0 || snake.body.front().second >= height / 10)
    {
        exit(0);
    }

    // Проверить коллизии с едой
    if (snake.body.front().first == food.x / 10 && snake.body.front().second == food.y / 10)
    {
        food.x = rand() % (width - 10) + 5;
        food.y = rand() % (height - 10) + 5;
        snake.body.push_back(snake.body.back());
    }

    glutPostRedisplay();
    glutTimerFunc(100, timer, 0);
}

void keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {
    case 'w':
        if (snake.body.size() == 1 || snake.body[1].second != snake.body[0].second)
            snake.set_direction(UP);
        break;
    case 's':
        if (snake.body.size() == 1 || snake.body[1].second != snake.body[0].second)
            snake.set_direction(DOWN);
        break;
    case 'a':
        if (snake.body.size() == 1 || snake.body[1].first != snake.body[0].first)
            snake.set_direction(LEFT);
        break;
    case 'd':
        if (snake.body.size() == 1 || snake.body[1].first != snake.body[0].first)
            snake.set_direction(RIGHT);
        break;
    }
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(width, height);
    glutCreateWindow("Snake Game");

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, height, 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);

    glutDisplayFunc(display);
    glutTimerFunc(100, timer, 0);
    glutKeyboardFunc(keyboard);

    glutMainLoop();
    return 0;
}
```

В конце, создайте файл `Makefile` и добавьте туда:
```makefile
CC = g++
CXXFLAGS = -Wall
LDFLAGS = -lGL -lGLU -lglut

SRCS = main.cpp game.cpp snake.cpp
OBJS = $(SRCS:.cpp=.o)

all: snake

snake: $(OBJS)
	$(CC) $(LDFLAGS) $^ -o $@

%.o: %.cpp
	$(CC) $(CXXFLAGS) -c $< -o $@

clean:
	rm -f $(OBJS) snake
```

После чего, скомпилируйте с помощью команды
```bash
make
```

Это только начало, и придётся проект доработать до конца. Конечно же, я смогу вам помочь с этим.