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:
M | tictactoe.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;