From 84ae02ac8e2d5a3617516d61369013b6f718c1b7 Mon Sep 17 00:00:00 2001 From: Denis Landa Date: Sun, 8 Jun 2025 12:11:19 +0200 Subject: [PATCH] 2 --- du8/Makefile | 19 +++++ du8/README.md | 23 ++++++ du8/game.c | 95 ++++++++++++++++++++++++ du8/game.h | 20 +++++ du8/game.o | Bin 0 -> 8712 bytes du8/main.c | 9 +++ du8/main.o | Bin 0 -> 4528 bytes du8/world.c | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++ du8/world.h | 113 ++++++++++++++++++++++++++++ du8/world.o | Bin 0 -> 18560 bytes 10 files changed, 477 insertions(+) create mode 100644 du8/Makefile create mode 100644 du8/README.md create mode 100644 du8/game.c create mode 100644 du8/game.h create mode 100644 du8/game.o create mode 100644 du8/main.c create mode 100644 du8/main.o create mode 100644 du8/world.c create mode 100644 du8/world.h create mode 100644 du8/world.o diff --git a/du8/Makefile b/du8/Makefile new file mode 100644 index 0000000..4633fdf --- /dev/null +++ b/du8/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -Wall -Wextra -g + +all: piskorky + +piskorky: main.o game.o world.o + $(CC) $(CFLAGS) -o piskorky main.o game.o world.o -lncurses + +main.o: main.c game.h world.h + $(CC) $(CFLAGS) -c main.c + +game.o: game.c game.h world.h + $(CC) $(CFLAGS) -c game.c + +world.o: world.c world.h + $(CC) $(CFLAGS) -c world.c + +clean: + rm -f *.o piskorky \ No newline at end of file diff --git a/du8/README.md b/du8/README.md new file mode 100644 index 0000000..13411c1 --- /dev/null +++ b/du8/README.md @@ -0,0 +1,23 @@ +# Piškvorky (Tic-Tac-Toe) – Terminalová hra s knižnicou `world` + +## 🕹️ 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. + +## 🛠️ Preklad a spustenie +```bash +make +./piskorky +``` + +## 🧠 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á). + +## 📚 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 new file mode 100644 index 0000000..fc49341 --- /dev/null +++ b/du8/game.c @@ -0,0 +1,95 @@ +#include "game.h" +#include "world.h" + +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 draw(void *state) { + GameState *game = (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); + } + } + 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!")); + } +} + +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; + } + } + 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; + } +} + +void key_handler(int key, void *state) { + GameState *game = (GameState *)state; + if (game->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; + } + } break; + } +} + +void update(void *state) { } \ No newline at end of file diff --git a/du8/game.h b/du8/game.h new file mode 100644 index 0000000..4182c5a --- /dev/null +++ b/du8/game.h @@ -0,0 +1,20 @@ +#ifndef GAME_H +#define GAME_H + +#define SIZE 3 + +typedef enum { EMPTY, X, O } Cell; +typedef struct { + Cell board[SIZE][SIZE]; + int current_player; + int cursor_x, cursor_y; + int game_over; + Cell winner; +} GameState; + +void game_init(GameState *game); +void draw(void *state); +void update(void *state); +void key_handler(int key, void *state); + +#endif \ No newline at end of file diff --git a/du8/game.o b/du8/game.o new file mode 100644 index 0000000000000000000000000000000000000000..0ffb29475405e6f5574ff1fe9b3537d1a0e5ff5d GIT binary patch literal 8712 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 P0l1a_9jgD%|M>q0$sCkJ literal 0 HcmV?d00001 diff --git a/du8/world.c b/du8/world.c new file mode 100644 index 0000000..a45c109 --- /dev/null +++ b/du8/world.c @@ -0,0 +1,198 @@ +#include "world.h" +#include +#include +#include +#include +#include + +int TIMEOUT; + +void abort_game(const char* message){ + 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); + } +} + +void clear_screen(){ + // Clear screen + mvaddch(0,0,' '); + int screenchars = LINES*COLS; + for (int j = 1; j < screenchars;j++ ){ + addch(' '); + } +} + +void game_speed(int value){ + if (value < 0){ + abort_game("world_seed:: cannot be negative\n"); + } + TIMEOUT =value; +} + +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 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); + 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.h b/du8/world.h new file mode 100644 index 0000000..73be057 --- /dev/null +++ b/du8/world.h @@ -0,0 +1,113 @@ +#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 key; + int alt_key; + enum event_type type; + int mouse_x; + int mouse_y; + int mouse_left; + int mouse_right; + int mouse_middle; + long int time_ms; +}; + +/** + * 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 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(); + +#endif diff --git a/du8/world.o b/du8/world.o new file mode 100644 index 0000000000000000000000000000000000000000..80c25f15f1effa01359d43a25ea06bfb6baddeef GIT binary patch literal 18560 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