C语言实现井字棋/三子棋

Hello,大家好,我是李同学

今天我们来实现一个简单的游戏

就是大家小时候经常玩的游戏井字棋/三子棋

那什么是井字棋呢?

井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。

游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜。

C语言实现井字棋/三子棋_第1张图片

 

为了简化操作,我们设计3*3的表格,动手之前我们必须思路清晰

我把代码实现分为以下8步:

1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子(玩家输入行列坐标的方式来落子),'x’表示玩家落子。
5.判定胜负关系(输,赢,和棋),'q’表示和棋。
6.电脑落子(随机位置落子) ,'o’表示电脑落子。
7.判定胜负关系。
8.回到 步骤2 继续执行。

废话不多说,我们开始动手

我使用的vs2022,大家可以新建一个项目game1

在头文件中添加game.h

在源文件中添加game.ctest.c

1.菜单界面选择开始或者退出游戏

我们首先要在搭建游戏框架,框架建议放在源文件test.c,要实现的功能有:

当用户输入1的时候,进入井字棋程序

当用户输入0的时候,退出井字棋程序

当用户输入其他数字的时候,提醒用户输入错误,重新输入

#include 
void menu()
{
	printf("************************************\n");
	printf("***   1.play     0.exit          ***\n");
	printf("************************************\n");
}
void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf_s("%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;
}

代码运行的图片

C语言实现井字棋/三子棋_第2张图片

 

2.创建棋盘并初始化

接下来创建棋盘,使用3*3数组来表示,元素类型是char

这里建议放在头文件game.h,我们将会使用宏定义

为什么要使用宏定义呢?

使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。

#define ROW 3
#define COL 3
char chessBoard[ROW][COL] = { 0 };

3.棋盘初始化

这是很关键的一步,将3*3数组中的元素全部换成空格

void init(char chessBoard[ROW][COL])
{
	for (int row = 0; row < ROW; row++)
   {
		for (int col = 0; col < COL; col++)
        {
			chessBoard[row][col] = ' ';
		}
	}
}

4.打印棋盘

我们要的棋盘是这样的

C语言实现井字棋/三子棋_第3张图片

代码实现

void print_chessBoard(char chessBoard[ROW][COL])
{
	printf("+---+---+---+\n");
	for (int row = 0; row 

 得到的图像如下图所示C语言实现井字棋/三子棋_第4张图片

 5.玩家落子

玩家输入行列坐标表示落子,使用’x’表示玩家落子。

注意:
1.玩家落子需要在棋盘范围内。
2.玩家要在棋盘上空的地方落子。
3.如果输入的坐标不满足要重新输入。

void playerMove(char chessBoard[ROW][COL])
{
	while (1)
   {
		int row = 0;
		int col = 0;
		printf("请输入坐标(row col):");
		scanf("%d %d", &row, &col);
		if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL)
        {
			printf("您的坐标不在合法范围内 [0, 2],请重新输入:\n");
			continue;
		}
		if (chessBoard[row][col] != ' ')
        {
			printf("您的坐标位置已经有子了!\n");
			continue;
		}
		chessBoard[row][col] = 'x';
		break;
	}
}

6.电脑落子

电脑随机产生行列坐标,'o’表示电脑落子。

注意:
1.要在主函数中使用srand((unsigned int)time(0))
将时间作为随机数种子,确保得到的行列坐标是真随机。
2.要在棋盘上空的地方下棋。

void computerMove(char chessBoard[ROW][COL])
{
	while (1)
   {
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (chessBoard[row][col] != ' ') 
        {
			continue;
		}
		chessBoard[row][col] = 'o';
		break;
	}
}

7.判断胜负

此处约定返回结果的含义:
(1)‘x’ 表示玩家获胜
(2)‘o’ 表示电脑获胜
(3)’ ’ 表示胜负未分
(4) ‘q’ 表示和棋

1.判定是否和棋
(1)调用isFull函数。
(2)如果数组中有元素为’ ‘,那么没满,返回0。如果全不为’ ',满了,返回1。
(3)如果棋盘满了未分出胜负,和棋。
2.判定电脑玩家胜利
(1)判定所有的行
(2)判定所有的列
(3)判定两条对角线

int isFull(char chessBoard[ROW][COL])
{
	for (int row = 0; row < ROW; row++)
   {
		for (int col = 0; col < COL; col++)
       {
			if (chessBoard[row][col] == ' ')
            {
				return 0;
			}

		}
	}
	return 1;
}

char isWin(char chessBoard[ROW][COL])
{
	for (int row = 0; row < MAX_ROW; row++)
   {
		if (chessBoard[row][0] != ' '
			&& chessBoard[row][0] == chessBoard[row][1]
			&& chessBoard[row][0] == chessBoard[row][2]) 
        {
			return chessBoard[row][0];
		}
	}
	for (int col = 0; col < MAX_COL; col++) 
    {
		if (chessBoard[0][col] != ' '
			&& chessBoard[0][col] == chessBoard[1][col]
			&& chessBoard[0][col] == chessBoard[2][col]) 
        {
			return chessBoard[0][col];
		}
	}
	if (chessBoard[0][0] != ' '
		&& chessBoard[0][0] == chessBoard[1][1]
		&& chessBoard[0][0] == chessBoard[2][2]) 
       {
		return chessBoard[0][0];
	   }
	if (chessBoard[2][0] != ' '
		&& chessBoard[2][0] == chessBoard[1][1]
		&& chessBoard[2][0] == chessBoard[0][2])
       {
		return chessBoard[2][0];
	   }
	if (isFull(chessBoard)) 
      {
		return 'q';
	   }
	return ' ';
}


大功告成啦!接下来我们就可以和电脑下棋了,当然也会出现三种情况 1)赢棋 2)输棋 3)和棋

1)赢棋

C语言实现井字棋/三子棋_第5张图片

2)输棋 

至今还没输过。。。。为了做素材,我还是输了一把

C语言实现井字棋/三子棋_第6张图片

3)和棋

为了素材,我也打了一把平手

C语言实现井字棋/三子棋_第7张图片

 虽然电脑也能下三子棋,不过最大的问题也来了,它是一个彻头彻尾的“人工智障

不会思考的那种机器人,希望这个作品以后还能改进吧

觉得内容不错的同学记得留在手里的赞哦

我是李同学,我们明天见
 

你可能感兴趣的:(c语言,开发语言)