aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorboa <boa@pm.me>2021-02-07 02:10:33 +0100
committerboa <boa@pm.me>2021-02-07 02:10:33 +0100
commit0d52befde1344ad5b0a7238b6b9098d03c4c3590 (patch)
tree74712ce1e6e9cc88f459307308ff98f255f7eb38
parentd52937530d951a9c9a7c5fe00057837c7d9ce131 (diff)
downloadajedrez-0d52befde1344ad5b0a7238b6b9098d03c4c3590.tar.gz
fixes for vt100, ascii mode and bugfixes
-rwxr-xr-xsakkombin27112 -> 31552 bytes
-rw-r--r--sakkom.c208
2 files changed, 140 insertions, 68 deletions
diff --git a/sakkom b/sakkom
index 2c34001..4bdd60c 100755
--- a/sakkom
+++ b/sakkom
Binary files 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"));
}
Un proyecto texto-plano.xyz