编写一个codeblocks的吃子,落子,禁手规则,判断胜负的双人对弈C语言围棋代码
时间: 2024-05-06 16:18:53 浏览: 13
以下是一个基本的双人对弈围棋代码,包含吃子、落子、禁手规则和判断胜负:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BOARD_SIZE 9 // 棋盘大小
// 定义棋盘格子状态
#define EMPTY 0
#define BLACK 1
#define WHITE 2
// 定义禁手状态
#define NO_KO 0
#define BLACK_KO 1
#define WHITE_KO 2
int board[BOARD_SIZE][BOARD_SIZE]; // 棋盘数组
int ko; // 禁手状态
// 初始化棋盘
void init_board() {
int i, j;
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
board[i][j] = EMPTY;
}
}
ko = NO_KO;
}
// 显示棋盘
void print_board() {
int i, j;
printf(" ");
for (i = 0; i < BOARD_SIZE; i++) {
printf("%c ", 'A' + i);
}
printf("\n");
for (i = 0; i < BOARD_SIZE; i++) {
printf("%2d ", i + 1);
for (j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == EMPTY) {
printf(". ");
} else if (board[i][j] == BLACK) {
printf("X ");
} else {
printf("O ");
}
}
printf("\n");
}
}
// 判断是否是合法坐标
int is_valid_coord(int i, int j) {
return i >= 0 && i < BOARD_SIZE && j >= 0 && j < BOARD_SIZE;
}
// 判断是否是空格子
int is_empty(int i, int j) {
return board[i][j] == EMPTY;
}
// 判断是否可以落子
int is_legal_move(int color, int i, int j) {
if (!is_valid_coord(i, j) || !is_empty(i, j)) {
return 0;
}
// 模拟落子
board[i][j] = color;
// 判断是否有气
int has_liberty = 0;
if (is_valid_coord(i - 1, j) && is_empty(i - 1, j)) {
has_liberty = 1;
} else if (is_valid_coord(i + 1, j) && is_empty(i + 1, j)) {
has_liberty = 1;
} else if (is_valid_coord(i, j - 1) && is_empty(i, j - 1)) {
has_liberty = 1;
} else if (is_valid_coord(i, j + 1) && is_empty(i, j + 1)) {
has_liberty = 1;
}
// 恢复棋盘状态
board[i][j] = EMPTY;
return has_liberty;
}
// 判断是否是禁手
int is_ko(int color, int i, int j) {
if (ko == BLACK_KO && color == BLACK && i == ko / BOARD_SIZE && j == ko % BOARD_SIZE) {
return 1;
} else if (ko == WHITE_KO && color == WHITE && i == ko / BOARD_SIZE && j == ko % BOARD_SIZE) {
return 1;
}
return 0;
}
// 落子
int make_move(int color, int i, int j) {
if (!is_legal_move(color, i, j) || is_ko(color, i, j)) {
return 0;
}
// 模拟落子
board[i][j] = color;
// 判断是否有气
int has_liberty = 0;
if (is_valid_coord(i - 1, j) && is_empty(i - 1, j)) {
has_liberty = 1;
} else if (is_valid_coord(i + 1, j) && is_empty(i + 1, j)) {
has_liberty = 1;
} else if (is_valid_coord(i, j - 1) && is_empty(i, j - 1)) {
has_liberty = 1;
} else if (is_valid_coord(i, j + 1) && is_empty(i, j + 1)) {
has_liberty = 1;
}
if (!has_liberty) { // 判断是否被提子
board[i][j] = EMPTY;
return 0;
}
// 判断是否是打劫
if (is_ko(color, i, j)) {
board[i][j] = EMPTY;
return 0;
}
// 判断是否形成了眼
int eye = 1;
if (is_valid_coord(i - 1, j) && board[i - 1][j] != color) {
eye = 0;
} else if (is_valid_coord(i + 1, j) && board[i + 1][j] != color) {
eye = 0;
} else if (is_valid_coord(i, j - 1) && board[i][j - 1] != color) {
eye = 0;
} else if (is_valid_coord(i, j + 1) && board[i][j + 1] != color) {
eye = 0;
}
if (eye) { // 形成了眼
ko = NO_KO;
} else { // 没有形成眼,可能下一步会形成打劫
ko = i * BOARD_SIZE + j;
}
return 1;
}
// 判断是否有空格子
int has_empty() {
int i, j;
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == EMPTY) {
return 1;
}
}
}
return 0;
}
// 判断胜负
int get_winner() {
int i, j, color, has_liberty;
for (color = BLACK; color <= WHITE; color++) {
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == color) {
// 判断是否有气
has_liberty = 0;
if (is_valid_coord(i - 1, j) && is_empty(i - 1, j)) {
has_liberty = 1;
} else if (is_valid_coord(i + 1, j) && is_empty(i + 1, j)) {
has_liberty = 1;
} else if (is_valid_coord(i, j - 1) && is_empty(i, j - 1)) {
has_liberty = 1;
} else if (is_valid_coord(i, j + 1) && is_empty(i, j + 1)) {
has_liberty = 1;
}
if (has_liberty) {
return 0; // 未结束
}
}
}
}
}
// 没有空格子,对方胜利
return (color == BLACK) ? WHITE : BLACK;
}
int main() {
int i, j, color, winner;
init_board();
print_board();
while (has_empty()) {
color = (color == BLACK) ? WHITE : BLACK; // 切换下棋方
printf("%s's turn (X/O): ", (color == BLACK) ? "Black" : "White");
scanf("%d %d", &i, &j);
if (make_move(color, i - 1, j - 1)) { // 落子成功
print_board();
} else { // 落子失败
printf("Illegal move!\n");
}
winner = get_winner();
if (winner) { // 游戏结束
printf("%s wins!\n", (winner == BLACK) ? "Black" : "White");
break;
}
}
if (!winner) { // 平局
printf("Draw game!\n");
}
return 0;
}
```
你可以将其保存为一个名为 `go.c` 的文件,并在终端中编译并运行:
```
gcc go.c -o go
./go
```
然后按照提示落子即可。注意,这个代码中的输入格式是行号和列号,例如 `3 4` 表示第三行第四列。