From f0d5cde50cc7a825acadbfe58b6046a4912f4814 Mon Sep 17 00:00:00 2001 From: tslil Date: Fri, 1 Jan 2021 11:45:12 -0500 Subject: tak.h now tracks win state, optimisations, saved a byte on counts --- src/ctaklm.c | 71 ++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 38 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/ctaklm.c b/src/ctaklm.c index 5dbfde8..5ad7e8e 100644 --- a/src/ctaklm.c +++ b/src/ctaklm.c @@ -146,15 +146,15 @@ print_info(void) { rst, (ply < 2) ? " (counter-play start)" : ""); printf("Flats remaining: %sWhite%s %02d, %sBlack%s %02d\n", - wht,rst,white_flats, - blk,rst,black_flats); + wht,rst,white_count & 127, + blk,rst,black_count & 127); printf("Caps remaining: %sWhite%s %d, %sBlack%s %d\n", - wht,rst,white_caps, - blk,rst,black_caps); + wht,rst,white_count >> 7, + blk,rst,black_count >> 7); } char *gamelog = 0; -uint8_t auto_board = 0xFF, auto_info = 0xFF, won = 0x00; +uint8_t auto_board = 0xFF, auto_info = 0xFF; static void append_to_gamelog(char *line, const uint8_t win_line) { @@ -182,43 +182,49 @@ append_to_gamelog(char *line, const uint8_t win_line) { static void end_game(char *line, char *win) { - won = 0xFF; append_to_gamelog(line, 0); append_to_gamelog(win, 1); print_board(); puts("Game over:"); puts(gamelog); - puts("\nEnter `new' to play again."); + putchar('\n'); } static void handle_turn(char *line) { - if (won) { - puts("Game over, enter `new' to play again."); - } else { - switch (do_ptn(line)) { - // Errors - case PTN_INVALID : { puts("Invalid PTN."); break; } - case ACT_ILLEGAL : { puts("Illegal action."); break; } - case ACT_OVERFLOW : { - puts("Move would cause internal overflow, select another."); - break; - } - // Valid, append to game log - case PTN_VALID: - case ACT_OK: { - append_to_gamelog(line, 0); - if (auto_info) print_info(); - if (auto_board) print_board(); - break; + // Track win state + uint8_t new_win = (won == -1); + switch (do_ptn(line)) { + // Errors + case PTN_INVALID: { puts("Invalid PTN."); break; } + case ACT_ILLEGAL: { puts("Illegal action."); break; } + case ACT_OVERFLOW: { + puts("Move would cause internal overflow, select another."); + break; + } + // Game has ended + case GAME_END: { + // Did it end this turn? + if (new_win) { + switch (won) { + case WIN_DRAGON: { end_game(line,"R-R"); break; } + case WIN_DRAW: { end_game(line,"1/2-1/2"); break; } + case WIN_FLAT_BLACK: { end_game(line,"0-F"); break; } + case WIN_FLAT_WHITE: { end_game(line,"F-0"); break; } + case WIN_ROAD_BLACK: { end_game(line,"0-R"); break; } + case WIN_ROAD_WHITE: { end_game(line,"R-0"); break; } + } } - // A win - case WIN_DRAGON: { end_game(line,"R-R"); break; } - case WIN_DRAW: { end_game(line,"1/2-1/2"); break; } - case WIN_FLAT_BLACK: { end_game(line,"0-F"); break; } - case WIN_FLAT_WHITE: { end_game(line,"F-0"); break; } - case WIN_ROAD_BLACK: { end_game(line,"0-R"); break; } - case WIN_ROAD_WHITE: { end_game(line,"R-0"); break; } + puts("Game over, enter `new' to play again."); + break; + } + // Valid, append to game log + case PTN_VALID: + case ACT_OK: { + append_to_gamelog(line, 0); + if (auto_info) print_info(); + if (auto_board) print_board(); + break; } } } @@ -226,7 +232,6 @@ handle_turn(char *line) { static void new_game(uint8_t size) { reset_state(size); - won = 0x00; printf("New %dx%d game!\n",size,size); if (gamelog) gamelog = realloc(gamelog, sizeof(char)); else gamelog = malloc(sizeof(char)); -- cgit v1.3.1