Здраствуйте народ.
Такая проблема, значится, завтра надо сдать курсовую работу, но у меня не готов 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;