Skip to content

Commit

Permalink
Merge pull request #61 from Leraniki/main
Browse files Browse the repository at this point in the history
Игра змейка. Никитина Лера
  • Loading branch information
lordoz234 authored Dec 14, 2023
2 parents c7483bc + a6a8902 commit 62984b1
Show file tree
Hide file tree
Showing 4 changed files with 214 additions and 0 deletions.
213 changes: 213 additions & 0 deletions task5/Nikitina/Nikitina.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
#include <SDL.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>


#define MAX_LEN 100 //ìàêñèìàëüíàÿ äëèíà çìåè
#define SCREEN_HEIGHT 480
#define SCREEN_WIDTH 640
#define CELL_SIZE 20 //ðàçìåð ñåãìåíòà çìåè
#define FOOD_SIZE 20
#define MAX_LEN 100

//ñòðóêòóðà êîîðäèíàò
struct coord {
int x;
int y;
};
// ñòðóêòóðà çìåè
struct Snake {
struct coord body[MAX_LEN]; // ìàññèâ ñ êîîðäèíàòàìè òåëà çìåè
int length; // äëèíà çìåè
int move; // íàïðàâëåíèå çìåè
};

//ñòðóêòóðà åäû
struct Food {
struct coord pos; // êîîðäèíàòû åäû
};

//èíèöèàëèçàöèÿ íà÷àëüíîãî ïîëîæåíèÿ çìåè
void init_snake(struct Snake* snake) {
//íà÷àëüíàÿ äëèíà è äâèæåíèå âïðàâî ïðè ñòàðòå
snake->length = 1;
snake->move = 1;

//óñòàíîâêà íà÷àëüíîãî ïîëîæåíèÿ çìåè
snake->body[0].x = SCREEN_WIDTH / 2;
snake->body[0].y = SCREEN_HEIGHT / 2;

}


//èíèöèàëèçàöèÿ íà÷àëüíîãî ïîëîæåíèÿ åäû
void init_food(struct Food* food) {
food->pos.x = rand() % (SCREEN_WIDTH / FOOD_SIZE) * FOOD_SIZE;
food->pos.y = rand() % (SCREEN_HEIGHT / FOOD_SIZE) * FOOD_SIZE;
}

//îáðàáîòêà êëàâèø,êîòðûå íàæèìàåò ïîëüçîâàòåëü
void moving(struct Snake* snake) {
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
exit(0); // Âûõîä èç ïðîãðàììû ïðè çàêðûòèè îêíà
break;
case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_UP:
if (snake->move != 2) {
snake->move = 0;
}
break;
case SDLK_RIGHT:
if (snake->move != 3) {
snake->move = 1;
}
break;
case SDLK_DOWN:
if (snake->move != 0) {
snake->move = 2;
}
break;
case SDLK_LEFT:
if (snake->move != 1) {
snake->move = 3;
}
break;
}
break;
}
}
}
//îáíîâëåíèå ïîëîæåíèÿ çìåè
void upd_snake(struct Snake* snake, struct Food* food) {
struct coord prevHead = snake->body[0];
struct coord newHead = prevHead;

// Îáíîâëåíèå ïîëîæåíèÿ ãîëîâû çìåè
switch (snake->move) {
case 0:
newHead.y -= CELL_SIZE;
break;
case 1:
newHead.x += CELL_SIZE;
break;
case 2:
newHead.y += CELL_SIZE;
break;
case 3:
newHead.x -= CELL_SIZE;
break;
}

// Ïåðåìåùåíèå òåëà çìåè
for (int i = snake->length - 1; i > 0; i--) {
snake->body[i] = snake->body[i - 1];
}

// Óñòàíîâêà íîâîé ãîëîâû
snake->body[0] = newHead;

// Ïðîâåðêà ñòîëêíîâåíèÿ ñ ãðàíèöàìè ýêðàíà
if (newHead.x < 0 || newHead.x >= SCREEN_WIDTH || newHead.y < 0 || newHead.y >= SCREEN_HEIGHT) {
exit(0); // Çàâåðøåíèå ïðîãðàììû ïðè ñòîëêíîâåíèè ñ ãðàíèöàìè
}

// Ïðîâåðêà ñòîëêíîâåíèÿ ñ ñàìîé ñîáîé
for (int i = 1; i < snake->length; i++) {
if (newHead.x == snake->body[i].x && newHead.y == snake->body[i].y) {
exit(0); // Çàâåðøåíèå ïðîãðàììû ïðè ñòîëêíîâåíèè ñ ñàìîé ñîáîé
}
}

// Ïðîâåðêà ïîåäàíèÿ åäû
if (newHead.x == food->pos.x && newHead.y == food->pos.y) {
snake->length++;
init_food(food);
}


}

//îòîáðàæåíèå çìåè
void create_snake(SDL_Renderer* renderer, struct Snake* snake) {
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
for (int i = 0; i < snake->length; i++) {
SDL_Rect rect = { snake->body[i].x, snake->body[i].y, CELL_SIZE, CELL_SIZE };
SDL_RenderFillRect(renderer, &rect);
}
}

//îòîáðàæåíèå åäû
void create_food(SDL_Renderer* renderer, struct Food* food) {
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_Rect rect = { food->pos.x, food->pos.y, FOOD_SIZE, FOOD_SIZE };
SDL_RenderFillRect(renderer, &rect);
}

//îòîáðàæåíèå èãðîâîãî ïîëÿ
void create_window(SDL_Renderer* renderer, struct Snake* snake, struct Food* food) {
SDL_SetRenderDrawColor(renderer, 255, 255, 153, 255);
SDL_RenderClear(renderer);

create_snake(renderer, snake);
create_food(renderer, food);

SDL_RenderPresent(renderer);
}

int main() {
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "SDL_Init failed:%s\n", SDL_GetError());
return -1;
}
//ñîçäàíèå îêíà
SDL_Window* window = SDL_CreateWindow("Snake", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (!window) {
fprintf(stderr, "Window creation failed:%s\n", SDL_GetError());
return -1;
}

//Ñîçäàíèå ðåíäåðåðà
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (!renderer) {
fprintf(stderr, "Renderer failed:%s\n", SDL_GetError());
return -1;
}

//Èíèöèàëèçàöè çìåè è åäû
struct Snake snake;
struct Food food;
init_snake(&snake);
init_food(&food);

//èíèöèàëèçàöèÿ ãåíåðàòîðà ðàíäîìíûõ ÷èñåë
srand(time(NULL));
//èãðîâîé öèêë
while (1) {
//îáðàáîòêà ââîäà ïîëüçîâàòåëÿ
moving(&snake);

//îáíîâëåíèå ïîëîæåíèÿ çìåè
upd_snake(&snake, &food);

//îòîáðàæåíèå èãðîâîãî ïîëÿ
create_window(renderer, &snake, &food);


SDL_Delay(300);


}
//îñâîáîæäåíèå ïàìÿòè
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;


}
Binary file added task5/Nikitina/Nikitina_snake.exe
Binary file not shown.
Binary file added task5/Nikitina/SDL2.dll
Binary file not shown.
1 change: 1 addition & 0 deletions task5/Nikitina/snake.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Игра змейка. Управление стрелками. Если врезаться в границы окна или в самого себя, то игра закончится. Максимальное количество съеденной еды = 100. Я использовала библиотеку sdl

0 comments on commit 62984b1

Please sign in to comment.