void play_game() { char name[50]; printf("Hi!\n\nI am Z3TA.\n\nWhat's your name: "); scanf("%s", name); int play_first = 0; printf("\n\nDo you want to play first? 1 - Yes, 0 - No: "); scanf("%d", &play_first); printf("\n\n\nX: Z3TA\nO: %s\n\n\n",name); if(!play_first) { while(!board_full(board) && !check_win(board)) { computer_move(); printf("Z3TA just made a move...\n"); print_board(); if(board_full(board) || check_win(board)) { break; } player_move(); printf("%s just made a move...\n", name); print_board(); } } else { while(!board_full(board) && !check_win(board)) { player_move(); printf("%s just made a move...\n", name); print_board(); if(board_full(board) || check_win(board)) { break; } computer_move(); printf("Z3TA just made a move...\n"); print_board(); } } printf("\n\n------------------------------\n\n"); if(check_win(board) == 0) { printf("It's a DRAW!\n"); } else if(check_win(board) == 1) { printf("%s WON!\n", name); } else { printf("Z3TA WON!\n"); } printf("\n------------------------------\n"); }
int minimax(int b[3][3], int player) { int val = check_win(b); int i, j; int points = 25, move_points = 0; if(player == 1) points = -points; if(val || board_full(b)) { return val; } for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) { if(!b[i][j]) { if(player == -1) { b[i][j] = -1; move_points = minimax(b, 1); if(points > move_points) { points = move_points; } } else { b[i][j] = 1; move_points = minimax(b, -1); if(points < move_points) { points = move_points; } } b[i][j] = 0; } } } return points; }
int main(void) { int board[SIZE][SIZE] = { 0 }; int empty_spot[2]; // Ensure rand() returns random value. srand(time(NULL)); init_board(board); print_board(board); printf("Up: 'k' Down: 'j' Left: 'h' Right: 'l'\n"); while(1) { if (has_move_left(board)) { perform_user_action(board); if (!board_full(board)) add_tile(board); print_board(board); } else { print_board(board); printf("You're all done! Loading new game.\n"); init_board(board); } } }
static int alpha_beta(int field[][MAX_FIELD_ROWS], int x, int y, int depth, int alpha, int beta, int maximizing_player) { int done = FALSE; int their_longest = get_longest_line(x, y, game.settings.their_botid, field); int your_longest = get_longest_line(x, y, game.settings.your_botid, field); int last_player; int chldx; int chldy; int v; if (depth <= 0 || their_longest >= WIN_LENGTH || your_longest >= WIN_LENGTH) { if (maximizing_player) last_player = 2; else last_player = 1; if (their_longest >= WIN_LENGTH) return evaluate(game.settings.your_botid, game.settings.their_botid, x, y, last_player, field) + (ALPHABETA_LEVEL - depth); else if (your_longest >= WIN_LENGTH) return evaluate(game.settings.your_botid, game.settings.your_botid, x, y, last_player, field) - (ALPHABETA_LEVEL - depth); else return evaluate(game.settings.your_botid, 0, x, y, last_player, field) - (ALPHABETA_LEVEL - depth); } else if (board_full(game.round + ALPHABETA_LEVEL - depth)) return 0; if (maximizing_player) { v = INT_MIN; for (chldx = 0; chldx < game.settings.field_columns; ++chldx) { for (chldy = 0; chldy < game.settings.field_rows; ++chldy) { if (can_be_placed(chldx, chldy, field)) { field[chldx][chldy] = game.settings.your_botid; v = max(v, alpha_beta(field, chldx, chldy, depth - 1, alpha, beta, FALSE)); alpha = max(alpha, v); field[chldx][chldy] = 0; if (beta <= alpha) { done = TRUE; break; } } } if (done) break; } return v; } else { v = INT_MAX; for (chldx = 0; chldx < game.settings.field_columns; ++chldx) { for (chldy = 0; chldy < game.settings.field_rows; ++chldy) { if (can_be_placed(chldx, chldy, field)) { field[chldx][chldy] = game.settings.their_botid; v = min(v, alpha_beta(field, chldx, chldy, depth - 1, alpha, beta, TRUE)); beta = min(beta, v); field[chldx][chldy] = 0; if (beta <= alpha) { done = TRUE; break; } } } if (done) break; } return v; } }