#include <stdio.h>
#include <string.h>
#define ROW 15
#define COL 15
#define NUM 5
char board[ROW][COL]; // 棋盘
char current_player; // 当前玩家
// 初始化棋盘
void init_board() {
memset(board, ' ', sizeof(board)); // 将棋盘全部赋值为空格
board[ROW / 2][COL / 2] = 'O'; // 初始时白子先落子
current_player = 'X'; // 初始时黑子先落子
}
// 输入落子坐标
void input_pos(int *row, int *col) {
char c1, c2;
printf("%c's turn, please input a position: ", current_player);
scanf(" %c%c", &c1, &c2); // 输入棋子坐标
*row = c1 - 'A'; // 行坐标
*col = c2 - '1'; // 列坐标
}
// 检查输赢
int check_win(int row, int col) {
int i, j;
char c = board[row][col]; // 当前棋子
// 检查横向连续的棋子数
i = row;
j = col;
while (j > 0 && board[i][j - 1] == c) j--; // 向左搜索
int count = 0;
while (j < COL && board[i][j] == c) {
j++;
count++;
}
if (count >= NUM) return 1; // 如果横向连续的棋子数大于等于 NUM,则当前玩家获胜
// 检查纵向连续的棋子数
i = row;
j = col;
while (i > 0 && board[i - 1][j] == c) i--; // 向上搜索
count = 0;
while (i < ROW && board[i][j] == c) {
i++;
count++;
}
if (count >= NUM) return 1; // 如果纵向连续的棋子数大于等于 NUM,则当前玩家获胜
// 检查左上到右下的对角线上连续的棋子数
i = row;
j = col;
while (i > 0 && j > 0 && board[i - 1][j - 1] == c) {
i--;
j--;
}
count = 0;
while (i < ROW && j < COL && board[i][j] == c) {
i++;
j++;
count++;
}
if (count >= NUM) return 1; // 如果左上到右下的对角线上连续的棋子数大于等于 NUM,则当前玩家获胜
// 检查右上到左下的对角线上连续的棋子数
i = row;
j = col;
while (i > 0 && j < COL && board[i - 1][j + 1] == c) {
i--;
j++;
}
count = 0;
while (i < ROW && j >= 0 && board[i][j] == c) {
i++;
j--;
count++;
}
if (count >= NUM) return 1; // 如果右上到左下的对角线上连续的棋子数大于等于 NUM,则当前玩家获胜
return 0; // 如果以上四种情况都不满足,则没有玩家获胜
}
// 输出棋盘格局
void print_board() {
int i, j;
printf(" ");
for (i = 0; i < COL; i++) {
printf("%c ", '1' + i); // 输出列坐标
}
printf("\n");
for (i = 0; i < ROW; i++) {
printf("%c ", 'A' + i); // 输出行坐标
for (j = 0; j < COL; j++) {
printf("%c ", board[i][j]); // 输出棋子
}
printf("\n");
}
}
int main() {
int row, col;
init_board(); // 初始化棋盘
while (1) {
print_board(); // 输出棋盘格局
input_pos(&row, &col); // 输入落子坐标
board[row][col] = current_player; // 落子
if (check_win(row, col)) { // 检查输赢
printf("%c wins!\n", current_player);
break;
}
// 交换玩家
if (current_player == 'X') {
current_player = 'O';
} else {
current_player = 'X';
}
}
return 0;
}