From f05687d372bea4b26ea710e0143f5dcaee1b2632 Mon Sep 17 00:00:00 2001 From: boa Date: Tue, 2 Feb 2021 01:08:15 +0100 Subject: timer --- chess | Bin 37432 -> 38064 bytes q | 1 + sakkom | Bin 0 -> 27128 bytes sakkom.c | 51 +++++++++++++++++++++++++++++++++++++++++++-------- td.h>q | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 q create mode 100755 sakkom create mode 100644 td.h>q diff --git a/chess b/chess index 7d2f063..5d54946 100755 Binary files a/chess and b/chess differ diff --git a/q b/q new file mode 100644 index 0000000..1c90a2e --- /dev/null +++ b/q @@ -0,0 +1 @@ +td.h diff --git a/sakkom b/sakkom new file mode 100755 index 0000000..9fba27f Binary files /dev/null and b/sakkom differ diff --git a/sakkom.c b/sakkom.c index 4de8f77..47387af 100644 --- a/sakkom.c +++ b/sakkom.c @@ -5,10 +5,13 @@ // boa #include +#include +#include #include #include #include #include +#include #include #include @@ -18,7 +21,9 @@ dprintf(b_fd, (f_), ##__VA_ARGS__); \ } while (0) -typedef enum color { c_w = 39, c_b = 30 } color; +typedef enum color { c_w = 0, c_b = 1 } color; + +int colors[] = {39, 30}; int abs(int a) { if (a >= 0) @@ -68,6 +73,7 @@ int *c_fd = &w_fd; // current fd bool moved_king[2] = {false, false}; bool moved_rook_l[2] = {false, false}; bool moved_rook_r[2] = {false, false}; +int remaining_time[2] = {30 * 60, 30 * 60}; void do_move(move m); bool is_move_legal(color c, move m); @@ -105,8 +111,8 @@ void print_table() { dprintf(w_fd, " %d \e[43m|", y + 1); for (int x = 0; x < 8; x++) if (table[x][y].p) - dprintf(w_fd, "\e[43m\x1B[%dm \033[1m%c \x1B[0m\e[43m|", table[x][y].c, - table[x][y].p); + dprintf(w_fd, "\e[43m\x1B[%dm \033[1m%c \x1B[0m\e[43m|", + colors[table[x][y].c], table[x][y].p); else dprintf(w_fd, " |"); dprintf(w_fd, "\x1B[0m %d\x1B[0m\n", y + 1); @@ -119,8 +125,8 @@ void print_table() { dprintf(b_fd, " %d \e[43m|", y + 1); for (int x = 7; x >= 0; x--) if (table[x][y].p) - dprintf(b_fd, "\e[43m\x1B[%dm \033[1m%c \x1B[0m\e[43m|", table[x][y].c, - table[x][y].p); + dprintf(b_fd, "\e[43m\x1B[%dm \033[1m%c \x1B[0m\e[43m|", + colors[table[x][y].c], table[x][y].p); else dprintf(b_fd, " |"); dprintf(b_fd, "\x1B[0m %d\n", y + 1); @@ -413,16 +419,42 @@ piece_type choose_type(int fd) { } } +color c_c; +bool is_printing = false; +void *run_timer(void *vargp) { + while (true) { + if (!is_printing) { + dprintf(*c_fd, "\033[s\r%02d:%02d > \033[u", remaining_time[c_c] / 60, + remaining_time[c_c] % 60); + remaining_time[c_c]--; + if (remaining_time[c_c] <= 0) { + if (c_c == c_w) + PRINT_ALL("fehérnek lejárt az ideje, fekete nyert!\n"); + else + PRINT_ALL("feketének lejárt az ideje, fehér nyert!\n"); + raise(SIGTERM); + } + } + sleep(1); + } + return NULL; +} + void play_game() { - color c_c = c_w; // current color + c_c = c_w; // current color + is_printing = true; + pthread_t thread_id; + pthread_create(&thread_id, NULL, run_timer, NULL); + for (;;) { + is_printing = true; print_table(); if (c_c == c_w) dprintf(b_fd, "fehér gondolkodik...\n"); else dprintf(w_fd, "fekete gondolkodik...\n"); no_print: - dprintf(*c_fd, "> "); + // dprintf(*c_fd, "> "); if (is_checkmate(c_c)) { if (c_c == c_w) @@ -434,9 +466,12 @@ void play_game() { PRINT_ALL("\ndöntetlen\n"); break; } - + dprintf(*c_fd, "\n%02d:%02d > ", remaining_time[c_c] / 60, + remaining_time[c_c] % 60); + is_printing = false; char buf[50] = {0}; read(*c_fd, buf, 50); + is_printing = true; if (buf[0] == 's') goto skip; if (buf[0] == ':') { diff --git a/td.h>q b/td.h>q new file mode 100644 index 0000000..00167a2 --- /dev/null +++ b/td.h>q @@ -0,0 +1,53 @@ +SLEEP(3) Linux Programmer's Manual SLEEP(3) + +NNAAMMEE + sleep - sleep for a specified number of seconds + +SSYYNNOOPPSSIISS + ##iinncclluuddee <> + + uunnssiiggnneedd iinntt sslleeeepp((uunnssiiggnneedd iinntt _s_e_c_o_n_d_s));; + +DDEESSCCRRIIPPTTIIOONN + sslleeeepp() causes the calling thread to sleep either until the number of + real-time seconds specified in _s_e_c_o_n_d_s have elapsed or until a signal ar‐ + rives which is not ignored. + +RREETTUURRNN VVAALLUUEE + Zero if the requested time has elapsed, or the number of seconds left to + sleep, if the call was interrupted by a signal handler. + +AATTTTRRIIBBUUTTEESS + For an explanation of the terms used in this section, see aattttrriibbuutteess(7). + + ┌──────────┬───────────────┬─────────────────────────────┐ + │IInntteerrffaaccee │ AAttttrriibbuuttee │ VVaalluuee │ + ├──────────┼───────────────┼─────────────────────────────┤ + │sslleeeepp() │ Thread safety │ MT-Unsafe sig:SIGCHLD/linux │ + └──────────┴───────────────┴─────────────────────────────┘ + +CCOONNFFOORRMMIINNGG TTOO + POSIX.1-2001, POSIX.1-2008. + +NNOOTTEESS + On Linux, sslleeeepp() is implemented via nnaannoosslleeeepp(2). See the nnaannoosslleeeepp(2) + man page for a discussion of the clock used. + + PPoorrttaabbiilliittyy nnootteess + On some systems, sslleeeepp() may be implemented using aallaarrmm(2) and SSIIGGAALLRRMM + (POSIX.1 permits this); mixing calls to aallaarrmm(2) and sslleeeepp() is a bad + idea. + + Using lloonnggjjmmpp(3) from a signal handler or modifying the handling of + SSIIGGAALLRRMM while sleeping will cause undefined results. + +SSEEEE AALLSSOO + sslleeeepp(1), aallaarrmm(2), nnaannoosslleeeepp(2), ssiiggnnaall(2), ssiiggnnaall(7) + +CCOOLLOOPPHHOONN + This page is part of release 5.10 of the Linux _m_a_n_-_p_a_g_e_s project. A de‐ + scription of the project, information about reporting bugs, and the lat‐ + est version of this page, can be found at + https://www.kernel.org/doc/man-pages/. + +GNU 2017-09-15 SLEEP(3) -- cgit v1.2.3