C语言入门项目:三子棋小游戏(详解)

C语言要想学好还是要多学多练多实践,在接下来我也会不断更新这一类小白游戏!

《三子棋》这里是小300行的代码,可以培养代码思想

代码我放在Gitee:1_21/三子棋 · 404NOt/homework - 码云 - 开源中国 (gitee.com)

           Github:homework/1_21/三子棋 at main · N404NOt/homework (github.com)

下面我将给各位学者一步步分析代码(本人使用的是vs2019如有需要私信我)

这是本项目的运行结果!

C语言入门项目:三子棋小游戏(详解)_第1张图片

首先:

      我们遵从高内聚低耦合的理念,创建代码实现文件和运行文件及头文件,这样也方便理解代码运行逻辑

C语言入门项目:三子棋小游戏(详解)_第2张图片

C语言入门项目:三子棋小游戏(详解)_第3张图片

 

---------------------------------------------------

项目内容:

1.界面实现

2.棋盘的初始化;

3.棋子移动(玩家,电脑)(循环)

4.判断游戏结果(循环)

5.完善以及运行

----------------------------------------------------

 1.界面实现:

效果:

C语言入门项目:三子棋小游戏(详解)_第4张图片代码:

C语言入门项目:三子棋小游戏(详解)_第5张图片

先不要看初始化的值,这里最好把界面写个menu()函数出去,这样更简洁;我们剩下要做的就是往里面填补东西了,这相当于前台。

2.棋盘的初始化

遵循高内聚低耦合我把函数写在game.h中,在game.c(cpp)中实现

void InitBoard(char chess[][COL])
{
	
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			chess[i][j] = ' ';
		}
	}
}

 用InitBoard函数初始化我们每一个棋子为‘ ’,方便我们棋盘的展示以及输入。

紧接着就是棋盘的框架展示了,game.h中写这个函数,同样在game.c中实现

void DisplayBoard(char chess[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf(" %c ", chess[i][j]);
			if (i < COL&&j

实现了棋盘的初始化,中间的空白就是我们初始化的棋子‘ ’C语言入门项目:三子棋小游戏(详解)_第6张图片

3.这就是我们的关键一步了,棋子的移动废话不多说先上代码

void Playermove(char chess[ROW][COL],int row,int col)
{flag:
	scanf("%d %d", &row, &col);
	
	if (row > 0 && row <= ROW && col > 0 && col <= COL)
	{
		if (chess[row-1][col-1] == ' ')
		{
			chess[row-1][col-1] = 'x';
		}
		else
		{
			printf("输入错误,请重新输入:");
			goto flag;
		}
	}
	else
	{
		printf("输入错误,请重新输入:");
		goto flag;
	}
	printf("\n");
}
void Computermove(char chess[ROW][COL])
{
	printf("\n");
	srand((unsigned int)time(NULL));
flag2:	
	int row = rand() % ROW + 1;
	int col = rand() % COL + 1;
	if (chess[row-1][col-1] == ' ')
	{
		chess[row - 1][col - 1] = 'o';

	}
	else
	{
		goto flag2;
	}
	
}

 在这里我分成了玩家移动以及电脑移动,在设计时你要知道你面向的不是程序员玩这个游戏而是玩家,所以他们不知道是从0,1,2,3排列的,所以你就需要在他们输入的棋子坐标上减一,来进行下一步操作,而且我们下棋子要在‘ ’处下,而不能下重复,或者越界,所以我是这么处理的C语言入门项目:三子棋小游戏(详解)_第7张图片

 电脑下棋逻辑一样。

4.判断输赢,这里我是绕糊涂了,需要仔细思考,比如我在对角判断那就卡了半小时(谁还不是个小白了)

char udge(char chess[ROW][COL])
{
	//胜利行
	int password = 0;
	for (int row = 0; row < ROW; row++)
	{
		password = 0;
		for (int col = 1; col 

 在对角一定要多思考

在主函数中对应写入

do
		{
			DisplayBoard(chess);
			printf("请输入你要下的坐标>");
			Playermove(chess,row,col);
			judge=udge(chess);
			if (judge == 'x')
			{
				printf("<<<玩家胜利>>>");
				printf("\n");
				DisplayBoard(chess);
				system("pause");
				break;
			}
			if (judge == 'H')
			{
				printf("<<<和局>>>");
				printf("\n");
				DisplayBoard(chess);
				system("pause");

				break;

			}

			printf("\n");
			printf("电脑操作>");
			Computermove(chess);
			judge = udge(chess);

			if (judge == 'o')
			{
				printf("<<<电脑胜利>>>");
				printf("\n");
				DisplayBoard(chess);
				system("pause");

				break;
			}
				if (judge == 'H')
				{
					printf("<<<和局>>>");
					printf("\n");
					DisplayBoard(chess);
					system("pause");

					break;

				}

		} while (ct);

 下面我们要做的就是剪线头的事情了,剪完运行;(这里把全局变量值改变理论上可以进行N子棋对弈,但是不太好玩)

这里写的希望大家可以理解,如果有不懂或者有错误的地方,请大伙留言评论或者私信!!!

 

 

 

你可能感兴趣的:(项目,学习,c语言,c++,github,git,visual,studio)