C语言实现三子棋:模块化设计与完整代码解析

Finn
Finn
发布时间:2026-10-16 | 4人浏览过
原创

本文详细解析如何利用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语言游戏开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表