C语言---会思考的三子棋

C语言---会思考的三子棋,第1张

学了二维数组我们就可以试着写一个三子棋小游戏了,但电脑随机的 *** 作让整个游戏根本没难度,所以我给大家带来了一个不是那么笨的三子棋,将人的思维带给电脑,代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#define ROW 3  //宏定义棋盘长宽
#define COL 3
void mvue()   //打印游戏菜单函数
{
	printf("*************************************\n");
	printf("*********** 1.开始游戏  *************\n");
	printf("*********** 0.退出游戏  *************\n");
	printf("*************************************\n");
}
//******************棋盘内部置空******************************
void initialization(char disc[ROW][COL] )
{
	int i = 0;
	for (i = 0; i < ROW; i++)
	{
		int n = 0;
		for (n = 0; n < COL; n++)
		{
			disc[i][n] = ' ';
		}
	}
}
//*****************创建棋盘外观,打印棋盘********************************
void print(char disc[ROW][COL] )
{
	printf("+---+---+---+\n");
	for (int row = 0; row < ROW; row++)
	{
		printf("| %c | %c | %c |\n", disc[row][0], disc[row][1], disc[row][2]);

		printf("+---+---+---+\n");
	}

}
//*****************玩家下棋******************************
void a_fallingseed(char disc[ROW][COL])
{
	while (1)
	{
		printf("输入一个坐标(例2,2):");
		int x = 0;
		int y = 0;
		scanf("%d,%d", &x, &y);
		if ((x > 0 && x <= ROW) && (y > 0 && y <= COL))
		{
			if (disc[x - 1][y - 1] == ' ')
			{
				disc[x - 1][y - 1] = '*';
				break;
			}
			else
				printf("坐标已有棋子\n");
		}
		else
		{
			printf("坐标非法\n");
		}
	 }

}
//********************电脑下棋****************************
int b_fallingseed(char disc[ROW][COL])//判断敌方横是否为2
{
	 
	for (int i = 0; i < ROW; i++)
	{
		int judge1 = 0;
		int n = 0;
		for ( n = 0; n < COL; n++)
		{
			 if(disc[i][n] == '*')
				 judge1++;
		}
		if (judge1 == 2)
		{
			for (int max = 0; max < COL; max++)
			{
				if (disc[i][max] == ' ')
				{
					disc[i][max] = '#';
					return 0;
				}
			}
		}
	}
	//-------------------------------------------
	 
	for (int i = 0; i < COL; i++) //判断敌方纵是否为2 
	{
		int judge2 = 0;
		int n = 0;
		for (n = 0; n < ROW; n++)
		{
			 if(disc[n][i] == '*')
			judge2++;
		}
		if (judge2 == 2)
		{
			for (int max = 0; max < COL; max++)
			{
				if (disc[max][i] == ' ')
				{
					disc[max][i] = '#';
					return 0;

				}
			}
		}
	}
	//----------------判断敌方右斜是否为2  ---------------------------
	int pa = 0;
	int pb = 0;
	int judge3 = 0;
	for (pa = 0; pa < ROW && pb < COL; pa++,pb++)
	{
		if (disc[pa][pb] == '*')
		{
			judge3++;
		}
		 
		if (judge3 == 2)
		{
			if (disc[0][0] == ' ')
			{
				disc[0][0] = '#';
				return 0;

			}
			else if (disc[1][1] == ' ')
			{
				disc[1][1] = '#';
				return 0;

			}
			else
			{
				disc[2][2] = '#';
				return 0;

			}
		}

	}
	//--------------判断敌方左斜是否为2 -------------------------
	int judge4 = 0;
	int pc = 0;
	int pd = 0;
	for (pc = 0, pd = COL - 1; pc < ROW && pd >= 0; pc++, pd--)
	{
		if (disc[pc][pd] == '*')
		{
			judge4++;
		}
		if (judge4 == 2)
		{
			if (disc[0][2] == ' ')
			{
				disc[0][2] = '#';
				return 0;

			}
			else if (disc[1][1] == ' ')
			{
				disc[1][1] = '#';
				return 0;

			}
			else
			{
				disc[2][0] = '#';
				return 0;

			}
		}
	}
	if (disc[1][1] == ' ')   //如果没有必走棋,抢中心位置
	{
		disc[1][1] = '#';
		return 0;
	}
	else                        //如果中心位置已被占随机下一步棋
	{                          //这里的随机步还可以优化,让电脑随着你写的一个
		                      // 算法落子,每一步占据最大优势,但是这里是最难的,所以我没写
		 
		while (1)
		{
			int row = rand() % ROW;
			int col = rand() % COL;
			if (disc[row][col] == ' ')
			{
				disc[row][col] = '#';
				return 0;
			}
		}
	}
}
int iswin(char disc[ROW][COL])  //判断继续游戏还是平局
{
	int i = 0;
	int y = 0;
	for (i = 0; i < ROW; i++)
	{
		for (y = 0; y < COL; y++)
		{
			if (disc[i][y] == ' ')
				return 1;
		}
	}
	return 0;
}
//---------------------------------------------------
char Win(char disc[ROW][COL])  //判断输赢
{
	for (int i = 0; i < ROW; i++)
	{
		if (disc[i][0] == disc[i][1] && disc[i][1] == disc[i][2] && disc[i][1] != ' ')
		{
			return disc[i][1];
		}

	}

	for (int y = 0; y < COL; y++)
	{
		if (disc[0][y] == disc[1][y] && disc[1][y] == disc[2][y] && disc[1][y] != ' ')
		{
			return disc[0][y];
		}

	}

	if (disc[0][0] == disc[1][1] && disc[1][1] == disc[2][2] && disc[1][1] != ' ')
	{
		return disc[1][1];
	}
	else if (disc[0][2] == disc[1][1] && disc[1][1] == disc[2][0] && disc[1][1] != ' ')
	{
		return disc[1][1];
	}
	else
	{
		int c = iswin(disc);
		if (c == 0)
			return 'Q';
		else
			return ' ';
	}
}
void game()  //游戏执行过程总函数
{
	printf("玩家先(0)电脑先(1)\n");
	int vit = 0;
	scanf("%d", &vit);
	if (vit == 0)                                //玩家先
	{
		char disc[ROW][COL] = { 0 };
		initialization(disc);//初始化棋盘函数
		print(disc, ROW, COL); //创建棋盘外观
		char is = ' ';//判断根据
		while (1)
		{
			a_fallingseed(disc);//玩家下棋*
			print(disc, ROW, COL); //打印棋盘

			is = Win(disc);    //判断胜负
			if (is != ' ')
			{
				break;
			}
			b_fallingseed(disc);//电脑下棋#
			print(disc, ROW, COL);//打印棋盘
			is = Win(disc);    //判断胜负
			if (is != ' ')
			{
				break;
			}
		}
		if (is == '*')
		{
			printf("玩家胜利\n");
		}
		else if (is == '#')
		{
			printf("电脑胜利\n");
		}
		else if (is == 'Q')
			printf("平局\n");

	 }
	else if (vit == 1)                              //电脑先
	{

		char disc[ROW][COL] = { 0 };
		initialization(disc);//初始化棋盘函数
		//print(disc, ROW, COL); //创建棋盘外观
		char is = ' ';//判断根据
		while (1)
		{
			b_fallingseed(disc);//电脑下棋#
			//print(disc, ROW, COL); //打印棋盘
			is = Win(disc);    //判断胜负
			if (is != ' ')
			{
				break;
			}
			print(disc, ROW, COL);
			a_fallingseed(disc);//玩家下棋*
			//print(disc, ROW, COL);//打印棋盘
			is = Win(disc);    //判断胜负
			if (is != ' ')
			{
				break;
			}
		}
		if (is == '*')
		{
			printf("玩家胜利\n");
		}
		else if (is == '#')
		{
			printf("电脑胜利\n");
		}
		else if (is == 'Q')
			printf("平局\n");

	}
}
//*************************************************************
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		//system("cls");
		mvue();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();  //逐步实现游戏过程的函数
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

目前最大的缺点就是随机落子那一块,整个代码只是让电脑不会输的太挫,能够正常 *** 作,如果解决电脑随机落子那一块那么电脑可以算是一个不错的对手了

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

原文地址: http://outofmemory.cn/langs/734101.html

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

发表评论

登录后才能评论

评论列表(0条)

保存