コミットを比較

...

2 コミット

作成者 SHA1 メッセージ 日付
ninya9k debfe59b18 Merge remote-tracking branch 'refs/remotes/origin/ai' into ai 2023-11-16 06:26:05 +00:00
ninya9k 1693d5d074 ninya ai mod 2023-11-16 06:25:24 +00:00
1個のファイルの変更65行の追加12行の削除

77
uttt.c
ファイルの表示

@ -779,27 +779,80 @@ int main(int argc, char **argv) {
int ut_boardValue(const char *tiles, int offset, int stride) int ut_boardValue(const char *tiles, int offset, int stride)
{ {
int v = 0; // could change this too..
int value = 0;
for(int r = 0; r < 3; r++) for(int r = 0; r < 3; r++)
for(int c = 0; c < 3; c++) for(int c = 0; c < 3; c++)
v += (T(r, c) == 'X') ? 1 : (T(r, c) == 'O') ? -1 : 0; value += (T(r, c) == 'X') ? 1 : (T(r, c) == 'O') ? -1 : 0;
return v; return value;
} }
#define UT_VALUEMAX 81 #define UT_VALUEMAX 81 * 2
#define UT_VALUEMIN (-81) #define UT_VALUEMIN (-81 * 2)
int ut_value(const struct ut_state *state) int ut_value(const struct ut_state *state)
{ {
int v = 0; int value = 0;
// game is won
char winner = ut_winner(state); char winner = ut_winner(state);
if(winner != '\0') if(winner != '\0')
{ {
return (winner == 'X') ? 81 : (winner == 'O') ? -81 : 0; return (winner == 'X') ? 81 * 2 : (winner == 'O') ? -81 * 2 : 0;
} }
for(int r = 0; r < 3; r++)
for(int c = 0; c < 3; c++) // weight each board: 2x if taken, 2x if blank but would lead to a 2-of-3
v += (state->boards[r][c] == '\0') ? ut_boardValue((char *)state->tiles, 27 * r + 3 * c, 9) : // line (for X or O), 1x otherwise
(state->boards[r][c] == 'X') ? 9 : (state->boards[r][c] == 'O') ? -9 : 0; char importance[3][3] = {1};
return v; for(int r = 0; r < 3; r++) {
for(int c = 0; c < 3; c++) {
char board = state->boards[r][c];
if (board == '\0') {
char b1, b2;
// horizontal
b1 = state->boards[r][(c+1)%3];
b2 = state->boards[r][(c+2)%3];
if (b2 < b1) { char tmp = b1; b1 = b2; b2 = tmp; }
if (b1 == '\0' && b2 != '\0') importance[r][c] = 2;
// vertical
b1 = state->boards[(r+1)%3][c];
b2 = state->boards[(r+2)%3][c];
if (b2 < b1) { char tmp = b1; b1 = b2; b2 = tmp; }
if (b1 == '\0' && b2 != '\0') importance[r][c] = 2;
// diagonals
if (r == c) {
b1 = state->boards[(r+1)%3][(c+1)%3];
b2 = state->boards[(r+2)%3][(c+2)%3];
if (b2 < b1) { char tmp = b1; b1 = b2; b2 = tmp; }
if (b1 == '\0' && b2 != '\0') importance[r][c] = 2;
}
if (r == 2 - c) {
b1 = state->boards[(r+1)%3][(c+2)%3];
b2 = state->boards[(r+2)%3][(c+1)%3];
if (b2 < b1) { char tmp = b1; b1 = b2; b2 = tmp; }
if (b1 == '\0' && b2 != '\0') importance[r][c] = 2;
}
}
else if (board == 'X') importance[r][c] = 2;
else if (board == 'O') importance[r][c] = 2;
}
}
// game is in progress
for(int r = 0; r < 3; r++) {
for(int c = 0; c < 3; c++) {
char board = state->boards[r][c];
int board_value;
if (board == '\0') {
// board is in progress
board_value = ut_boardValue((char *)state->tiles, 27 * r + 3 * c, 9);
} else {
// board is won
board_value = (board == 'X') ? 9 : (board == 'O') ? -9 : 0;
}
value += board_value * importance[r][c];
}
}
return value;
} }
int ut_alphabetaq(const struct ut_state *state, struct ut_move move, int depth, int a, int b) int ut_alphabetaq(const struct ut_state *state, struct ut_move move, int depth, int a, int b)