编写一个codeblocks的吃子,落子,禁手规则,判断胜负的双人对弈C语言围棋代码
时间: 2024-04-29 17:22:15 浏览: 36
以下是一个简单的双人对弈围棋代码,实现了吃子、落子、禁手规则和判断胜负:
```c
#include <stdio.h>
#define BOARD_SIZE 15
#define BLACK 'X'
#define WHITE 'O'
#define EMPTY '+'
char board[BOARD_SIZE][BOARD_SIZE];
void print_board() {
int i, j;
printf(" ");
for (i = 0; i < BOARD_SIZE; i++) {
printf("%d ", i);
}
printf("\n");
for (i = 0; i < BOARD_SIZE; i++) {
printf("%d ", i);
for (j = 0; j < BOARD_SIZE; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
int is_legal_move(int x, int y, char player) {
if (board[x][y] != EMPTY) {
return 0; // 非空点不能落子
}
board[x][y] = player;
int i, j;
int has_liberty = 0;
for (i = x - 1; i <= x + 1; i++) {
for (j = y - 1; j <= y + 1; j++) {
if (i == x && j == y) {
continue;
}
if (i >= 0 && i < BOARD_SIZE && j >= 0 && j < BOARD_SIZE && board[i][j] != EMPTY && board[i][j] != player) {
int liberties = 0;
if (i > 0 && board[i - 1][j] == EMPTY) {
liberties++;
}
if (i < BOARD_SIZE - 1 && board[i + 1][j] == EMPTY) {
liberties++;
}
if (j > 0 && board[i][j - 1] == EMPTY) {
liberties++;
}
if (j < BOARD_SIZE - 1 && board[i][j + 1] == EMPTY) {
liberties++;
}
if (liberties == 0) {
// 落子导致对手棋子无气,禁手
board[x][y] = EMPTY;
return 0;
}
has_liberty = 1;
}
}
}
if (!has_liberty) {
// 落子导致自身棋子无气,禁手
board[x][y] = EMPTY;
return 0;
}
return 1;
}
void make_move(int x, int y, char player) {
board[x][y] = player;
int i, j;
for (i = x - 1; i <= x + 1; i++) {
for (j = y - 1; j <= y + 1; j++) {
if (i == x && j == y) {
continue;
}
if (i >= 0 && i < BOARD_SIZE && j >= 0 && j < BOARD_SIZE && board[i][j] != EMPTY && board[i][j] != player) {
int liberties = 0;
if (i > 0 && board[i - 1][j] == EMPTY) {
liberties++;
}
if (i < BOARD_SIZE - 1 && board[i + 1][j] == EMPTY) {
liberties++;
}
if (j > 0 && board[i][j - 1] == EMPTY) {
liberties++;
}
if (j < BOARD_SIZE - 1 && board[i][j + 1] == EMPTY) {
liberties++;
}
if (liberties == 0) {
// 吃掉对手棋子
board[i][j] = EMPTY;
}
}
}
}
}
int is_game_over() {
int i, j;
int black_has_liberty = 0, white_has_liberty = 0;
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == BLACK) {
if (i > 0 && board[i - 1][j] == EMPTY || i < BOARD_SIZE - 1 && board[i + 1][j] == EMPTY ||
j > 0 && board[i][j - 1] == EMPTY || j < BOARD_SIZE - 1 && board[i][j + 1] == EMPTY) {
black_has_liberty = 1;
}
} else if (board[i][j] == WHITE) {
if (i > 0 && board[i - 1][j] == EMPTY || i < BOARD_SIZE - 1 && board[i + 1][j] == EMPTY ||
j > 0 && board[i][j - 1] == EMPTY || j < BOARD_SIZE - 1 && board[i][j + 1] == EMPTY) {
white_has_liberty = 1;
}
}
}
}
if (!black_has_liberty || !white_has_liberty) {
return 1;
}
return 0;
}
int main() {
int x, y;
char player = BLACK;
int pass_count = 0;
int black_score = 0, white_score = 0;
int i, j;
// 初始化棋盘
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
board[i][j] = EMPTY;
}
}
// 开始对弈
while (!is_game_over()) {
print_board();
printf("Player %c's turn.\n", player);
printf("Please input the coordinate of your move (x, y): ");
scanf("%d %d", &x, &y);
if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE) {
printf("Invalid move! Please input again.\n");
continue;
}
if (is_legal_move(x, y, player)) {
make_move(x, y, player);
pass_count = 0;
} else {
printf("Invalid move! Please input again.\n");
continue;
}
// 切换玩家
player = (player == BLACK) ? WHITE : BLACK;
}
// 计算分数
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == BLACK) {
black_score++;
} else if (board[i][j] == WHITE) {
white_score++;
}
}
}
// 输出结果
print_board();
if (black_score > white_score) {
printf("Black wins!\n");
} else if (white_score > black_score) {
printf("White wins!\n");
} else {
printf("Draw game!\n");
}
return 0;
}
```
注意,这份代码实现的规则并不完整,例如未考虑超级禁手等特殊规则。在实际应用中,应该根据需求进行修改。
阅读全文
相关推荐










