-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #61 from Leraniki/main
Игра змейка. Никитина Лера
- Loading branch information
Showing
4 changed files
with
214 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Игра змейка. Управление стрелками. Если врезаться в границы окна или в самого себя, то игра закончится. Максимальное количество съеденной еды = 100. Я использовала библиотеку sdl |