#include <stdio.h>
#define BOARD_SIZE 15
#define EMPTY 0
#define PLAYER 1
#define COMPUTER 2
int board[BOARD_SIZE][BOARD_SIZE] = {0}; // 棋盘
int player_turn = 1; // 玩家先手
int turn_count = 0; // 落子次数
// 在控制台上显示棋盘
void display_board() {
printf("\n ");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%2d ", i + 1);
}
printf("\n");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%2d ", i + 1);
for (int j = 0; j < BOARD_SIZE; j++) {
switch (board[i][j]) {
case EMPTY:
printf(". ");
break;
case PLAYER:
printf("o ");
break;
case COMPUTER:
printf("x ");
break;
default:
break;
}
}
printf("\n");
}
}
// 检查当前位置是否可用
int is_valid_move(int row, int col) {
if (row < 0 || row >= BOARD_SIZE || col < 0 || col >= BOARD_SIZE) {
return 0;
}
if (board[row][col] != EMPTY) {
return 0;
}
return 1;
}
// 玩家落子
void player_move() {
int row, col;
do {
printf("请输入您的落子位置坐标,格式为 \"行 列\":");
scanf("%d %d", &row, &col);
row--;
col--;
if (!is_valid_move(row, col)) {
printf("位置不合法,请重新输入。\n");
}
} while (!is_valid_move(row, col));
board[row][col] = PLAYER;
turn_count++;
}
// 电脑落子
void computer_move() {
int row, col;
// 简单的电脑落子策略:找到第一个空位落子
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == EMPTY) {
row = i;
col = j;
break;
}
}
}
board[row][col] = COMPUTER;
turn_count++;
}
// 判断是否有玩家或电脑获胜
int check_win(int player) {
int i, j, count;
// 检查行
for (i = 0; i < BOARD_SIZE; i++) {
count = 0;
for (j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == player) {
count++;
if (count >= 5) {
return 1;
}
} else {
count = 0;
}
}
}
// 检查列
for (j = 0; j < BOARD_SIZE; j++) {
count = 0;
for (i = 0; i < BOARD_SIZE; i++) {
if (board[i][j] == player) {
count++;
if (count >= 5) {
return 1;
}
} else {
count = 0;
}
}
}
// 检查正对角线
for (i = 0; i < BOARD_SIZE - 4; i++) {
for (j = 0; j < BOARD_SIZE - 4; j++) {
count = 0;
for (int k = 0; k < 5; k++) {
if (board[i + k][j + k] == player) {
count++;
if (count >= 5) {
return 1;
}
} else {
count = 0;
}
}
}
}
// 检查反对角线
for (i = 0; i < BOARD_SIZE - 4; i++) {
for (j = BOARD_SIZE - 1; j >= 4; j--) {
count = 0;
for (int k = 0; k < 5; k++) {
if (board[i + k][j - k] == player) {
count++;
if (count >= 5) {
return 1;
}
} else {
count = 0;
}
}
}
}
return 0;
}
// 主函数
int main() {
printf("欢迎来到人机五子棋游戏!\n");
display_board();
while (1) {
if (player_turn) {
printf("请您落子(o):\n");
player_move();
} else {
printf("轮到电脑落子(x):\n");
computer_move();
}
display_board();
if (check_win(PLAYER)) {
printf("恭喜您获胜!\n");
break;
} else if (check_win(COMPUTER)) {
printf("很遗憾,您输了。\n");
break;
} else if (turn_count >= BOARD_SIZE * BOARD_SIZE) {
printf("平局。\n");
break;
}
player_turn = !player_turn;
}
return 0;
}