《追逐胜利:编程之路上的三子棋游戏实践》

news2025/1/11 7:03:21

文章目录

  • 前言
  • 一、三子棋游戏规则
  • 二、步骤详解
    • 1.游戏菜单的实现
    • 2.棋盘的实现
      • 2.1 初始化棋盘
      • 2.2 打印棋盘
    • 3.游戏逻辑实现
      • 3.1 玩家下棋
      • 3.2 电脑下棋
    • 4.判断输赢
      • 4.1 win函数实现
    • 5.完整代码
  • 总结


前言

大家好!我是艾老虎尤!今天我很高兴来和大家分享我最近的一个项目——用C语言实现的三子棋小游戏。作为一个编程爱好者,我对游戏开发也比较感兴趣,而通过写这篇博客,我想向大家展示我在这个小游戏中的实践经验和收获,为了增加自己的描述和方便大家的理解,一些地方我也会画图为大家展示,话不多说,我们直接开始!


一、三子棋游戏规则

  1. 三子棋是一种在3x3的棋盘上进行的井字游戏。游戏开始时,棋盘上没有任何棋子。
  2. 两名玩家轮流执黑白棋子,黑子先行。
  3. 游戏过程中,每个玩家可以在空余的格子上放置自己的棋子。
  4. 每个玩家的目标是在棋盘上形成三颗自己的棋子连成一条线,可以是横向、纵向或对角线。
  5. 若某个玩家达成了连接三颗棋子的目标,则游戏结束,该玩家获胜。
  6. 若棋盘上的格子被填满且没有任何玩家成功连成一条线,则游戏以平局结束。

二、步骤详解

1.游戏菜单的实现

一个好的游戏菜单不光可以提高游戏的观赏性,更关键的是提示玩家如何开始游戏等等,所以我们第一步先把游戏菜单编辑出来,这一部分代码比较简单,我们只需要把游戏菜单打印在屏幕上,告知玩家选1的话就开始游戏,选0结束游戏,选其他的数字就提示他选择错误,先看代码。

代码如下:

#include<stdio.h>

void menu()
{
	printf("********************\n");
	printf("***  1.开始游戏  ***\n");
	printf("***  0.退出游戏  ***\n");
	printf("********************\n");

}

void test()
{
	int input = 0;//输入值
	do
	{
		menu();//打印菜单
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("实现游戏\n");
			break;
		case 0:
			printf("退出游戏成功!\n");
			break;
		default:
			printf("不好意思,选择错误,请重新选择!\n");
			break;
		}
	} while (input);
}

int main()
{
	test();//测试逻辑
	return 0;
}

这里我们使用test函数实现打印菜单和选择游戏开始的逻辑,我们再使用menu函数打印游戏的菜单,再利用do whileswith实现游戏开始的选择,这里非常巧妙地是input这个变量,它不但控制了do whiel和switch的表达式,还控制了switch的语句项,可以说一举三得。

效果展示:
在这里插入图片描述

2.棋盘的实现

在游戏的介绍中也说到过, 三子棋是一种在3x3的棋盘上进行的井字游戏,所以我们使用一个二维数组表示即可,刚好对应了棋盘上的九个位置,这时候我们就需要在上面代码中的case 1写一个函数game,我们将会在这个函数里面实现游戏。

代码如下:

void game()
{
	char arr[3][3];
}

为了方便,我们使用#define定义一个行ROW再定义一个列COL,它们的值为3。
然后我们就需要初始化棋盘,使里面的元素全部为空格,初始化后我们打印棋盘,看看效果。

#define ROW 3
#define COL 3

void game()
{
	char board[ROW][COL];
	//初始化棋盘全为空格
	init_board(board, ROW, COL);
	//打印棋盘
	print_board(board, ROW, COL);
}

2.1 初始化棋盘

初始化棋盘代码如下:

//初始化棋盘
void init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}


2.2 打印棋盘

当把棋盘初始化后,我们就可以打印棋盘了

打印棋盘代码如下:

//打印棋盘
void print_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

逻辑是这样没错,但是我们在这个函数之前把棋盘初始化成空格了,所以我们打印出来棋盘什么都看不见,下面我们就要来实现打印出,如下图
居中的图片
想要打印,有一个方法很简单,我们把它拆分以下,如下图

在这里插入图片描述
在这里插入图片描述
代码运行效果:

在这里插入图片描述

当我们实现完代码后,发现最后面的|多了,所以我们要对它额外进行判断,就是让它少打印一次。

修改后的代码:

//打印棋盘
void print_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j<col-1)
				printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

运行效果:
在这里插入图片描述


3.游戏逻辑实现

当棋盘部分设计好之后,我们就需要开始游戏逻辑的实现。

3.1 玩家下棋

假设游戏中玩家是先手,我们接下来写一个函数player_move(board, ROW, COL);来实现玩家下棋的动作。

首先我们需要一条指令提醒玩家可以开始下棋了,直接用printf即可
然后让玩家输入要下棋的坐标,因为我们程序员知道数组的下标是从0开始的,但是玩家不一定知道,如下图:
在这里插入图片描述
当玩家输入坐标时,我们还要判断坐标的合法性
判断的规则就是横坐标要大于等于1,小于等于3
纵坐标要大于等于1,小于等于3
只有这样,输入的坐标才有用
具体看下面的代码和注释

//玩家下棋
void player_move(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋\n");
	//死循环,防止坐标被占用和非法坐标
	while(1)
	{
		printf("请输入下棋位置坐标\n");
		int x = 0;
		int y = 0;
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
		{
			if (board[x - 1][y - 1] == ' ')//判断输入的坐标为不为空
			{
				board[x - 1][y - 1] = 'O';//玩家下棋用O表示
				break;//跳出循环
			}
			else
			{
				printf("该坐标被占用,请重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入!\n");
		}
	}
}

然后输入完我们再调用一下打印棋盘的函数

效果展示:
在这里插入图片描述
注意,我们这里把玩家下棋,打印棋盘的函数放到了while循环里面,让让它死循环


3.2 电脑下棋

假设游戏中电脑是后手,我们接下来写一个函数computer_move(board, ROW, COL);来实现带电脑下棋的动作。

电脑下棋的逻辑就是随机生成坐标,看下面代码和注释

//电脑下棋
void computer_move(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] = 'X';
			break;
		}
	}
}

效果展示
在这里插入图片描述
生成随机数的解释可以参考我的这篇文章:C语言实现猜数字小游戏


4.判断输赢

我们的逻辑是玩家下棋,下完了打印棋盘,然后电脑下棋,然后再打印棋盘

	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		//打印棋盘
		print_board(board, ROW, COL);
		//电脑下棋
		computer_move(board, ROW, COL);
		//打印棋盘
		print_board(board, ROW, COL);
	}

于是我们在玩家下完棋之后写一个判断输赢的函数win,在电脑下完棋之后再调用这个函数判断输赢,而判断输赢就是看横纵坐标和斜着的是不是三个相连,最后不光要判断输赢,还要看是玩家赢了还是电脑赢了,还是平局了,如果都不是,程序继续。
假设玩家赢了返回:O
电脑赢了返回:X
平局返回:Q
游戏继续返回:C

	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		//打印棋盘
		print_board(board, ROW, COL);
		//判断输赢
		ret = win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		//电脑下棋
		computer_move(board, ROW, COL);
		//打印棋盘
		print_board(board, ROW, COL);
		//判断输赢
		ret = win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret = 'O')
		printf("恭喜你!你赢了!\n");
	else if (ret = 'X')
		printf("电脑获胜,你失败了!\n");
	else if (ret = 'Q')
		printf("平局");
}

4.1 win函数实现

这里我们需要判断每一行和每一列,还有两个对角是不是三个是相同的元素。

//判断平局
int full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

//判断输赢
char win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//判断三行
	for (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 (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];
	}
	//平局
	if (full(board, row, col) == 1)
	{
		return 'Q';
	}
	//游戏继续
	return 'C';
}

5.完整代码

test.c

#include"game.h"

void menu()
{
	printf("********************\n");
	printf("***  1.开始游戏  ***\n");
	printf("***  0.退出游戏  ***\n");
	printf("********************\n");

}

void game()
{
	char ret = 0;
	char board[ROW][COL];
	//初始化棋盘全为空格
	init_board(board, ROW, COL);
	//打印棋盘
	print_board(board, ROW, COL);

	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		//打印棋盘
		print_board(board, ROW, COL);
		//判断输赢
		ret = win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		//电脑下棋
		computer_move(board, ROW, COL);
		//打印棋盘
		print_board(board, ROW, COL);
		//判断输赢
		ret = win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret = 'O')
		printf("恭喜你!你赢了!\n");
	else if (ret = 'X')
		printf("电脑获胜,你失败了!\n");
	else if (ret = 'Q')
		printf("平局");
}


void test()
{
	srand((unsigned int)time(NULL));
	int input = 0;//输入值
	do
	{
		menu();//打印菜单
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 2:
			printf("退出游戏成功!\n");
			break;
		default:
			printf("不好意思,选择错误,请重新选择!\n");
			break;
		}
	} while (input);
}

int main()
{
	test();//测试逻辑
	return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

//函数的实现

//初始化棋盘
void init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//打印棋盘
void print_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j<col-1)
				printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

//玩家下棋
void player_move(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋\n");
	//死循环,防止坐标被占用和非法坐标
	while(1)
	{
		printf("请输入下棋位置坐标\n");
		int x = 0;
		int y = 0;
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = 'O';
				break;
			}
			else
			{
				printf("该坐标被占用,请重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入!\n");
		}
	}
}

//电脑下棋
void computer_move(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] = 'X';
			break;
		}
	}
}

//判断平局
int full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

//判断输赢
char win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//判断三行
	for (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 (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];
	}
	//平局
	if (full(board, row, col) == 1)
	{
		return 'Q';
	}
	//游戏继续
	return 'C';
}

game.h

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 3
#define COL 3

//函数的声名

//初始化
void init_board(char board[ROW][COL], int row,int col);

//打印棋盘
void print_board(char board[ROW][COL], int row, int col);

//玩家下棋
void player_move(char board[ROW][COL], int row, int col);

//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);

//判断输赢
char win(char board[ROW][COL], int row, int col);

运行效果
在这里插入图片描述

总结

在这篇博客中,我们详细介绍了使用C语言实现三子棋游戏的过程。首先,我们了解了三子棋游戏的规则和目标。接着,我们详细讨论了程序的设计和实现过程。我们使用了多个函数来处理不同的功能,如打印游戏板、获取玩家输入、判断胜负等。并调用合适的函数来执行游戏的不同步骤,我们成功地实现了一个简单而实用的三子棋游戏,通过这个项目,我不仅深化了我对于C语言的理解和运用,还提高了我的编程技巧。在实现三子棋小游戏的过程中,我进一步加强了我的算法思维和逻辑分析能力,并通过反复调试和优化来提升程序的性能。这个项目让我得到了满满的成就感,也增加了我的编程兴趣。我相信这次实践对于未来我的编程之路会产生积极的影响,我会继续探索和挑战更多有趣且有意义的项目,希望我的文章能给大家带来帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1002690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux基础(五)】Linux中的开发工具(上)---yum和vim

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux中的开发工具 1. 前言2.…

CMD 命令和 ENTRYPOINT 命令的区别

目录 CMD 命令CMD-shell 形式1. 创建 Dockerfile12. 构建和运行新镜像3. 覆盖 CMD4. 添加命令选项 CMD-exec形式1. 创建Dockerfile2、构建和运行新镜像2.覆盖 CMD和添加命令选项 ENTRYPOINT 命令ENTRYPOINT-shell1. 创建Dockerfile3、构建和运行新镜像2. 覆盖 ENTRYPOINT 和 添…

华为云云耀云服务器L实例评测|了解配置和管理L型云服务器

华为云云耀云服务器L实例配置和管理教程 华为云云耀云服务器L实例的介绍概述特点优势与弹性云服务器&#xff08;ECS&#xff09;的对比 注册和创建L型云服务器注册华为云账号创建L型云服务器实例配置实例参数配置其他参数尝试登录 远程登录 L实例查看公网ip通过本地shell远程连…

QT Pyside2 Designer 的基本使用

文章目录 前言PySide2PySide2 Designer 一、安装PySide2、PyQt5二、使用designer.exe2.1 工具的大致介绍2.2 创建一个新的UI2.3 UI文件另存为/保存(CtrlS)2.4 使用python操作UI文件 总结 前言 PySide2 QT PySide2 是一个用于 Python 编程语言的开源框架&#xff0c;它提供了与…

【建站教程】使用阿里云服务器怎么搭建网站?

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云服务器网以搭建WordPress网站博客为例&#xff0c;阿小云来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程&#x…

(10)(10.9) 术语表(一)

文章目录 前言 1 2.4Ghz 2 AGL 3 AHRS 4 APM 5 AMA 6 Arduino 7 APM (AutoPilot Mega) 8 ATC 9 Copter 10 Plane 11 Rover 12 BEC 13 Bootloader 14 COA 15 DCM 16 Eagle file 17 ESC 18 Firmware 19 FPV 20 FTDI 前言 &#xff01;Note 术语表未编入索…

C++零碎记录(十二)

22. 菱形继承 22.1 菱形继承简介 ① 菱形继承概念&#xff1a; 1. 两个派生类继承同一个基类 2. 又有某个类同时继承两个派生类 3. 这种继承被称为菱形继承 ② 羊继承了动物的数据&#xff0c;驼同样继承了动物的数据&#xff0c;当草泥马使用数据是&#xff0c;就会产生二义…

重构:在新底座之上让应用重生

应用重构正在开启一条云原生时代的新赛道。 数字化发展到今天&#xff0c;企业面临的挑战不仅来自技术层面&#xff0c;更来自认知层面。新架构、新应用正在重新定义数字生产力&#xff0c;重塑商业模式与市场核心竞争力。对金融行业来说&#xff0c;也是如此&#xff0c;一场…

计算机网络第六章——应用层(上)

人生若只如初见&#xff0c;何事秋风悲画扇 文章目录 基于服务的使用以及服务的提供而诞生的两个应用模型&#xff0c; 传输层提供一种端到端的服务&#xff0c;但是不同的网络应用的应用进程之间还需要有一些不同的通信规则&#xff0c;因此在传输层之上建立了一个应用层&am…

信息化管理工程验收评测规范

一、信息工程验收程序&#xff1a; 1.信息化建设项目验收分为初步验收和竣工验收两个阶段。验收由建设单位自行对照招标文件、投标文件和合同执行&#xff0c;并提交初验报告&#xff1b;企业与第三方联系实施验收。 2.工程试运行后30个工作日内&#xff0c;项目建设单位应将…

[计算机入门] 设置日期和时间

3.8 设置日期和时间 在任务栏的最右边是可以看到当前的日期和时间的。当然&#xff0c;如果这里的显示不对&#xff0c;也是可以进行设置的。 1、在任务栏的日期和时间位置&#xff0c;右键鼠标&#xff0c;在弹出的菜单中&#xff0c;点击调整日期/时间。 2、一般情况下&am…

easypoi和poi版本兼容问题记录

最近在开发导出word的功能&#xff0c;遇到下面的问题 提示xml报错的问题&#xff0c;我一度以为是项目换了java11造成的。经过询问朋友&#xff0c;得知有可能是版本冲突造成的&#xff0c;就猛然想起来&#xff0c;我的项目里面还引入了poi这个包。 于是我吧poi的版本降低到了…

【算法训练-数组 五】【二分查找】:旋转数组的最小数字、旋转数组的指定数字

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【数组的二分查找】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为…

C#,《小白学程序》第二十一课:大数(BigInteger)的四则运算之二,减法

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…

GO语言网络编程(并发编程)Goroutine池

GO语言网络编程&#xff08;并发编程&#xff09;Goroutine池 1. Goroutine池 1.1.1. worker pool&#xff08;goroutine池&#xff09; 本质上是生产者消费者模型可以有效控制goroutine数量&#xff0c;防止暴涨需求&#xff1a; 计算一个数字的各个位数之和&#xff0c;例…

2.5 循环结构语句

在程序设计中&#xff0c;有时需要反复执行一段相同的代码&#xff0c;这时就需要使用循环结构来实现&#xff0c;Java语言提供了while循环、do-while循环、for循环。 一般情况下&#xff0c;一个循环结构包含四部分内容&#xff1a; 初始化部分&#xff0c;设置循环开始时变量…

正交试验设计法

正交实验设计 一、什么是正交试验设计法&#xff1f; 是一种成对测试交互的系统的统计方法。它提供了一种能对所有变量对的组合进行典型覆盖&#xff08;均匀分布&#xff09;的方法。 可以从大量的试验点中挑出适量的、有代表性的点&#xff0c;利用“正交表”&#xff0c;…

Rsync远程同步+inotify监控

一、rsync同步简介 一款快速增量备份工具 rsync&#xff08;Remote Sync&#xff0c;远程同步&#xff09; 是一个开源的快速备份工具&#xff0c;可支持本地复制&#xff0c;或者与其他SSH,rsync主机同步。 cp&#xff1a;将原文件完整的复制到指定的路径下&#xff0c;而且…

Vector底层原理——面试之我答

Vector概述 vector是STL中最常用的容器&#xff0c;vector主要功能是作动态数组来弥补传统数组的缺点&#xff0c;如&#xff1a;不灵活&#xff0c;不方便插入等等。 Vector支持随机访问&#xff0c;因此访问某一个元素的时间复杂度是O(1)。 vector中存储着许多易用的函数方法…

自动化测试入门知识 —— 数据驱动测试

一、什么是数据驱动测试&#xff1f; 数据驱动测试是一种测试方法&#xff0c;它的核心思想是通过不同的测试数据来验证同一个测试逻辑。通常情况下&#xff0c;测试用例中的输入数据和预期结果会被提取出来&#xff0c;以便可以通过不同的测试数据进行重复执行。 数据驱动测…