五子棋实现悔棋功能的C语言代码示例

以下是一个使用 C 语言实现悔棋功能的简单五子棋游戏代码示例。该代码使用控制台进行输入和输出,并实现了基本的悔棋功能。代码中用数字 1 表示黑子,数字 2 表示白子。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define BOARD_SIZE 15
#define BLACK_STONE 1
#define WHITE_STONE 2

int board[BOARD_SIZE][BOARD_SIZE];

void init_board() {
    for (int i = 0; i < BOARD_SIZE; i++) {
        for (int j = 0; j < BOARD_SIZE; j++) {
            board[i][j] = 0;
        }
    }
}

void print_board() {
    printf("  ");
    for (int i = 0; i < BOARD_SIZE; i++) {
        printf("%d ", i + 1);
    }
    printf("\n");
    for (int i = 0; i < BOARD_SIZE; i++) {
        printf("%c ", 'a' + i);
        for (int j = 0; j < BOARD_SIZE; j++) {
            if (board[i][j] == BLACK_STONE) {
                printf("x ");
            } else if (board[i][j] == WHITE_STONE) {
                printf("o ");
            } else {
                printf(". ");
            }
        }
        printf("\n");
    }
}

bool check_win(int x, int y) {
    int i, j;
    int count = 1;
    // 检查横向
    for (i = y - 1; i >= 0 && board[x][i] == board[x][y]; i--, count++);
    for (i = y + 1; i < BOARD_SIZE && board[x][i] == board[x][y]; i++, count++);
    if (count >= 5) return true;

    // 检查纵向
    count = 1;
    for (i = x - 1; i >= 0 && board[i][y] == board[x][y]; i--, count++);
    for (i = x + 1; i < BOARD_SIZE && board[i][y] == board[x][y]; i++, count++);
    if (count >= 5) return true;

    // 检查左上到右下
    count = 1;
    for (i = x - 1, j = y - 1; i >= 0 && j >= 0 && board[i][j] == board[x][y]; i--, j--, count++);
    for (i = x + 1, j = y + 1; i < BOARD_SIZE && j < BOARD_SIZE && board[i][j] == board[x][y]; i++, j++, count++);
    if (count >= 5) return true;

    // 检查左下到右上
    count = 1;
    for (i = x + 1, j = y - 1; i < BOARD_SIZE && j >= 0 && board[i][j] == board[x][y]; i++, j--, count++);
    for (i = x - 1, j = y + 1; i >= 0 && j < BOARD_SIZE && board[i][j] == board[x][y]; i--, j++, count++);
    if (count >= 5) return true;

    return false;
}

bool check_valid(int x, int y)
// 检查落子是否合法
if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE) {
return false; // 落子在棋盘外
}
if (board[x][y] != 0) {
return false; // 此位置已有棋子
}
return true;
}

void player_move(int stone) {
printf("请落子,例如输入 c3 表示落子在第3列第3行(从a1开始)\n");
char input[10];
int x, y;
while (true) {
printf("轮到 %s 落子:", stone == BLACK_STONE ? "黑子" : "白子");
scanf("%s", input);
x = input[0] - 'a';
y = input[1] - '1';
if (check_valid(x, y)) {
board[x][y] = stone;
break;
} else {
printf("无效的落子位置,请重新输入\n");
}
}
}

void computer_move(int stone) {
printf("轮到电脑落子:\n");
// 这里简单地随机生成一个可落子的位置
int x, y;
do {
x = rand() % BOARD_SIZE;
y = rand() % BOARD_SIZE;
} while (!check_valid(x, y));
printf("电脑落子在 %c%d\n", 'a' + x, y + 1);
board[x][y] = stone;
}

void undo_move(int stone) {
printf("悔棋功能:\n");
// TODO: 实现悔棋功能,将最后一个落子清空
}

int main() {
init_board();
print_board();

int current_player = BLACK_STONE;
while (true) {
    if (current_player == BLACK_STONE) {
        player_move(BLACK_STONE);
    } else {
        computer_move(WHITE_STONE);
    }


    print_board();


    if (check_win(x, y)) {
        printf("%s获胜\n", current_player == BLACK_STONE ? "黑子" : "白子");
        break;
    }


    if (current_player == BLACK_STONE) {
        current_player = WHITE_STONE;
    } else {
        current_player = BLACK_STONE;
    }
}


return 0;

注意,该代码中的悔棋功能还未实现,需要根据具体需求进行补充完善。