From 7464cedbed3b4a511a284e88767f012bc5abe1b7 Mon Sep 17 00:00:00 2001 From: Denis Landa Date: Sun, 8 Jun 2025 12:52:57 +0200 Subject: [PATCH] 12 --- du8/Makefile | 13 ++-- du8/README.md | 89 +++++++++++++++++----- du8/game.c | 126 ++++++++++++------------------- du8/game.h | 32 +++++--- du8/game.o | Bin 8712 -> 0 bytes du8/main.c | 17 ++++- du8/main.o | Bin 4528 -> 0 bytes du8/world.c | 203 +++++--------------------------------------------- du8/world.o | Bin 18560 -> 0 bytes 9 files changed, 180 insertions(+), 300 deletions(-) delete mode 100644 du8/game.o delete mode 100644 du8/main.o delete mode 100644 du8/world.o diff --git a/du8/Makefile b/du8/Makefile index 4633fdf..2e32c1f 100644 --- a/du8/Makefile +++ b/du8/Makefile @@ -1,10 +1,10 @@ -CC = gcc -CFLAGS = -Wall -Wextra -g +CC=gcc +CFLAGS=-Wall -std=c99 -all: piskorky +all: game -piskorky: main.o game.o world.o - $(CC) $(CFLAGS) -o piskorky main.o game.o world.o -lncurses +game: main.o game.o world.o + $(CC) $(CFLAGS) -o game main.o game.o world.o -lncurses main.o: main.c game.h world.h $(CC) $(CFLAGS) -c main.c @@ -16,4 +16,5 @@ world.o: world.c world.h $(CC) $(CFLAGS) -c world.c clean: - rm -f *.o piskorky \ No newline at end of file + rm -f *.o game + diff --git a/du8/README.md b/du8/README.md index 13411c1..b57958c 100644 --- a/du8/README.md +++ b/du8/README.md @@ -1,23 +1,78 @@ -# Piškvorky (Tic-Tac-Toe) – Terminalová hra s knižnicou `world` +# World Game Library -## 🕹️ Ako hrať -- Ovládanie: `WASD` na pohyb, `medzerník` na položenie znaku. -- Hráči sa striedajú ako X a O. -- Hra končí výhrou jedného hráča alebo remízou. +Learn asycnronous C programming by a game. -## 🛠️ Preklad a spustenie -```bash +The library implements a game loop for a character-based ncurses game; + +The library finds out the event types: + +- start and end +- mouse events +- keyboard events +- screen resize events + +It can print colors and arbitrary characters on the screen. +Running is interrupted when character is drawn out of the screen. + +## Installation and Running + +Make sure, that `ncurses` is installed. + +Clone this repository. + +Compile: + +```c make -./piskorky +``` + +Run: + +```c +./game ``` -## 🧠 Kód – Štruktúry a funkcie -- `GameState`: štruktúra uchovávajúca stav hry (pole, hráč, kurzor, výherca). -- `game_init`: inicializuje hru. -- `draw`: vykresľuje mriežku a obsah. -- `key_handler`: reaguje na stlačené klávesy. -- `update`: nepoužíva sa (hra nie je časovo riadená). +## Make your own game + +The game happens in a rectangular world of colorful characters. +Your goal as a programmer is to modify the world according to the pressed keys and the internal game state. +The library implements the game loop and draws the world to screen. + +Your game in file `game.c` consists of two functions: + +- `void* init_game()` is called in the beginning. Here you can initialize the internal state of the game. +The function should return a pointer to an instance of the initial game state `game`. +- `int game_event(struct event* event,void* game)` +is called by the game loop in periodic interval or when a key was pressed. Non-zero return value or `Ctrl+C` key interrupts the game loop. + +The world variable represents state of two-dimensional grid of characters on the screen. The screen matrix looks like this: + +``` + origin + [0,0] width + +--------------------+ +h | | +e | | +i | | +g | | +h | | +t | | + +--------------------+ +``` + +The world has the following parameters: + +- `int height`: y-dimension of the grid. +- `int width`: x-dimension of the grid. +- `int interval`: maximum time between steps in milliseconds. + +### The Event Function + +The `int game_event(struct event* event,void* game)` + function should: + +1. Read the game state (from the `void* game`) pointer. +1. Examine the pressed key from event pointer. If the `key` variable is non-zero, a key was pressed. According to the pressed key, modify the game state `game`. +1. Draw the game state. In the beginning of the step function the screen is empty. +1. Returning non-zero value ends the game loop. -## 📚 Zdroje -- Príklady z predmetu ZAP. -- Dokumentácia k `ncurses` a `world.h`. \ No newline at end of file diff --git a/du8/game.c b/du8/game.c index fc49341..53ce275 100644 --- a/du8/game.c +++ b/du8/game.c @@ -1,95 +1,65 @@ #include "game.h" #include "world.h" +#include -void game_init(GameState *game) { - for (int y = 0; y < SIZE; ++y) - for (int x = 0; x < SIZE; ++x) - game->board[y][x] = EMPTY; - game->current_player = X; - game->cursor_x = 0; - game->cursor_y = 0; - game->game_over = 0; - game->winner = EMPTY; +void init_game(GameState *state) { + memset(state->board, ' ', sizeof(state->board)); + state->cursor_x = 0; + state->cursor_y = 0; + state->current_player = 0; + state->game_over = 0; } -void draw(void *state) { - GameState *game = (GameState *)state; +void draw_game(const GameState *state) { world_clear(); - for (int y = 0; y < SIZE; ++y) { - for (int x = 0; x < SIZE; ++x) { - world_set_color((x == game->cursor_x && y == game->cursor_y) ? 2 : 1); - char *symbol = "[ ]"; - if (game->board[y][x] == X) symbol = "[X]"; - else if (game->board[y][x] == O) symbol = "[O]"; - world_draw_string(x * 4, y * 2, symbol); + for (int y = 0; y < BOARD_SIZE; y++) { + for (int x = 0; x < BOARD_SIZE; x++) { + int wx = 5 + x * 4; + int wy = 3 + y * 2; + if (x == state->cursor_x && y == state->cursor_y) + world_draw_char(wx, wy, state->board[y][x], COLOR_RED); + else + world_draw_char(wx, wy, state->board[y][x], COLOR_WHITE); } } - if (game->game_over) { - world_set_color(3); - world_draw_string(0, SIZE * 2 + 1, game->winner == EMPTY ? "Remiza!" : - (game->winner == X ? "Vyhral X!" : "Vyhral O!")); - } + world_draw_text(0, 0, "Hráč: %c", state->current_player ? 'O' : 'X'); + if (state->game_over) + world_draw_text(0, 1, "Koniec hry! Stlač Q na ukončenie."); + world_display(); } -void check_winner(GameState *game) { - for (int i = 0; i < SIZE; ++i) { - if (game->board[i][0] != EMPTY && - game->board[i][0] == game->board[i][1] && - game->board[i][1] == game->board[i][2]) { - game->winner = game->board[i][0]; - game->game_over = 1; - return; - } - if (game->board[0][i] != EMPTY && - game->board[0][i] == game->board[1][i] && - game->board[1][i] == game->board[2][i]) { - game->winner = game->board[0][i]; - game->game_over = 1; - return; +int check_winner(const GameState *state) { + char p[] = {'X', 'O'}; + for (int i = 0; i < 2; i++) { + char c = p[i]; + for (int j = 0; j < BOARD_SIZE; j++) { + if (state->board[j][0] == c && state->board[j][1] == c && state->board[j][2] == c) return 1; + if (state->board[0][j] == c && state->board[1][j] == c && state->board[2][j] == c) return 1; } + if (state->board[0][0] == c && state->board[1][1] == c && state->board[2][2] == c) return 1; + if (state->board[0][2] == c && state->board[1][1] == c && state->board[2][0] == c) return 1; } - if (game->board[0][0] != EMPTY && - game->board[0][0] == game->board[1][1] && - game->board[1][1] == game->board[2][2]) { - game->winner = game->board[0][0]; - game->game_over = 1; - return; - } - if (game->board[0][2] != EMPTY && - game->board[0][2] == game->board[1][1] && - game->board[1][1] == game->board[2][0]) { - game->winner = game->board[0][2]; - game->game_over = 1; - return; - } - int full = 1; - for (int y = 0; y < SIZE; ++y) - for (int x = 0; x < SIZE; ++x) - if (game->board[y][x] == EMPTY) - full = 0; - if (full) { - game->game_over = 1; - game->winner = EMPTY; - } + return 0; } -void key_handler(int key, void *state) { - GameState *game = (GameState *)state; - if (game->game_over) return; +void handle_key(GameState *state, int key) { + if (state->game_over) return; + switch (key) { - case 'w': if (game->cursor_y > 0) game->cursor_y--; break; - case 's': if (game->cursor_y < SIZE - 1) game->cursor_y++; break; - case 'a': if (game->cursor_x > 0) game->cursor_x--; break; - case 'd': if (game->cursor_x < SIZE - 1) game->cursor_x++; break; - case ' ': { - if (game->board[game->cursor_y][game->cursor_x] == EMPTY) { - game->board[game->cursor_y][game->cursor_x] = game->current_player; - check_winner(game); - if (!game->game_over) - game->current_player = (game->current_player == X) ? O : X; + case KEY_UP: if (state->cursor_y > 0) state->cursor_y--; break; + case KEY_DOWN: if (state->cursor_y < BOARD_SIZE - 1) state->cursor_y++; break; + case KEY_LEFT: if (state->cursor_x > 0) state->cursor_x--; break; + case KEY_RIGHT: if (state->cursor_x < BOARD_SIZE - 1) state->cursor_x++; break; + case '\n': + case ' ': + if (state->board[state->cursor_y][state->cursor_x] == ' ') { + state->board[state->cursor_y][state->cursor_x] = state->current_player ? 'O' : 'X'; + if (check_winner(state)) { + state->game_over = 1; + } else { + state->current_player = !state->current_player; + } } - } break; + break; } -} - -void update(void *state) { } \ No newline at end of file +} \ No newline at end of file diff --git a/du8/game.h b/du8/game.h index 4182c5a..1b7811a 100644 --- a/du8/game.h +++ b/du8/game.h @@ -1,20 +1,28 @@ #ifndef GAME_H #define GAME_H -#define SIZE 3 +#define BOARD_SIZE 3 -typedef enum { EMPTY, X, O } Cell; +// Štruktúra pre stav hry typedef struct { - Cell board[SIZE][SIZE]; - int current_player; - int cursor_x, cursor_y; - int game_over; - Cell winner; + char board[BOARD_SIZE][BOARD_SIZE]; // Hracia plocha 3x3 + int cursor_x; // Pozícia kurzora (X) + int cursor_y; // Pozícia kurzora (Y) + int current_player; // 0 = X, 1 = O + int game_over; // 0 = pokračuje, 1 = koniec } GameState; -void game_init(GameState *game); -void draw(void *state); -void update(void *state); -void key_handler(int key, void *state); +// Inicializácia hry +void init_game(GameState *state); + +// Spracovanie klávesy +void handle_key(GameState *state, int key); + +// Vykreslenie stavu hry +void draw_game(const GameState *state); + +// Kontrola výhercu +int check_winner(const GameState *state); + +#endif // GAME_H -#endif \ No newline at end of file diff --git a/du8/game.o b/du8/game.o deleted file mode 100644 index 0ffb29475405e6f5574ff1fe9b3537d1a0e5ff5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8712 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 P0l1a_9jgD%|M>q0$sCkJ diff --git a/du8/world.c b/du8/world.c index a45c109..9974c0d 100644 --- a/du8/world.c +++ b/du8/world.c @@ -1,198 +1,35 @@ +#include #include "world.h" -#include -#include -#include -#include -#include -int TIMEOUT; +void world_init() { + initscr(); + noecho(); + curs_set(FALSE); + keypad(stdscr, TRUE); + timeout(-1); // Blokujúce čakanie na vstup +} -void abort_game(const char* message){ +void world_end() { endwin(); - puts(message); - exit(1); } -void check_bounds(const char* source,int x, int y){ - char msg[200]; - if (x < 0 || x >= COLS){ - sprintf(msg,"%s:: width %d is out of bounds (0,%d)",source,x,COLS); - abort_game(msg); - } - if (y < 0 || y >= LINES){ - sprintf(msg,"%s:: height %d is out of bounds (0,%d)",source,y,LINES); - abort_game(msg); - } +int world_get_key() { + return getch(); } -void clear_screen(){ - // Clear screen - mvaddch(0,0,' '); - int screenchars = LINES*COLS; - for (int j = 1; j < screenchars;j++ ){ - addch(' '); - } +void world_clear() { + clear(); } -void game_speed(int value){ - if (value < 0){ - abort_game("world_seed:: cannot be negative\n"); - } - TIMEOUT =value; +void world_draw_char(int x, int y, char c) { + mvaddch(y, x, c); } -void set_message(const char* message,int x,int y) { - int l = strlen(message); - for (int i = 0; i < l; i++){ - check_bounds("set_message",x+i,y); - set_cell(message[i],x+i,y); - } +void world_draw_text(int x, int y, const char *text) { + mvprintw(y, x, "%s", text); } -void assert_message(int event,const char* message){ - if (event == 0){ - abort_game(message); - } -} - - -void set_cell(int character,int x,int y) { - check_bounds("set_cell",x,y); - set_color_cell(character,x,y,COLOR_WHITE,COLOR_BLACK); -} - -void set_color_cell(int character,int x,int y,short front_color,short back_color){ - check_bounds("set_color_cell",x,y); - if (has_colors()){ - int pair = COLOR_COUNT * front_color + back_color; - attron(COLOR_PAIR(pair)); - mvaddch(y,x,character); - attroff(COLOR_PAIR(pair)); - } - else{ - mvaddch(y,x,character); - } -} - -int start_world(void* (*init_game)(),int (*world_event)(struct event* event,void* game),void (*destroy_game)(void*)){ - srand(time(NULL)); - int r = 1; - // Speed global variable - TIMEOUT = 100; - if (initscr() == NULL){ - // TODO Which Error? - puts("Curses Error."); - return -1; - } - noecho(); // Nevypisuj vstup na obrazovku - cbreak(); // Zabudni starý vstup - nodelay(stdscr,TRUE); // Nečakaj na stlačenie - keypad(stdscr,TRUE); // Aktivuje šípky - curs_set(FALSE); // Neviditeľný kurzor - /* Get all the mouse events */ - mousemask(ALL_MOUSE_EVENTS, NULL); - MEVENT mouse_event; - if (has_colors()){ // Zistenie či terminál podporuje farby - start_color(); - for (int i = 0; i < COLOR_COUNT;i++){ - for (int j = 0; j < COLOR_COUNT;j++){ - init_pair(i * COLOR_COUNT + j, i,j); - } - } - } - else { - puts("No colors!\n"); - } - void* game = NULL; - if (init_game != NULL){ - game = init_game(); - assert_message(game != NULL,"init_game:: should return non null pointer"); - } - timeout(TIMEOUT); - // Initial step - struct event event; - memset(&event,0,sizeof(struct event)); - event.height = LINES; - event.width = COLS; - event.type = EVENT_START; - clock_t start_time = clock(); - clock_t last_timeout = start_time; - clock_t next_timeout = last_timeout + TIMEOUT; - event.time_ms = start_time; - // Start event - r = world_event(&event,game); +void world_display() { refresh(); - while (!r) { - memset(&event,0,sizeof(struct event)); - event.height = LINES; - event.width = COLS; - event.key = getch(); - // No key was pressed - if (event.key == ERR){ - event.type = EVENT_TIMEOUT; - last_timeout = clock(); - next_timeout = last_timeout + TIMEOUT; - } - // Mouse event - else if (event.key == KEY_MOUSE ){ - event.type = EVENT_MOUSE; - if(getmouse(&mouse_event) == OK){ - event.mouse_x = mouse_event.x; - event.mouse_y = mouse_event.y; - if(mouse_event.bstate & BUTTON1_PRESSED){ - event.mouse_left = 1; - } - if(mouse_event.bstate & BUTTON2_PRESSED){ - event.mouse_middle = 1; - } - if(mouse_event.bstate & BUTTON3_PRESSED){ - event.mouse_right = 1; - } - } - } - else if (event.key == KEY_RESIZE) { - event.type = EVENT_RESIZE; - } - else{ - event.type = EVENT_KEY; - if (event.key == 27){ - int k = getch(); - if (k == -1){ - // Esc Was pressed - event.type = EVENT_ESC; - } - else { - // Alt was pressed - event.key = k; - event.alt_key = 1; - } - } - } - // Draw new world - event.time_ms = clock(); - r = world_event(&event,game); - refresh(); - event.time_ms = clock(); - // set new timeout - int nt = next_timeout - event.time_ms; - //printf("%d\n",nt); - if (nt > 0){ - timeout(nt); - } - else { - timeout(TIMEOUT); - next_timeout = event.time_ms + TIMEOUT; - } - } - memset(&event,0,sizeof(struct event)); - event.height = LINES; - event.width = COLS; - event.type = EVENT_END; - event.time_ms = clock(); - world_event(&event,game); - if (destroy_game != NULL){ - destroy_game(game); - } - endwin(); - return r; -}; +} + diff --git a/du8/world.o b/du8/world.o deleted file mode 100644 index 80c25f15f1effa01359d43a25ea06bfb6baddeef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18560 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