使用C语言实现可扩展的多子棋游戏
项目概述
本项目基于C语言构建一个可配置的棋类游戏框架,支持三子棋、四子棋乃至任意尺寸的连珠式对弈。通过模块化设计,将核心逻辑与主控流程分离,便于后续功能拓展和维护。
代码结构设计
采用标准三文件架构,提升代码可读性与协作效率:
test.c:负责用户交互与游戏流程控制。game.c:实现所有游戏规则与算法逻辑。game.h:声明接口函数及全局常量。
核心功能实现
棋盘初始化
使用二维字符数组模拟棋盘,初始状态全部填充为空格(' '),并通过宏定义灵活控制棋盘大小。
void InitializeBoard(char board[ROW][COL], int rows, int cols) {
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
board[i][j] = ' ';
}
棋盘可视化输出
动态生成带分隔线的网格布局,每行数据间用竖线连接,行之间添加横线分隔,增强视觉清晰度。
void RenderBoard(const char board[ROW][COL], int rows, int cols) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
printf(" %c ", board[i][j]);
if (j < cols - 1) printf("|");
}
printf("\n");
if (i < rows - 1) {
for (int k = 0; k < cols; ++k) {
printf("---");
if (k < cols - 1) printf("|");
}
}
printf("\n");
}
}
玩家落子处理
接收用户输入的行列坐标(从1开始),转换为数组索引,并验证位置有效性与是否已被占据。
void MakePlayerMove(char board[ROW][COL], int rows, int cols) {
int row, col;
while (1) {
printf("请输入落子位置(行 列): ");
scanf("%d %d", &row, &col);
if (row > 0 && row <= rows && col > 0 && col <= cols) {
if (board[row-1][col-1] == ' ') {
board[row-1][col-1] = '*';
break;
} else {
printf("该位置已有棋子,请重新输入。\n");
}
} else {
printf("坐标超出范围,请重新输入。\n");
}
}
}
AI自动走棋
利用随机数生成器在空位中选择一个有效位置,确保电脑不会重复下在同一格。
void MakeAIMove(char board[ROW][COL], int rows, int cols) {
while (1) {
int x = rand() % rows;
int y = rand() % cols;
if (board[x][y] == ' ') {
board[x][y] = '#';
break;
}
}
}
胜负判定机制
游戏状态返回值用于统一判断结果,提高代码复用性:
'*':玩家胜利'#':AI胜利'Q':棋盘填满,平局'A':游戏继续
行与列检测
逐行/列扫描,统计连续相同非空格的数量,若达到目标长度则判定为胜。
for (int i = 0; i < rows; ++i) {
int count = 0;
for (int j = 0; j < cols - 1; ++j)
if (board[i][j] == board[i][j+1] && board[i][j] != ' ')
count++;
if (count == cols - 1) return board[i][0];
}
对角线检测
分别检查主对角线(左上→右下)与副对角线(右上→左下)的连贯性。
// 主对角线
int diag1 = 0;
for (int i = 0; i < rows - 1; ++i)
if (board[i][i] == board[i+1][i+1] && board[i][i] != ' ')
diag1++;
if (diag1 == rows - 1) return board[0][0];
// 副对角线
int diag2 = 0;
for (int i = 0; i < rows - 1; ++i)
if (board[i][cols-1-i] == board[i+1][cols-2-i] && board[i][cols-1-i] != ' ')
diag2++;
if (diag2 == rows - 1) return board[0][cols-1];
平局判断
遍历整个棋盘,只要有空格即未结束。
int IsBoardFull(const char board[ROW][COL], int rows, int cols) {
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
if (board[i][j] == ' ') return 0;
return 1;
}
完整程序入口
主循环持续展示菜单,根据用户选择启动或退出游戏。
int main() {
srand(time(NULL));
int choice;
do {
printf("=== 棋类游戏 ===\n");
printf("1. 开始游戏\n");
printf("0. 退出\n");
printf("请选择: ");
scanf("%d", &choice);
switch (choice) {
case 1: PlayGame(); break;
case 0: printf("感谢游玩!\n"); break;
default: printf("无效输入,请重试。\n"); break;
}
} while (choice == 1);
return 0;
}
配置与扩展说明
只需修改头文件中的宏定义即可轻松适配不同玩法:
#define ROW 4
#define COL 4
当设置为4×4时,游戏变为"四子棋",满足连续四个同色棋子即获胜。