From 8e44e30c67b31c0062a087942d8bce01dfb1d594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B0=D1=88=D0=B0?= Date: Fri, 2 May 2025 19:50:28 +0200 Subject: [PATCH] refresh --- a4/game.c | 57 ++++++++++++++------------- a4/main.c | 15 +------ a4/world.h | 113 +++++++++-------------------------------------------- 3 files changed, 49 insertions(+), 136 deletions(-) diff --git a/a4/game.c b/a4/game.c index 6a44f08..be6a505 100644 --- a/a4/game.c +++ b/a4/game.c @@ -1,45 +1,46 @@ #include "game.h" #include "world.h" #include -#include "world.h" #include #include + void* init_game(void) { - struct game* state = (struct game*)calloc(1, sizeof(struct game)); - if (!state) { - return NULL; - } - state->cat_x = 5; - state->cat_y = 5; - state->cat_dx = 1; - state->cat_dy = 1; - state->mouse_x = 15; - state->mouse_y = 10; - snprintf(state->message, sizeof(state->message), "Давай, попробуй поймать меня!"); - return state; + struct game* obj = calloc(1, sizeof(struct game)); + if (!obj) return NULL; + + obj->cat_x = 5; + obj->cat_y = 3; + obj->mouse_x = 20; + obj->mouse_y = 10; + obj->cat_dx = 1; + obj->cat_dy = 1; + snprintf(obj->message, sizeof(obj->message), "Лови меня, если сможешь!"); + + return obj; } -int game_event(struct event* event, void* g_state) { - struct game* game = (struct game*)g_state; - if (!game) return 0; +int game_event(struct event* e, void* data) { + struct game* g = (struct game*)data; - if (event->type == KEY_SREDO) { - switch (event->key) { - case KEY_UP: game->cat_y -= game->cat_dy; break; - case KEY_DOWN: game->cat_y += game->cat_dy; break; - case KEY_LEFT: game->cat_x -= game->cat_dx; break; - case KEY_RIGHT: game->cat_x += game->cat_dx; break; - default: break; - } + if (e->type == EVENT_KEY) { + if (e->key == KEY_UP) g->cat_y--; + if (e->key == KEY_DOWN) g->cat_y++; + if (e->key == KEY_LEFT) g->cat_x--; + if (e->key == KEY_RIGHT) g->cat_x++; } - game->mouse_x += (rand() % 3) - 1; - game->mouse_y += (rand() % 3) - 1; + g->mouse_x += (rand() % 3) - 1; + g->mouse_y += (rand() % 3) - 1; - if (game->cat_x == game->mouse_x && game->cat_y == game->mouse_y) { - snprintf(game->message, sizeof(game->message), "Мышь поймана! Ура!"); + if (g->cat_x == g->mouse_x && g->cat_y == g->mouse_y) { + snprintf(g->message, sizeof(g->message), "Поймал! Финита."); } + clear_screen(); + set_cell('C', g->cat_x, g->cat_y); + set_cell('M', g->mouse_x, g->mouse_y); + set_message(g->message, 2, 0); + return 0; } diff --git a/a4/main.c b/a4/main.c index 4eb0b50..2e2f37f 100644 --- a/a4/main.c +++ b/a4/main.c @@ -1,19 +1,8 @@ #include "game.h" #include "world.h" #include -#include "world.h" #include + int main(void) { - void* game_state = init_game(); - if (!game_state) { - fprintf(stderr, "Не удалось инициализировать игру!\n"); - return 1; - } - - world_run(game_state, game_event); - - free(game_state); - - return 0; + return start_world(init_game, game_event, free); } - diff --git a/a4/world.h b/a4/world.h index 73be057..caea6f7 100644 --- a/a4/world.h +++ b/a4/world.h @@ -1,113 +1,36 @@ #ifndef _WORLD_H_ #define _WORLD_H_ -#include - -/** - * World represented as a rectangular matrix of colorful characters. - * - * Point [0,0] is displayed the upper left corner of the screen. - * - */ - -enum event_type { - EVENT_START, - EVENT_TIMEOUT, - EVENT_KEY, - EVENT_MOUSE, - EVENT_RESIZE, - EVENT_ESC, - EVENT_END, -}; - struct event { - /** - * Last width of the screen. - */ - int width; - /** - * Last height of the screen. - */ - int height; - /** - * Last pressed key or Curses event. - * - * Special event values: - * ERR if timeout, - * KEY_RESIZE if screen resize - * KEY_EVENT, other event, - * KEY_MOUSE, mouse clicked - * - * Key values: - * - * ' ' Space - * KEY_DOWN Arrow down - * KEY_UP Arrow up - * KEY_LEFT Arrow left - * KEY_RIGHT Arrow right - * KEY_A1 Upper left of keypad - * KEY_A3 Upper right of keypad - * KEY_B2 Center of keypad - * KEY_C1 Lower left of keypad - * KEY_C3 Lower right of keypad - * - * KEY_ENTER - * KEY_BACKSPACE - */ + int type; int key; - int alt_key; - enum event_type type; + int height; + int width; + int time_ms; int mouse_x; int mouse_y; int mouse_left; int mouse_right; int mouse_middle; - long int time_ms; + int alt_key; }; -/** - * Sets cell to a state. - * @param event - * @param x coordinate of cell - * @param y coordinate of cell - * @param new state of the cell - */ -void set_cell(int character,int x,int y); - -/** - * COLOR_BLACK 0 - * COLOR_RED 1 - * COLOR_GREEN 2 - * COLOR_YELLOW 3 - * COLOR_BLUE 4 - * COLOR_MAGENTA 5 - * COLOR_CYAN 6 - * COLOR_WHITE 7 - */ +#define EVENT_KEY 1 +#define EVENT_MOUSE 2 +#define EVENT_RESIZE 3 +#define EVENT_ESC 4 +#define EVENT_TIMEOUT 5 +#define EVENT_START 6 #define COLOR_COUNT 8 -void set_color_cell(int character,int x,int y,short front_color,short back_color); - - -/** - * - * @param event - * @param number of commandline arguments - * @param init_world - * @param destroy_world - * - * void init_world(struct event* w); - * Initializes user state. - * Free user state. - * @param event - */ - -int start_world(void* (*init_game)(),int (*world_event)(struct event* event,void* game),void (*destroy_game)(void* game)); - -void game_speed(int value); - -void set_message(const char* message,int x,int y); void clear_screen(); +void set_cell(int c, int x, int y); +void set_message(const char* msg, int x, int y); +void set_color_cell(int c, int x, int y, short f, short b); +void game_speed(int v); +void abort_game(const char* m); +int world_run(void* (*init_game)(), int (*world_event)(struct event*, void*)); // ← ВОТ ЭТА СТРОЧКА #endif +