C语言三子棋游戏实现:逻辑拆解与完整源码
本文展示了如何使用 C 语言实现经典的三子棋游戏,详细解析了从菜单交互、棋盘渲染到核心胜负判定逻辑的完整代码结构,帮助开发者快速掌握面向过程设计与二维数组应用。
游戏架构与模块划分
三子棋游戏的核心在于状态管理与规则判断。在 C 语言的面向过程编程模式下,通常将功能拆分为独立的函数模块以提高可读性。本项目主要包含以下核心功能:
- 交互层:负责游戏主菜单显示与输入处理。
- 状态层:负责棋盘的初始化、渲染打印,以及存储当前棋子分布。
- 逻辑层:包含玩家移动、电脑随机移动策略,以及行、列、对角线的胜负判定。
为了实现清晰的工程结构,通常创建一个头文件 game.h 用于声明接口,源文件用于具体实现。
核心数据结构与初始化
游戏地图本质上是一个固定大小的字符型二维数组。为了便于维护,建议使用宏定义行列尺寸。若需要修改为五子棋或其他规格,只需调整宏即可。
#define ROW 3
#define COL 3
// 定义棋盘类型
char board[ROW][COL];
在每局游戏开始前,必须对棋盘进行清空处理。初始化函数遍历数组,将每个元素重置为空格字符 ' ',确保起始状态纯净。
void InitBoard(char board[ROW][COL], int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
board[i][j] = ' ';
}
}
}
菜单交互与主控逻辑
游戏启动后,首先需要展示欢迎界面。简单的控制台交互可以通过 printf 输出文字,配合 switch-case 结构控制游戏流程(开始、重开、退出)。
void menu() {
printf("********************************\n");
printf("****** 1. Start Game ******\n");
printf("****** 0. Exit Game ******\n");
printf("********************************\n");
}主循环中,用户输入选项后执行对应动作。实际运行中,test() 函数通常会包裹在 do-while 循环中以支持多局游玩。
棋盘可视化与渲染
为了让二维数组在终端呈现出类似九宫格的视觉效果,打印函数需处理网格线。逻辑上,每一行由“字符+分隔符”组成,行与行之间也需要分隔线。
void DisplayBoard(char board[ROW][COL], int row, int col) {
for (int i = 0; i < row; i++) {
// 打印棋格内容
for (int j = 0; j < col; j++) {
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|" );
}
printf("\n");
// 打印行分隔线
if (i < row - 1) {
for (int k = 0; k < col; k++) {
printf("---");
if (k < col - 1)
printf("|");
}
printf("\n");
}
}
} 玩家与电脑的逻辑实现
第1步:玩家下棋
玩家通过键盘输入坐标 (x, y)。由于人类习惯从 1 开始计数,而数组索引从 0 开始,因此需要进行偏移量修正。同时需校验坐标合法性(未越界且该位置为空),无效输入应提示重试。
void PlayerMove(char board[ROW][COL], int row, int col) {
int x, y;
while(1) {
printf("请输入坐标(x,y): \n");
scanf("%d %d", &x, &y);
// 检查边界
if (x >= 1 && x <= row && y >= 1 && y <= col) {
// 检查是否已被占用
if (board[x-1][y-1] == ' ') {
board[x-1][y-1] = '*'; // 玩家标记
break;
} else {
printf("该位置已有棋子,请重新输入!\n");
}
} else {
printf("输入非法,请重新输入!\n");
}
}
}
第2步:电脑下棋
简易 AI 策略采用伪随机方式。调用 rand() 生成 0 到 row-1 之间的随机数作为坐标。若生成的点已被占用,则继续生成直到找到空位。
// 需在main入口处 srand(time(NULL)) 以生成不同序列
#include <time.h>
#include <stdlib.h>
void ComputerMove(char board[ROW][COL], int row, int col) {
printf("电脑思考中...\n");
while(1) {
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ') {
board[x][y] = '#'; // 电脑标记
break;
}
}
}
胜负判定机制
游戏结束条件包括:某一方连成三子、或棋盘满员平局。判定函数按优先级检查:
- 横向胜利:遍历每行,检查三个元素是否相等且非空。
- 纵向胜利:遍历每列,检查三个元素是否相等且非空。
- 对角线胜利:检查 (0,0)-(2,2) 和 (0,2)-(2,0) 两条对角线。
- 平局判断:若未分出胜负但棋盘无空格,返回平局标识。
- 游戏继续:以上均未满足,返回继续标识。
char IsWin(char board[ROW][COL], int row, int col) {
// 检查行
for (int i = 0; i < row; i++) {
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') {
return board[i][0];
}
}
// 检查列
for (int i = 0; i < col; i++) {
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') {
return board[0][i];
}
}
// 检查对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') {
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') {
return board[0][2];
}
// 检查平局
int full = 1;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] == ' ') {
full = 0;
break;
}
}
}
if (full) return 'Q'; // Draw
return 'C'; // Continue
}
以上就是用C语言实现三子棋游戏的详细内容,更多关于C语言小游戏开发技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









