tictactoe

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 7d8009aecfd298c86419f3e99249f9f08bc90e83
parent fe0f1f2cb5e0ae8e5656ce2e3136c392abcfed8b
Author: Wilson Gheen <wilson@wilsonrgheen.com>
Date:   Sat, 17 Dec 2022 15:11:27 -0600

Fix issue in get_near_wins that ignored some winning moves, and change name

Diffstat:
Mtictactoe.h | 73+++++++++++++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 45 insertions(+), 28 deletions(-)

diff --git a/tictactoe.h b/tictactoe.h @@ -13,8 +13,8 @@ #define scase(s1, s2) if (!strcmp(s1, s2)) /*typedef void (*board_fn)(char *, char);*/ -static char the_desired_board[32]; -static int srand_seeded = 0; +static char the_desired_board[32]; +static _Bool srand_seeded = 0; static int get_rand(int max_excl) { if (!srand_seeded) { @@ -23,35 +23,52 @@ static int get_rand(int max_excl) { } return rand() % max_excl; } -char get_near_wins(char *b, char *winning_moves) { +char get_winner_or_winning_moves(char *b, char *winning_moves) { char center = b[4]; - for(int i=-4; center != ' ' && i < 0; i++) { - int s2 = 4+i; - int s3 = 4-i; - if(b[s2] == center && b[s3] == center) - return center; + _Bool add_to_wm = 0; + for(int i=-4; i < 0; i++) { + int sq1 = 4+i; + int sq3 = 4-i; + if(b[sq1] == b[sq3] && b[sq1] != ' ') { + if(b[sq1] == center) + return center; + if(center == ' ') + add_to_wm = 1; + } if(winning_moves == NULL) continue; - if(b[s2] == center || b[s3] == center) { - if(b[s2] == ' ') - winning_moves[s2] = center; - else if(b[s3] == ' ') - winning_moves[s3] = center; + if(add_to_wm) { + winning_moves[i] = b[sq1]; + add_to_wm = 0; + } + else if(center == ' ') continue; + else if((b[sq1] == center) ^ (b[sq3] == center)) { + if(b[sq1] == ' ') + winning_moves[sq1] = center; + else if(b[sq3] == ' ') + winning_moves[sq3] = center; } } for(int i=1; i <= 7; i+=2){ - if(b[i] == ' ') continue; int distance = ((i+1) & 4) ? 3 : 1; - int s2 = i - distance; - int s3 = i + distance; - if(b[s2] == b[i] && b[s3] == b[i]) { - return b[i]; + int sq1 = i - distance; + int sq3 = i + distance; + if(b[sq1] == b[sq3] && b[sq1] != ' ') { + if(b[sq1] == b[i]) + return b[i]; + if(b[i] == ' ') + add_to_wm = 1; } if(winning_moves == NULL) continue; - if(b[s2] == b[i] || b[s3] == b[i]) { - if(b[s2] == ' ') - winning_moves[s2] = b[i]; - else if(b[s3] == ' ') - winning_moves[s3] = b[i]; + if(add_to_wm) { + winning_moves[i] = b[sq1]; + add_to_wm = 0; + } + else if(b[i] == ' ') continue; + else if((b[sq1] == b[i]) ^ (b[sq3] == b[i])) { + if(b[sq1] == ' ') + winning_moves[sq1] = b[i]; + else if(b[sq3] == ' ') + winning_moves[sq3] = b[i]; } } return 0; @@ -79,7 +96,7 @@ char get_move_preset_board(char *board, char player) { for(int i=0; i < 9; i++) { if(desired_board[i] == player && board[i] == ' ') { board[i] = player; - return get_near_wins(board, NULL); + return get_winner_or_winning_moves(board, NULL); } } return 0; @@ -90,7 +107,7 @@ char get_move_from_human(char *board, char player) { tb_present(); scanf("%d", &n); board[n-1] = player; - return get_near_wins(board, NULL); + return get_winner_or_winning_moves(board, NULL); } char get_random_move(char *board, char player) { int legal_moves[9]; @@ -99,13 +116,13 @@ char get_random_move(char *board, char player) { if(board[i] == ' ') legal_moves[lm_ind++] = i; board[legal_moves[get_rand(lm_ind)]] = player; - return get_near_wins(board, NULL); + return get_winner_or_winning_moves(board, NULL); } char get_winning_move_else_random(char *board, char player) { - char winning_moves[9] = {0}; + char winning_moves[9] = ""; int my_winning_moves[5]; int mwm_ind = 0; - get_near_wins(board, winning_moves); + get_winner_or_winning_moves(board, winning_moves); for(int i=0; i < 9; i++) if(winning_moves[i] == player) my_winning_moves[mwm_ind++] = i;