#include "zf_common_headfile.h"
//#include <stdio.h>
//#include <string.h>
//#include <limits.h>
Board board={{3,3,3},
{3,3,3},
{3,3,3},};
int row=-1;
int col=-1;
int computer = 1;
int player = 0;
// 检查是否赢了
int check_win(Board board, int player) {
// 检查行和列
for (int i = 0; i < SIZE; i++) {
int row_win = 1, col_win = 1;
for (int j = 0; j < SIZE; j++) {
if (board[i][j]!= player) row_win = 0;
if (board[j][i]!= player) col_win = 0;
}
if (row_win || col_win) return 1;
}
// 检查对角线
int diag_win = 1, anti_diag_win = 1;
for (int i = 0; i < SIZE; i++) {
if (board[i][i]!= player) diag_win = 0;
if (board[i][SIZE - 1 - i]!= player) anti_diag_win = 0;
}
return diag_win || anti_diag_win;
}
// 检查是否平局
int check_draw(Board board) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (board[i][j] == 3) return 0;
}
}
return 1;
}
// 最小最大算法
int minimax(Board board, int depth, int is_maximizing) {
if (check_win(board, computer)) return 10 - depth;
if (check_win(board, player)) return depth - 10;
if (check_draw(board)) return 0;
if (is_maximizing) {
int best_score = INT_MIN;
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (board[i][j] == 3) {
board[i][j] = computer;
int score = minimax(board, depth + 1, 0);
board[i][j] = 3;
if (score > best_score) best_score = score;
}
}
}
return best_score;
} else {
int best_score = INT_MAX;
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (board[i][j] == 3) {
board[i][j] = player;
int score = minimax(board, depth + 1, 1);
board[i][j] = 3;
if (score < best_score) best_score = score;
}
}
}
return best_score;
}
}
// 计算机移动
void computer_move(Board board, int *row, int *col) {
int best_score = INT_MIN;
*row = -1;
*col = -1;
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (board[i][j] == 3) {
board[i][j] = 1;
int score = minimax(board, 1, 0);
board[i][j] = 3;
if (score > best_score) {
best_score = score;
*row = i;
*col = j;
}
}
}
}
}
// 新增函数:检查玩家是否变动 1 个棋子位置,并返回变动棋子的原坐标和变动后的坐标
void check_player_move(Board prev_board, Board curr_board, int *prev_row, int *prev_col, int *curr_row, int *curr_col) {
int found_move = 0;
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (prev_board[i][j]!= curr_board[i][j]) {
if (found_move == 0) {
*prev_row = i;
*prev_col = j;
found_move = 1;
} else {
printf("玩家变动了多个棋子位置,不符合规则!\n");
return;
}
}
}
}
if (found_move) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (prev_board[i][j]!= curr_board[i][j]) {
*curr_row = i;
*curr_col = j;
}
}
}
} else {
printf("玩家未变动棋子位置!\n");
}
}