以下是一个使用 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;
注意,该代码中的悔棋功能还未实现,需要根据具体需求进行补充完善。
评论