C语言实现三子棋

发布时间:2023-07-28 19:00

目录

1.文件的创建

2.用户选择界面的实现

 1.菜单创建

 2.用户输入选择

2.棋盘格的建立 

 3.打印棋盘格

4.开始下棋

            4.1.玩家下棋

            4.2电脑下棋

            4.3输赢条件判断

            4.4结果输出


1.文件的创建

创建俩个源文件,一个头文件

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

game.h存放游戏内容所引用到的自定义函数

game.c存放游戏部分内容

test.c 存放调试部分内容

2.用户选择界面的实现

1.菜单创建

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

#include
void menu()
{
	printf("******************\n");
	printf("*****1.play*******\n");
	printf("*****0.exit*******\n");
	printf("******************\n");
}
int main()
{
	menu();
	return 0;
}

 2.用户输入选择

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

int main()
{
	
	menu();
	printf("请用户进行选择:");
	int x;
	do {
		scanf("%d", &x);
		switch (x)
		{
		case 1:
			printf("进入游戏");
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("请重新输入");
			break;
		}
	} while (x);
	return 0;
}

2.棋盘格的建立 

此处建立一个9宫格棋盘,所以要用到3x3的二维数组。

C语言实现三子棋_第4张图片

棋盘长这样

 先在game.h头文件里面定义一下,棋盘的横行和纵列,声明创建棋盘格函数Itnboard

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

这里的ROW表示横行 ,COL表示纵列。

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

 创建二维数组,并对二维数组传参,将棋盘格传入Itnboard函数,此函数为创建棋盘格

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

在test.c引用game.h的头文件

 接下来便是编辑创建棋盘格的函数,这里我们在前面所创建的game.c文件编辑,test.c文件用于测试,分开写比较好,不然代码多而乱。

C语言实现三子棋_第8张图片

#include"game.h"
void Itnboard(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

现在game.c里面引用game.h的头文件,再把Itnboard函数进行传参,返回值为空。

这里先遍历二维数组,让每个值都为空格。

C语言实现三子棋_第9张图片

因为最先要创建一个空棋盘所以,这里得用空格,遍历完之后就是棋盘格的打印了即大家看到的这些条条框框,我们要打印出来

 3.打印棋盘格

打印之前先说一下我们的思路

C语言实现三子棋_第10张图片

为了更清晰,我把空隙做大一些,下面这些——单独做一行,及所谓的分隔符

先定义一个打印棋盘的函数,名字随便取,自己能理解来就好我用的是Printboard,

在game.h定义此函数,返回值为空,再在test.c引用此函数,在game.c编辑此函数

C语言实现三子棋_第11张图片

C语言实现三子棋_第12张图片

C语言实现三子棋_第13张图片

接下来编辑打印棋盘的函数

如何编辑?先说想法

C语言实现三子棋_第14张图片 第一行打印为 空格board[i][j]空格|空格board[i][j]空格|空格board[i][j]空格|

                      即 board[i][j] | board[i][j] | board[i][j] 

board[i][j]表示我们待会要下的棋子,我们之前把棋子赋值为了空格,可看上一步

C语言实现三子棋_第15张图片

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

代码讲解

空格用‘-’代替 board[i][j]用X代替

先打印

C语言实现三子棋_第16张图片

代码段

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

第一行打印完之后换行

打印第二行

 C语言实现三子棋_第17张图片

for (j = 0; j < col; j++)
		{
			if (j < col - 1)
			{
				printf("---|");
			}
			else
				printf("---");
		}
		printf("\n");

打印完之后换行,注意:竖杠即|只在第一二列结尾出现 

 成果:

C语言实现三子棋_第18张图片

棋盘格打印完成,打印完之后就可以开始下棋咯!

4.开始下棋

玩家先走第一步

4.1.玩家下棋

接下来我们编写玩家下棋代码

还是在game.h 声明,在game.c编写,在test.c引用

C语言实现三子棋_第19张图片

下棋范围为1-3,x-1表示若x等于1,则在函数中对应第二个位置,但玩家并不知道那是第二个位置,所以要减1,让玩家输入几 就在第几个位置出现

void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家请下棋:");
	
	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");
	}

}

玩家下完棋后打印一下棋盘,要打印棋盘,看效果

C语言实现三子棋_第20张图片

若输入棋盘外的数字,会一直进入循环直到输入正确的坐标。所以用while循环,找到正确坐标后用break语句跳出

C语言实现三子棋_第21张图片

 人下完棋,接着该电脑走了

4.2电脑下棋

接下来我们编写电脑下棋代码

还是在game.h 声明,在game.c编写,在test.c引用

void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x;
	int y;
	x = rand() % 3;
	y = rand() % 3;
	printf("电脑下棋\n");
	while (1)
	{
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

电脑下棋为随机数生成,但是棋盘格子为1-3,为了确保电脑下的棋在1-3,我们对生成的随机数进行对3取余的操作,这杨电脑才能把棋下在棋盘里。

随机数以时间为标准应用time.h头文件

C语言实现三子棋_第22张图片

电脑下完棋后,我们对棋盘格进行打印,由于下棋可能只是下一颗棋子就结束了,所以用while循环,当不满足条件时退出 

接下来就是满足什么条件是退出

4.3输赢条件判断

还是在game.h 声明,在game.c编写,在test.c引用

函数名为Iswin,类型为char

C语言实现三子棋_第23张图片

输赢三种情况:某一行全为一种相同棋子,

某一列全为一种相同棋子,主对角线或次对角线全为一颗相同棋子,

但是也有可能平局,这里IsFull为判断是否平局

C语言实现三子棋_第24张图片

int	IsFull(char board[ROW][COL], int row, int col)
{
	int i; int  j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < row; j++)
		{
			if (board[i][j] == ' ') //如果这个格子是空的,则返回1
				return 1;
		}
	}
	return 0;// 遍历完之后如果没有空格子,则返回0

 IsFull函数为int类型 但是在Iswin函数里使用 Iswin又是char类型

所以我们要用一个变量来接收IsFull的返回值,并把它在Iswin函数里返回为char类型

C语言实现三子棋_第25张图片

这里用k来接收,返回值为char类型

若返回C则代表格子还没满,若返回Q,则代表格子满了

C语言实现三子棋_第26张图片

返回之后要去判断,如果返回的值不等于C,则代表格子满了,跳出while循环,否则,继续while循环

这里有三种情况跳出while循环

玩家赢 返回 *     电脑赢返回#    平局返回 Q

跳出while循环后我们应将游戏结果告诉玩家

所以接下来写结果输出

4.4结果输出

C语言实现三子棋_第27张图片

C语言实现三子棋_第28张图片

玩家赢

C语言实现三子棋_第29张图片

电脑赢

电脑太笨了,实在下不出一把平局,没办法验证结果了,试了好几把,把把玩家赢,上面这个电脑赢都是好不容易搞来的

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号