如何用C语言来实现【三子棋游戏】

如何用C语言来实现【三子棋游戏】,第1张

目录


一、前言


二、思维导图


三、思路分析


四、运行结果


五、算法细节

1.游戏相关的测试

2.游戏函数的声明

3.游戏函数的实现

(1)初始化棋盘的函数

(2)打印棋盘的函数

(3)玩家下棋的函数

(4)电脑下棋的函数

(5)判断输赢的函数


六、完整代码

1.text.c文件

2.game.h文件

3.game.c文件


七、结语



一、前言

       三子棋可以帮助我们巩固函数的知识,锻炼我们的编程思想,代码的实现要一个模块一个模块的实现,但是实现起来补特别的难,是一个比较适和刚学编程没多久的小伙伴拿来练手的。


在写完之后,还可以与自己的朋友装装X




二、思维导图



三、游戏逻辑

1.打印选择菜单(是玩游戏还是退出游戏)

2.初始化并打印空棋盘

3.玩家下棋(判断坐标是否非法、判断坐标是否被占用)

4.打印棋盘

5.判断输赢(玩家赢?平局?未分出胜负)

6.电脑下棋(判断坐标是否非法、判断坐标是否被占用)

7.打印棋盘

8.判断输赢(玩家赢?平局?未分出胜负)

9.游戏结束(玩家赢/电脑赢/平局)

10.再来一局还是退出游戏(不过瘾,就再来一局)



四、运行结果

情况一:玩家赢

情况二:电脑赢

 

情况三:平局

 这样的一个三子棋游戏是不是既简单又好玩啊!

✌️✌️


 


五、算法细节  1.游戏相关的测试

使用text.c文件来执行相关游戏的测试

2.游戏函数的声明

使用game.h文件来实现游戏函数的声明

3.游戏函数的实现 (1)初始化棋盘的函数

(2)打印棋盘的函数

          棋盘分析:

(3)玩家下棋的函数

(4)电脑下棋的函数

了解rand()函数:

(5)判断输赢的函数

   判断输赢的三种情况:

 



六、完整代码 1.text.c文件



#include"game.h"

void menu()
{
	printf("**********************************\n");
	printf("************** 1.play ************\n");
	printf("************** 0.exit ************\n");
	printf("**********************************\n");
}
void game()
{
	char board[HANG][LIE];
	Initboard(board, HANG, LIE);//初始化棋盘
	Displayboard(board, HANG, LIE);//打印棋盘

	char ret = 0;//获取游戏状态
	while (1)
	{
		//玩家下棋
		Playermove(board, HANG, LIE);//玩家输入坐标
		Displayboard(board, HANG, LIE);//连同输入的坐标和棋盘一同打印
		//判断玩家是否赢得游戏
		ret = Inwin(board, HANG, LIE);
		if (ret != 'C')
		{
			break;
		}

		//电脑下棋
		Computermove(board, HANG, LIE);//电脑输入坐标
		Displayboard(board, HANG, LIE);//连同输入的坐标和棋盘一同打印
		//判断玩家是否赢得游戏
		ret = Inwin(board, HANG, LIE);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家赢\n");
		Displayboard(board, HANG, LIE);
	}
	else if (ret == '#')
	{
		printf("电脑赢\n");
		Displayboard(board, HANG, LIE);
	}
	else
	{
		printf("平局\n");
		Displayboard(board, HANG, LIE);
	}
}
int main()
{
	int input = 0;
	srand( (unsigned int) time (NULL) );
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,重新输入\n");
			break;
		}

	} while (input);
	return 0;
}

2.game.h文件
#include

#include

#include

//符号的定义
#define HANG   3//行
#define LIE    3//列

//函数的声明
void Initboard(char board[HANG][LIE], int hang, int lie);//初始化棋盘

void Displayboard(char board[HANG][LIE], int hang, int lie);//打印棋盘

void Playermove(char board[HANG][LIE], int hang, int lie);//玩家1下棋

void Computermove(char board[HANG][LIE], int hang, int lie);//电脑下棋

int Inwin(char board[HANG][LIE], int hang, int lie);//判断输赢

3.game.c文件

#include"game.h"

void Initboard(char board[HANG][LIE], int hang, int lie)//实现棋盘的初始化
{
	int i = 0;
	int j = 0;
	for (i = 0; i < hang; i++)//打印hang*lie的空格
	{
		for (j = 0; j < lie; j++)
		{
			board[i][j] = ' ';
		}
	}
}

void Displayboard(char board[HANG][LIE], int hang, int lie)//实现打印棋盘
{
	int i = 0;
	int j = 0;
	for (i = 0; i < hang; i++)
	{
		for (j = 0; j < lie; j++)
		{
			printf(" %c ", board[i][j]);//打印i*j的|
			if (j < lie - 1)//最后1列打印lie-1的|
			{
				printf("|");
			}

		}
		printf("\n");
		if (i < hang - 1)//最后1行打印hang - 1的 --- 和 |
		{
			int j = 0;
			for (j = 0; j < lie; j++)//打印每一行的 --- 和 |
			{
				printf("---");
				if (j < lie - 1)//最后1行打印lie - 1的 |
				{
					printf("|");
				}
			}
			printf("\n");
		}
	}
}

void Playermove(char board[HANG][LIE], int hang, int lie)//玩家下棋
{
	int x = 0;
	int y = 0;
	printf("玩家走>\n");
	while (1)
	{
		printf("请输入坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= hang && y >= 1 && y <= lie)//判断坐标是否合法
		{
			//玩家输入的坐标 -1 表示的是数组的下标
			if (board[x - 1][y - 1] == ' ')//判断坐标是否被占用
			{
				board[x - 1][y - 1] = '*';//将输入的坐标改为*
				break;
			}
			else
			{
				printf("坐标被占用,重新输入!!!\n");
			}
		}
		else
		{
			printf("坐标非法,重新输入!!!\n");
		}
	}
}

void Computermove(char board[HANG][LIE], int hang, int lie)//电脑下棋
{
	printf("电脑走>\n");
	
	while (1)
	{
		//电脑不用判断是否合法,因为 % hang和 % lie只能得到hang行和lie列,不会出现多于棋盘的坐标
		int x = rand() % hang;// % hang 得到行,若hang为3.则 % 3的余数就是0到2
		int y = rand() % lie;// % lie 得到列,若lie为3.则 % 3的余数就是0到2
		if (board[x][y] == ' ')//只判断占用
		{
			board[x][y] = '#';
			break;
		}
	}
}

int Ispull(char board[HANG][LIE], int hang, int lie)
{
	int i = 0;
	int j = 0;
	//遍历数组访问3行3列的元素是否有空格
	for (i = 0; i < hang; i++)
	{
		for (j = 0; j < lie; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;//棋盘没满
			}
		}
	}
	return 1;//棋盘满了
}
int Inwin(char board[HANG][LIE], int hang, int lie)//判断输赢
{
	int i = 0;
	for (i = 0; i < hang; i++)//判断3行
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')//判断行相同
		{
			return board[1][i];
		}
	}

	for (i = 0; i < lie; i++)//判断3列
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')//判断列相同
		{
			return board[i][1];
		}
	}

	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')//判断对角线相同
	{
		return board[1][1];
	}

	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')//判断对角线相同
	{
		return board[1][1];
	}

	//如果棋盘满了返回1,不满返回0
	int ret = Ispull(board, HANG, LIE);//判断平局
	if (ret == 1)
	{
		return 'Q';//平局
	}
	else
	{
		return 'C';//继续游戏
	}
}


七、结语

       这一次教大家学习了如何用C语言来写一个三子棋游戏,如果大家有什么不懂的问题或是有什么建议,可以在评论区留言,有问题的话,我会进自己的绵薄之力为大家一一解答;建议的话,我也会斟酌采纳,与大家一起慢慢的进步。


原创不易,还请三连,你们的点赞、收藏和关注是对我最大的支持。


 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/584793.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存