This commit is contained in:
Саша 2025-05-02 19:50:28 +02:00
parent 591bc55c3d
commit 8e44e30c67
3 changed files with 49 additions and 136 deletions

View File

@ -1,45 +1,46 @@
#include "game.h"
#include "world.h"
#include <stdlib.h>
#include "world.h"
#include <stdio.h>
#include <ncurses.h>
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;
}

View File

@ -1,19 +1,8 @@
#include "game.h"
#include "world.h"
#include <stdlib.h>
#include "world.h"
#include <ncurses.h>
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);
}

View File

@ -1,113 +1,36 @@
#ifndef _WORLD_H_
#define _WORLD_H_
#include <curses.h>
/**
* 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