From 0d52befde1344ad5b0a7238b6b9098d03c4c3590 Mon Sep 17 00:00:00 2001 From: boa Date: Sun, 7 Feb 2021 02:10:33 +0100 Subject: fixes for vt100, ascii mode and bugfixes --- sakkom | Bin 27112 -> 31552 bytes sakkom.c | 208 ++++++++++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 140 insertions(+), 68 deletions(-) diff --git a/sakkom b/sakkom index 2c34001..4bdd60c 100755 Binary files a/sakkom and b/sakkom differ diff --git a/sakkom.c b/sakkom.c index e470efc..5dbcea0 100644 --- a/sakkom.c +++ b/sakkom.c @@ -21,11 +21,13 @@ dprintf(b_fd, (f_), ##__VA_ARGS__); \ } while (0) +typedef enum mode { mode_ascii, mode_unicode } mode; +mode modes[2]; typedef enum color { c_w = 0, c_b = 1 } color; - typedef enum castle { castle_no, castle_long, castle_short } castle; int colors[] = {39, 30}; +char ascii_colors[] = {' ', '*'}; int abs(int a) { if (a >= 0) @@ -34,15 +36,18 @@ int abs(int a) { return -1 * a; } +char symbols[7][7] = {" ", "♟︎", "♜", "♞", "♝", "♛", "♚"}; +char ascii_symbols[7] = {' ', 'P', 'R', 'N', 'B', 'Q', 'K'}; + typedef enum result { r_no, r_win, r_stalemate } result; typedef enum piece_type { p_no, - p_pawn = 'P', - p_rook = 'R', - p_knight = 'N', - p_bishop = 'B', - p_queen = 'Q', - p_king = 'K' + p_pawn, + p_rook, + p_knight, + p_bishop, + p_queen, + p_king } piece_type; typedef struct pos { @@ -76,6 +81,7 @@ 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}; +int game_number = 1; void do_move(move m); bool is_move_legal(color c, move m); @@ -98,56 +104,101 @@ bool is_move_inside(move m) { } void print_table() { - dprintf(w_fd, "\n \e[43m\x1B[30m\033[1m BLACK \x1B[0m\n\n "); - dprintf(b_fd, "\n \e[43m\x1B[39m\033[1m WHITE \x1B[0m\n\n "); - - for (int x = 0; x < 8; x++) { - dprintf(w_fd, " %c ", 'A' + x); - dprintf(b_fd, " %c ", 'A' + 7 - x); - } - - PRINT_ALL("\n \e[43m+-------------------------------+\x1B[0m\n"); - for (int y = 7; y >= 0; y--) { - if (y != 7) { - dprintf(w_fd, "\x1B[0m " - "\e[43m|---+---+---+---+---+---+---+---|\x1B[0m\n"); + if (modes[c_w] == mode_unicode) { + dprintf(w_fd, + "\n \e[43m\x1B[30m\033[1m BLACK \x1B[0m\n\n "); + for (int x = 0; x < 8; x++) { + dprintf(w_fd, " %c ", 'A' + x); } - 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|", - colors[table[x][y].c], table[x][y].p); - else - dprintf(w_fd, " |"); - dprintf(w_fd, "\x1B[0m %d\x1B[0m\n", y + 1); - } - - for (int y = 0; y < 8; y++) { - if (y != 0) { - dprintf(b_fd, "\x1B[0m " - "\e[43m|---+---+---+---+---+---+---+---|\x1B[0m\n"); + dprintf(w_fd, "\n \e[43m┏━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┓\x1B[0m\n"); + for (int y = 7; y >= 0; y--) { + if (y != 7) { + dprintf(w_fd, "\x1B[0m " + "\e[43m┣━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━┫\x1B[0m\n"); + } + dprintf(w_fd, " %d \e[43m┃", y + 1); + for (int x = 0; x < 8; x++) + dprintf(w_fd, "\e[43m\x1B[%dm \033[1m%s \x1B[0m\e[43m┃", + colors[table[x][y].c], symbols[table[x][y].p]); + dprintf(w_fd, "\x1B[0m %d\x1B[0m\n", y + 1); } - 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|", - colors[table[x][y].c], table[x][y].p); - else - dprintf(b_fd, " |"); - dprintf(b_fd, "\x1B[0m %d\n", y + 1); + dprintf(w_fd, " \e[43m┗━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛\x1B[0m\n "); + for (int x = 0; x < 8; x++) { + dprintf(w_fd, " %c ", 'A' + x); + } + dprintf( + w_fd, + "\n\n \e[43m\x1B[39m\033[1m WHITE \x1B[0m\n\n\x1B[0m"); + } else { + dprintf(w_fd, "\n [ BLACK ]\n\n "); + for (int x = 0; x < 8; x++) { + dprintf(w_fd, " %c ", 'A' + x); + } + dprintf(w_fd, "\n +---+---+---+---+---+---+---+---+\n"); + for (int y = 7; y >= 0; y--) { + if (y != 7) { + dprintf(w_fd, " +---+---+---+---+---+---+---+---+\n"); + } + dprintf(w_fd, " %d |", y + 1); + for (int x = 0; x < 8; x++) + dprintf(w_fd, "%c%c |", ascii_colors[table[x][y].c], + ascii_symbols[table[x][y].p]); + dprintf(w_fd, " %d\n", y + 1); + } + dprintf(w_fd, " +---+---+---+---+---+---+---+---+\n "); + for (int x = 0; x < 8; x++) { + dprintf(w_fd, " %c ", 'A' + x); + } + dprintf(w_fd, "\n\n [ WHITE ]\n\n"); } - PRINT_ALL(" \e[43m+-------------------------------+\x1B[0m\n "); - - for (int x = 0; x < 8; x++) { - dprintf(b_fd, " %c ", 'A' + 7 - x); - dprintf(w_fd, " %c ", 'A' + x); + if (modes[c_b] == mode_unicode) { + dprintf(b_fd, + "\n \e[43m\x1B[39m\033[1m WHITE \x1B[0m\n\n "); + for (int x = 0; x < 8; x++) { + dprintf(b_fd, " %c ", 'A' + 7 - x); + } + dprintf(b_fd, "\n \e[43m┏━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┓\x1B[0m\n"); + for (int y = 0; y < 8; y++) { + if (y != 0) { + dprintf(b_fd, "\x1B[0m " + "\e[43m┣━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━┫\x1B[0m\n"); + } + dprintf(b_fd, " %d \e[43m┃", y + 1); + for (int x = 7; x >= 0; x--) + dprintf(b_fd, "\e[43m\x1B[%dm \033[1m%s \x1B[0m\e[43m┃", + colors[table[x][y].c], symbols[table[x][y].p]); + dprintf(b_fd, "\x1B[0m %d\n", y + 1); + } + dprintf(b_fd, " \e[43m┗━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛\x1B[0m\n "); + for (int x = 0; x < 8; x++) { + dprintf(b_fd, " %c ", 'A' + 7 - x); + } + dprintf( + b_fd, + "\n\n \e[43m\x1B[30m\033[1m BLACK \x1B[0m\n\n\x1B[0m"); + } else { + dprintf(b_fd, "\n [ WHITE ]\n\n "); + for (int x = 0; x < 8; x++) { + dprintf(b_fd, " %c ", 'A' + 7 - x); + } + dprintf(b_fd, "\n +---+---+---+---+---+---+---+---+\n"); + for (int y = 0; y < 8; y++) { + if (y != 0) { + dprintf(b_fd, " +---+---+---+---+---+---+---+---+\n"); + } + dprintf(b_fd, " %d |", y + 1); + for (int x = 7; x >= 0; x--) + dprintf(b_fd, "%c%c |", ascii_colors[table[x][y].c], + ascii_symbols[table[x][y].p]); + dprintf(b_fd, " %d\n", y + 1); + } + dprintf(b_fd, " +---+---+---+---+---+---+---+---+\n "); + for (int x = 0; x < 8; x++) { + dprintf(b_fd, " %c ", 'A' + 7 - x); + } + dprintf(b_fd, "\n\n [ BLACK ]\n\n"); } - - dprintf(w_fd, - "\n\n \e[43m\x1B[39m\033[1m WHITE \x1B[0m\n\n\x1B[0m"); - dprintf(b_fd, - "\n\n \e[43m\x1B[30m\033[1m BLACK \x1B[0m\n\n\x1B[0m"); } bool in_check(color c, int cx, int cy) { @@ -266,24 +317,27 @@ bool is_checkmate(color c) { return true; } +int move_num = 1; void print_move(move m) { char buf[20]; int n = 0; - buf[n++] = table[m.f.x][m.f.y].p; + buf[n++] = ascii_symbols[m.p.p]; buf[n++] = m.f.x + 'a'; buf[n++] = m.f.y + '1'; buf[n++] = ' '; - if (table[m.t.x][m.t.y].p != p_no) - buf[n++] = table[m.t.x][m.t.y].p; + if (m.e.p != p_no) + buf[n++] = ascii_symbols[m.p.p]; buf[n++] = m.t.x + 'a'; buf[n++] = m.t.y + '1'; buf[n++] = '\n'; buf[n++] = '\0'; - printf("%s", buf); - if (m.p.c == c_w) - dprintf(b_fd, buf); - else - dprintf(w_fd, buf); + if (m.p.c == c_w) { + PRINT_ALL("%d. white: ", move_num); + } else { + PRINT_ALL("%d. black: ", move_num); + move_num++; + } + PRINT_ALL(buf); } move parse_move(char buf[50]) { @@ -373,7 +427,6 @@ bool is_move_legal(color c, move m) { return false; break; case p_king: - printf("dx: %d dy: %d\n", dx, dy); if (abs(dx) > 3 || abs(dy) > 1) return false; if (in_check(c, m.t.x, m.t.y)) @@ -445,7 +498,7 @@ 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, + dprintf(*c_fd, "\0337\r%02d:%02d > \0338", remaining_time[c_c] / 60, remaining_time[c_c] % 60); remaining_time[c_c]--; if (remaining_time[c_c] <= 0) { @@ -462,21 +515,33 @@ void *run_timer(void *vargp) { } void play_game() { + PRINT_ALL("(a)scii vagy (u)nicode? [u] "); + char input_str[50]; + read(w_fd, input_str, 50); + if (input_str[0] == 'a') + modes[c_w] = mode_ascii; + else + modes[c_w] = mode_unicode; + + read(b_fd, input_str, 50); + if (input_str[0] == 'a') + modes[c_b] = mode_ascii; + else + modes[c_b] = mode_unicode; + c_c = c_w; // current color is_printing = true; pthread_t thread_id; pthread_create(&thread_id, NULL, run_timer, NULL); + print_table(); 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, "> "); - if (is_checkmate(c_c)) { if (c_c == c_w) PRINT_ALL("\na fekete nyert!\n"); @@ -506,7 +571,6 @@ void play_game() { move m = parse_move(buf); if (is_move_legal(c_c, m)) { - print_move(m); do_move(m); castle ct = is_castle(c_c, m); @@ -542,6 +606,8 @@ void play_game() { if ((m.t.y == 0 || m.t.y == 7) && m.p.p == p_pawn) table[m.t.x][m.t.y].p = choose_type(*c_fd); + print_table(); + print_move(m); } else { dprintf(*c_fd, "hiba\n"); goto no_print; @@ -650,8 +716,14 @@ int main() { dprintf(new_fd, "te vagy a feketével\n"); dprintf(w_fd, "belépett a fekete is, kezdhetjük!\n"); b_fd = new_fd; - play_game(); - return 0; + if (fork() == 0) { + play_game(); + return 0; + } else { + w_fd = -1; + b_fd = -1; + game_number++; + } } else { // write(new_fd, "nincs hely!\n", strlen("nincs hely!\n")); } -- cgit v1.2.3