C语言实现三子棋:模块化设计与完整代码解析
本文详细解析如何利用C语言模块化结构实现三子棋游戏。通过分离头文件、逻辑实现与测试主程序,清晰展示从菜单构建、棋盘绘制、用户输入处理到胜负判定的完整开发流程。
项目架构与模块划分
为了保证代码的可读性与可维护性,我们将三子棋游戏拆分为三个核心部分:
test.c:负责程序的入口、游戏菜单控制及主循环。game.c:包含所有游戏逻辑的具体实现,如棋盘操作、落子等。game.h:作为公共头文件,声明函数原型及宏定义(行列大小),供上述两个源文件引用。
第1步:创建游戏菜单
目的:提供“进入游戏”与“退出游戏”的选择界面,并支持重复游玩。
关键逻辑:使用 do...while 循环确保至少执行一次,并通过 switch 语句分发用户指令。
在 test.c 中实现菜单:
void menu()
{
printf("************************\n");
printf("****** 1.play ********\n");
printf("****** 0.exit ********\n");
printf("************************\n");
}
void test()
{
int input;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game(); // 调用游戏主体函数
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入>:\n");
break;
}
} while (input); // 输入非0则继续
核心游戏功能实现
第2步:棋盘初始化与宏定义优化
参数:字符型二维数组 board[ROW][COL]。
动作:将数组元素全部初始化为空格。
在 game.h 中使用宏定义行列数以方便修改棋盘大小:
#define ROW 3
#define COL 3
// 函数声明
void initboard(char board[ROW][COL], int row, int col);
在 game.c 中的实现:
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] = ' ';
}
}
第3步:打印棋盘可视化界面
视觉结构:数据行打印棋子或空格,行间插入分割线(| 与 ---)。
图片示意:最终的网格输出格式见下图。
// game.c 打印逻辑片段
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
printf(" %c ", board[i][j]); // 打印数据
printf("\n");
if (i < row - 1) // 最后一行不画底线
{
for (j = 0; j < col; j++)
printf("---"); // 打印横杠
printf("\n");
}
}
第4步:玩家输入与合法性校验
规则:
1. 坐标范围必须在 [1, ROW] 之间(对应数组下标为 0 ~ ROW-1)。
2. 指定位置必须为空(值为 ' '),否则提示重试。
void play_move(char board[ROW][COL], int row, int col)
{
int x, y;
while (1)
{
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");
}
}
第5步:电脑对手策略
方法:简单的随机算法。
实现:利用 rand() 生成 0 ~ ROW-1 之间的随机索引,直到找到空位。
#include <stdlib.h>
#include <time.h>
// 需在 main 附近调用 srand((unsigned int)time(NULL));
void computer_move(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % ROW;
int y = rand() % COL;
if (board[x][y] == ' ')
{
board[x][y] = '#'; // '#'代表电脑
break;
}
}
}
第6步:胜负判定逻辑(平局/赢/继续)
判断顺序:
1. 检查玩家是否获胜(同行/列/对角线符号一致)。
2. 检查电脑是否获胜。
3. 若未分胜负,检查棋盘是否已满(平局标记 'Q')。
4. 若以上均不满足,返回 'C'(Continue)继续游戏。
返回值约定:'*'(玩家胜)、'#'(电脑胜)、'Q'(平局)、'C'(继续)。


整合运行结果
在主循环中交替调用玩家与电脑的下棋函数,并在每次行动后通过 is_win 函数获取状态。若状态不是 'C',则跳出内部循环,由 test.c 打印最终输赢结果并返回菜单选择是否重开。
以上就是C语言实现三子棋游戏的详细内容,更多关于C语言游戏开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









