c语言三子棋详解!!! (电脑智能下棋)(附上完整代码)

目录

 🌈三子棋游戏 🌈

🐽什么是三子棋?

🍋三子棋的实现

🌰游戏设计思路

🍓🍑(1)设计游戏菜单

🍒🍑 (2)创建棋盘 

🧅🍑(3)初始化游戏棋盘

🍑🍆(5)玩家下棋

🥦🍑(6)判断玩家有没有赢

🍑🍚(7)电脑下棋

 🥝(8)判断电脑有没有赢

🍑随机数的设置(电脑随机下棋的时候需要使用)

🥝游戏函数组合

🍉 🍇完整代码

🍇test.c

🍰 🎂 game.c

🥗 🥘game.h

🥥 🥝 🍅运行截图



 🌈三子棋游戏 🌈

🐽什么是三子棋?🐽

“三子棋是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。”

🍋三子棋的实现🍋

🌰游戏设计思路🌰

(1)设计游戏菜单
(2)创建棋盘
(3)初始化游戏棋盘
(4)打印棋盘
(5)玩家下棋
(6)判断玩家有没有赢
(7)电脑下棋
(8)判断电脑有没有赢

🍓🍑(1)设计游戏菜单🍑🍓

//游戏菜单
void menu()
{
	printf("*****************************\n");
	printf("***********三子棋游戏********\n");
	printf("************1.play***********\n");
	printf("************0.exit***********\n");
	printf("*****************************\n");

}

这个界面就没什么好说的啦!!!就是创建一个界面让玩家选择是否开始游戏

🍒🍑 (2)创建棋盘 🍑🍒

三字棋的棋盘大概是这个样子的!我们要想办法在电脑屏幕是打印出来。因为有三层,我们想到可以用一个二维数组来构造我们的棋盘。之后根据需要再做相应的调整。二维数组中存放空格,当玩家和电脑需要下棋的时候再吧空格替换掉。

//打印棋盘函数
void display_board(char arr[][COL], int row, int col)                           //最终棋盘:       |   |  
                                                                                //             ---|---|---
{                                                                               //                |   | 
	                                                                            //             ---|---|---
	printf(" 1 | 2 | 3 \n");	
	printf("---|---|---\n");
	int i = 0;                                          
	for (i = 0; i < row; i++)                            
	{
		
		int j = 0;
		for (j = 0; j < col; j++)//打印 %c | %c | %c   
			                            //把(   %c |  )看成一组
		{
			printf(" %c ", arr[i][j]);
			if (j == 2)
				printf("|%d", i+1);
			if (j < col - 1)//由于是不封闭棋盘,最后一列不打印
			{
				printf("|");
			}
		}
		printf("\n");
		if(i < row - 1)//打印---|---|---
		{
		for (j = 0; j < col; j++)
		{
			printf("---");
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		}

	}
	printf("\n");

}

🧅🍑(3)初始化游戏棋盘🍑🧅

这个函数的作用就是把数组中的元素全部替换成  ‘ 空格)’

void init_board(char arr[][COL],int row,int col)
{
	int i = 0;
	int j = 0;
	for (i = 0 ;i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}

	}

}

🍑🍆(5)玩家下棋🍆🍑

void player_move(char arr[][COL], int row, int col)//玩家下棋
{
	printf("玩家下棋-》:\n");
	printf("请输入要下棋的坐标,用空格隔开。\n");
	int x = 0;
	int y = 0;
	while (1)
	{	scanf("%d %d", &x, &y);
	   
	
		if (x >= 1 && x <= col && y >= 1 && y <= row)
		{
			if (arr[x - 1][y - 1] == ' ')  //为什么是x-1,y-1呢?
										   //因为人下棋的时候坐标是从1开始下的,而数组的下标是从0开始的
			{
				arr[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("这里已经下过棋啦!请重新输入坐标\n");
			}
		}
		else
		{
			printf("你输入的坐标超出范围,请重新输入\n");


		}

	}
	
}

 这里的关键是要知道人下棋的坐标与数组对应的坐标是不一样的,数组的下标是从[0]开始的,而人下棋是从1开始数的,所以要在人输入的坐标上x-1,y-1。

🥦🍑(6)判断玩家有没有赢🍑🥦

int is_full(char arr[][COL], int row, int col)//判断棋盘是否下满,下满返回1,未下满返回0;
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')
				return 0;

		}

	}return 1;
}
char is_win(char arr[][COL], int row, int col)//是否赢棋  玩家赢 返回*
                                                        //电脑赢  返回#
                                                         //棋盘下满平局 返回Q//继续下棋 返回C
{
	//判断三行
	int i = 0;
	for (i = 0; i < row; i++) 
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0]!= ' ')
			return arr[i][0];
	}
	//判断三列
	for (i = 0; i < col; i++) 
	{
		if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ')
			return arr[0][i];
	}
	//判断交叉线
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]&&arr[0][0] != ' ')
		return arr[0][0];
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] &&arr[0][2]!= ' ')
		return arr[0][2];
	if (is_full(arr, row, col) == 1)
	{
		return 'Q';
	}
	return 'C';
}

 玩家赢 返回*
电脑赢  返回#
棋盘下满平局 返回Q

继续下棋 返C

is_full()用来判断棋盘是否已经没有空格了,如果没有空格就说明数组的元素已经被替换完了,那么也就下满了

🍑🍚(7)电脑下棋🍚🍑

电脑下棋分为3个步骤——>1.先看电脑的下一步是否能赢棋,如果能赢就直接下

                                  ——>2.如果不能赢就看玩家的下一步是否会赢棋,如果玩家的下一步会赢棋那么就要防守

                                   ——>3.如果都不满足就随机下棋

int computer_attack(char arr[][COL], int row, int col)//电脑进攻下棋,优先级要高于防守,判断是否快满足3个棋,如果满足电脑赢
{

	//q=1的时候表示已经走棋了
	int q = 0;
	for (int i = 0; i <= 2; i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][0] == '#' && arr[i][2] == ' ')
		{
			arr[i][2] = '#';
			q = 1;
			return q;
		}
		if (arr[i][0] == arr[i][2] && arr[i][0] == '#' && arr[i][1] == ' ')
		{
			arr[i][1] = '#';
			q = 1;
			return q;
		}
		if (arr[i][0] == arr[i][2] && arr[i][0] == '#' && arr[i][1] == ' ')
		{
			arr[i][0] = '#';
			q = 1;
			return q;
		}
	}
	//接下来走列
	for (int i = 1; i <= 2; i++)
	{
		if (arr[0][i] == arr[1][i] && arr[0][i] == '#' && arr[2][i] == ' ')
		{
			arr[2][i] = '#';
			q = 1;
			return q;
		}
		if (arr[0][i] == arr[2][i] && arr[0][i] == '#' && arr[1][i] == ' ')
		{
			arr[1][i] = '#';
			q = 1;
			return q;
		}
		if (arr[2][i] == arr[1][i] && arr[1][i] == '#' && arr[0][i] == ' ')
		{
			arr[0][i] = '#';
			q = 1;
			return q;
		}
	}
	//斜线
	if (arr[0][0] == arr[1][1] && arr[0][0] == '#' && arr[2][2] == ' ')
	{
		arr[2][2] = '#';
		q = 1;
		return q;
	}
	if (arr[0][0] == arr[2][2] && arr[0][0] == '#' && arr[1][1] == ' ')
	{
		arr[1][1] = '#';
		q = 1;
		return q;
	}
	if (arr[1][1] == arr[2][2] && arr[1][1] == '#' && arr[0][0] == ' ')
	{
		arr[0][0] = '#';
		return q;
	}
	//斜线
	if (arr[0][2] == arr[1][1] && arr[0][2] == '#' && arr[2][0] == ' ')
	{
		arr[2][0] = '#';
		q = 1;
		return q;
	}
	if (arr[0][2] == arr[2][0] && arr[2][0] == '#' && arr[1][1] == ' ')
	{
		arr[1][1] = '#';
		q = 1;
		return q;
	}
	if (arr[1][1] == arr[2][0] && arr[2][0] == '#' && arr[0][2] == ' ')
	{
		arr[0][2] = '#';
		q = 1;
		return q;
	}
	return q;
}
	int computer_defend(char arr[][COL], int row, int col)//电脑防守
	{
		int q = 0;
		//这里我们先判断玩家是否是要赢了
		for (int i = 0; i <= 2; i++)
		{
			if (arr[i][0] == arr[i][1] && arr[i][0] == '*' && arr[i][2] == ' ')
			{
				arr[i][2] = '#';
				q = 1;
				return q;
			}
			if (arr[i][0] == arr[i][2] && arr[i][2] == '*' && arr[i][1] == ' ')
			{
				arr[i][1] = '#';
				q = 1;
				return q;
			}
			if (arr[i][1] == arr[i][2] && arr[i][1] == '*' && arr[i][0] == ' ')
			{
				arr[i][0] = '#';
				q = 1;
				return q;
			}
		}
		for (int i = 0; i <= 2; i++)
		{
			if (arr[0][i] == arr[1][i] && arr[1][i] == '*' && arr[2][i] == ' ')
			{
				arr[2][i] = '#';
				q = 1;
				return q;
			}
			if (arr[0][i] == arr[2][i] && arr[2][i] == '*' && arr[1][i] == ' ')
			{
				arr[1][i] = '#';
				q = 1;
				return q;
			}
			if (arr[2][i] == arr[1][i] && arr[1][i] == '*' && arr[0][i] == ' ')
			{
				arr[0][i] = '#';
				q = 1;
				return q;
			}
		}
		//走到这里还差捺
		if (arr[0][0] == arr[1][1] && arr[1][1] == '*' && arr[2][2] == ' ')
		{
			arr[2][2] = '#';
			q = 1;
			return q;
		}
		if (arr[0][0] == arr[2][2] && arr[0][0] == '*' && arr[1][1] == ' ')
		{
			arr[1][1] = '#';
			q = 1;
			return q;
		}
		if (arr[1][1] == arr[2][2] && arr[1][1] == '*' && arr[0][0] == ' ')
		{
			arr[0][0] = '#';
			q = 1;
			return q;
		}
		//撇
		if (arr[0][2] == arr[1][1] && arr[1][1] == '*' && arr[2][0] == ' ')
		{
			arr[2][0] = '#';
			q = 1;
			return q;
		}
		if (arr[0][2] == arr[2][0] && arr[0][2] == '*' && arr[1][1] == ' ')
		{
			arr[1][1] = '#';
			q = 1;
			return q;
		}
		if (arr[1][1] == arr[2][0] && arr[1][1] == '*' && arr[0][2] == ' ')
		{
			arr[0][2] = '#';
			q = 1;
			return q;
		}
	


		return q;
	}

void computer_move(char arr[][COL], int row, int col)
{
	
	int x = 0;
	int y = 0;
	x = rand() % 3;   //由于棋盘的横坐标大小对于数组来说是0~2,所以设置随机数范围也是0~2
	y = rand() % 3;   //由于棋盘的横坐标大小对于数组来说是0~2,所以设置随机数范围也是0~2
	while (1)
	{
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#';
			break;
		}

	}
	
}

 🥝(8)判断电脑有没有赢🥝

和判断玩家是否赢棋的方式是一样的

🍑随机数的设置(电脑随机下棋的时候需要使用)🍑

srand ()、rand()、time()三板斧

srand((unsigned int)time(NULL));

🥝游戏函数组合🍑

void game()
{
	char board[ROW][COL];//需要一个3*3的棋盘来储存
	init_board(board, ROW, COL);//初始化棋盘
	display_board(board, ROW, COL);//打印棋盘

	char ret;
	int qa = rand()%2;//随机数选择先手 0玩家先手  1电脑先手
	if (qa == 0)
	{
		printf("玩家先手!\n");

		while (1)
		{
			player_move(board, ROW, COL);//玩家下棋
			system("cls");

			display_board(board, ROW, COL);//打印棋盘
			ret = is_win(board, ROW, COL);

			if (ret == '*')
			{    
				system("cls");

				printf("玩家赢!\n");
				display_board(board, ROW, COL);//打印棋盘

				break;
			}
			if (ret == '#')
			{
				system("cls");

				printf("电脑赢!\n");
				display_board(board, ROW, COL);//打印棋盘

				break;
			}
			if (ret == 'Q')
			{
				system("cls");

				printf("平局!\n");
				display_board(board, ROW, COL);//打印棋盘

				break;
			}

			//电脑进攻
			int i = computer_attack(board, ROW, COL);
			if (i == 0)//如果不满足进攻条件,就看看防守条件是否满足
			{

				int z = computer_defend(board, ROW, COL);
				if (z == 0)//如果不满足防守条件
				{
					computer_move(board, ROW, COL);
					system("cls");
					display_board(board, ROW, COL);//电脑随机下棋
					ret = is_win(board, ROW, COL);



					if (ret == '*')
					{
						printf("玩家赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == '#')
					{
						printf("电脑赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == 'Q')
					{
						printf("平局!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}

				}
				else//如果满足防守条件
				{   
					system("cls");

					display_board(board, ROW, COL);
					ret = is_win(board, ROW, COL);

					if (ret == '*')
					{
						printf("玩家赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == '#')
					{
						printf("电脑赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == 'Q')
					{
						printf("平局!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
				}
			}
			else//如果满足进攻条件
			{
				system("cls");

				display_board(board, ROW, COL);//打印棋盘
				ret = is_win(board, ROW, COL);


				if (ret == '*')
				{
					printf("玩家赢!\n");
					display_board(board, ROW, COL);//打印棋盘

					break;
				}
				if (ret == '#')
				{
					printf("电脑赢!\n");
					display_board(board, ROW, COL);//打印棋盘

					break;
				}
				if (ret == 'Q')
				{
					printf("平局!\n");
					display_board(board, ROW, COL);//打印棋盘

					break;
				}
			}


		}
	}
	else //qa==1
	{

		printf("电脑先手\n");
		Sleep(2000);
		int b = rand()%6;
		while (1)
		{
			if (b == 0||b==2||b==3)
			{   
				system("cls");

				b = 10;//放置再次下中间发生错误
				board[1][1] = '#';
				display_board(board, ROW, COL);
			}
			else
			{
				int i = computer_attack(board, ROW, COL);

				if (i == 0)//如果不满足进攻条件,就看看防守条件是否满足
				{

					int z = computer_defend(board, ROW, COL);
					if (z == 0)//如果不满足防守条件
					{
						computer_move(board, ROW, COL);
						system("cls");

						display_board(board, ROW, COL);//电脑随机下棋
						ret = is_win(board, ROW, COL);

						if (ret == '*')
						{
							system("cls");
							printf("玩家赢!\n");
							display_board(board, ROW, COL);//打印棋盘

							break;
						}
						if (ret == '#')
						{
							system("cls");

							printf("电脑赢!\n");
							display_board(board, ROW, COL);//打印棋盘

							break;
						}
						if (ret == 'Q')
						{
							system("cls");

							display_board(board, ROW, COL);//打印棋盘

							printf("平局!\n");
							break;
						}
					}
					else
					{
						system("cls");

						display_board(board, ROW, COL);
						ret = is_win(board, ROW, COL);


						if (ret == '*')
						{
							system("cls");

							printf("玩家赢!\n");
							display_board(board, ROW, COL);//打印棋盘

							break;
						}
						if (ret == '#')
						{
							system("cls");

							printf("电脑赢!\n");
							display_board(board, ROW, COL);//打印棋盘

							break;
						}
						if (ret == 'Q')
						{
							system("cls");

							printf("平局!\n");
							display_board(board, ROW, COL);//打印棋盘

							break;
						}
					}
				}
				else
				{
					system("cls");

					display_board(board, ROW, COL);//打印棋盘

					ret = is_win(board, ROW, COL);



					if (ret == '*')
					{
						system("cls");

						printf("玩家赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == '#')
					{
						system("cls");

						printf("电脑赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == 'Q')
					{
						system("cls");

						printf("平局!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
				}

			}

			player_move(board, ROW, COL);//玩家下棋
			system("cls");


			display_board(board, ROW, COL);//打印棋盘
			ret = is_win(board, ROW, COL);

			if (ret == '*')
			{
				printf("玩家赢!\n");
				break;
			}
			if (ret == '#')
			{
				printf("电脑赢!\n");
				break;
			}
			if (ret == 'Q')
			{
				printf("平局!\n");
				break;
			}
		}



	}


}

🍉 🍇完整代码🍉 🍇

test.c

#include"game1.h"
//三字棋



int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do {
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出游戏!\n");
			break;
		case 1:
			printf("游戏开始!\n");
			game();
			
			break;
		default:
			printf("输入有误,请重新输入!\n");
			break;


		}
	} while (input);
	

	return 0;
}

void game()
{
	char board[ROW][COL];//需要一个3*3的棋盘来储存
	init_board(board, ROW, COL);//初始化棋盘
	display_board(board, ROW, COL);//打印棋盘

	char ret;
	int qa = rand()%2;//随机数选择先手 0玩家先手  1电脑先手
	if (qa == 0)
	{
		printf("玩家先手!\n");

		while (1)
		{
			player_move(board, ROW, COL);//玩家下棋
			system("cls");

			display_board(board, ROW, COL);//打印棋盘
			ret = is_win(board, ROW, COL);

			if (ret == '*')
			{    
				system("cls");

				printf("玩家赢!\n");
				display_board(board, ROW, COL);//打印棋盘

				break;
			}
			if (ret == '#')
			{
				system("cls");

				printf("电脑赢!\n");
				display_board(board, ROW, COL);//打印棋盘

				break;
			}
			if (ret == 'Q')
			{
				system("cls");

				printf("平局!\n");
				display_board(board, ROW, COL);//打印棋盘

				break;
			}

			//电脑进攻
			int i = computer_attack(board, ROW, COL);
			if (i == 0)//如果不满足进攻条件,就看看防守条件是否满足
			{

				int z = computer_defend(board, ROW, COL);
				if (z == 0)//如果不满足防守条件
				{
					computer_move(board, ROW, COL);
					system("cls");
					display_board(board, ROW, COL);//电脑随机下棋
					ret = is_win(board, ROW, COL);



					if (ret == '*')
					{
						printf("玩家赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == '#')
					{
						printf("电脑赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == 'Q')
					{
						printf("平局!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}

				}
				else//如果满足防守条件
				{   
					system("cls");

					display_board(board, ROW, COL);
					ret = is_win(board, ROW, COL);

					if (ret == '*')
					{
						printf("玩家赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == '#')
					{
						printf("电脑赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == 'Q')
					{
						printf("平局!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
				}
			}
			else//如果满足进攻条件
			{
				system("cls");

				display_board(board, ROW, COL);//打印棋盘
				ret = is_win(board, ROW, COL);


				if (ret == '*')
				{
					printf("玩家赢!\n");
					display_board(board, ROW, COL);//打印棋盘

					break;
				}
				if (ret == '#')
				{
					printf("电脑赢!\n");
					display_board(board, ROW, COL);//打印棋盘

					break;
				}
				if (ret == 'Q')
				{
					printf("平局!\n");
					display_board(board, ROW, COL);//打印棋盘

					break;
				}
			}


		}
	}
	else //qa==1
	{

		printf("电脑先手\n");
		Sleep(2000);
		int b = rand()%6;
		while (1)
		{
			if (b == 0||b==2||b==3)
			{   
				system("cls");

				b = 10;//放置再次下中间发生错误
				board[1][1] = '#';
				display_board(board, ROW, COL);
			}
			else
			{
				int i = computer_attack(board, ROW, COL);

				if (i == 0)//如果不满足进攻条件,就看看防守条件是否满足
				{

					int z = computer_defend(board, ROW, COL);
					if (z == 0)//如果不满足防守条件
					{
						computer_move(board, ROW, COL);
						system("cls");

						display_board(board, ROW, COL);//电脑随机下棋
						ret = is_win(board, ROW, COL);

						if (ret == '*')
						{
							system("cls");
							printf("玩家赢!\n");
							display_board(board, ROW, COL);//打印棋盘

							break;
						}
						if (ret == '#')
						{
							system("cls");

							printf("电脑赢!\n");
							display_board(board, ROW, COL);//打印棋盘

							break;
						}
						if (ret == 'Q')
						{
							system("cls");

							display_board(board, ROW, COL);//打印棋盘

							printf("平局!\n");
							break;
						}
					}
					else
					{
						system("cls");

						display_board(board, ROW, COL);
						ret = is_win(board, ROW, COL);


						if (ret == '*')
						{
							system("cls");

							printf("玩家赢!\n");
							display_board(board, ROW, COL);//打印棋盘

							break;
						}
						if (ret == '#')
						{
							system("cls");

							printf("电脑赢!\n");
							display_board(board, ROW, COL);//打印棋盘

							break;
						}
						if (ret == 'Q')
						{
							system("cls");

							printf("平局!\n");
							display_board(board, ROW, COL);//打印棋盘

							break;
						}
					}
				}
				else
				{
					system("cls");

					display_board(board, ROW, COL);//打印棋盘

					ret = is_win(board, ROW, COL);



					if (ret == '*')
					{
						system("cls");

						printf("玩家赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == '#')
					{
						system("cls");

						printf("电脑赢!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
					if (ret == 'Q')
					{
						system("cls");

						printf("平局!\n");
						display_board(board, ROW, COL);//打印棋盘

						break;
					}
				}

			}

			player_move(board, ROW, COL);//玩家下棋
			system("cls");


			display_board(board, ROW, COL);//打印棋盘
			ret = is_win(board, ROW, COL);

			if (ret == '*')
			{
				printf("玩家赢!\n");
				break;
			}
			if (ret == '#')
			{
				printf("电脑赢!\n");
				break;
			}
			if (ret == 'Q')
			{
				printf("平局!\n");
				break;
			}
		}



	}


}

🍰 🎂 game.c🍰 🎂

#include"game1.h"

//游戏菜单
void menu()
{
	printf("*****************************\n");
	printf("***********三子棋游戏********\n");
	printf("************1.play***********\n");
	printf("************0.exit***********\n");
	printf("*****************************\n");

}
//棋盘初始化函数
void init_board(char arr[][COL],int row,int col)
{
	int i = 0;
	int j = 0;
	for (i = 0 ;i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}

	}

}
//
//打印棋盘函数
void display_board(char arr[][COL], int row, int col)                           //最终棋盘:       |   |  
                                                                                //             ---|---|---
{                                                                               //                |   | 
	                                                                            //             ---|---|---
	printf(" 1 | 2 | 3 \n");	
	printf("---|---|---\n");
	int i = 0;                                          
	for (i = 0; i < row; i++)                            
	{
		
		int j = 0;
		for (j = 0; j < col; j++)//打印 %c | %c | %c   
			                            //把(   %c |  )看成一组
		{
			printf(" %c ", arr[i][j]);
			if (j == 2)
				printf("|%d", i+1);
			if (j < col - 1)//由于是不封闭棋盘,最后一列不打印
			{
				printf("|");
			}
		}
		printf("\n");
		if(i < row - 1)//打印---|---|---
		{
		for (j = 0; j < col; j++)
		{
			printf("---");
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		}

	}
	printf("\n");

}

//游戏下棋
void player_move(char arr[][COL], int row, int col)//玩家下棋
{
	printf("玩家下棋-》:\n");
	printf("请输入要下棋的坐标,用空格隔开。\n");
	int x = 0;
	int y = 0;
	while (1)
	{	scanf("%d %d", &x, &y);
	   
	
		if (x >= 1 && x <= col && y >= 1 && y <= row)
		{
			if (arr[x - 1][y - 1] == ' ')  //为什么是x-1,y-1呢?
										   //因为人下棋的时候坐标是从1开始下的,而数组的下标是从0开始的
			{
				arr[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("这里已经下过棋啦!请重新输入坐标\n");
			}
		}
		else
		{
			printf("你输入的坐标超出范围,请重新输入\n");


		}

	}
	
}
//电脑随机下棋
void computer_move(char arr[][COL], int row, int col)
{
	
	int x = 0;
	int y = 0;
	x = rand() % 3;   //由于棋盘的横坐标大小对于数组来说是0~2,所以设置随机数范围也是0~2
	y = rand() % 3;   //由于棋盘的横坐标大小对于数组来说是0~2,所以设置随机数范围也是0~2
	while (1)
	{
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#';
			break;
		}

	}
	
}

int is_full(char arr[][COL], int row, int col)//判断棋盘是否下满,下满返回1,未下满返回0;
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')
				return 0;

		}

	}return 1;
}
char is_win(char arr[][COL], int row, int col)//是否赢棋  玩家赢 返回*
                                                        //电脑赢  返回#
                                                         //棋盘下满平局 返回Q//继续下棋 返回C
{
	//判断三行
	int i = 0;
	for (i = 0; i < row; i++) 
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0]!= ' ')
			return arr[i][0];
	}
	//判断三列
	for (i = 0; i < col; i++) 
	{
		if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ')
			return arr[0][i];
	}
	//判断交叉线
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]&&arr[0][0] != ' ')
		return arr[0][0];
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] &&arr[0][2]!= ' ')
		return arr[0][2];
	if (is_full(arr, row, col) == 1)
	{
		return 'Q';
	}
	return 'C';
}



int computer_attack(char arr[][COL], int row, int col)//电脑进攻下棋,优先级要高于防守,判断是否快满足3个棋,如果满足电脑赢
{

	//q=1的时候表示已经走棋了
	int q = 0;
	for (int i = 0; i <= 2; i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][0] == '#' && arr[i][2] == ' ')
		{
			arr[i][2] = '#';
			q = 1;
			return q;
		}
		if (arr[i][0] == arr[i][2] && arr[i][0] == '#' && arr[i][1] == ' ')
		{
			arr[i][1] = '#';
			q = 1;
			return q;
		}
		if (arr[i][0] == arr[i][2] && arr[i][0] == '#' && arr[i][1] == ' ')
		{
			arr[i][0] = '#';
			q = 1;
			return q;
		}
	}
	//接下来走列
	for (int i = 1; i <= 2; i++)
	{
		if (arr[0][i] == arr[1][i] && arr[0][i] == '#' && arr[2][i] == ' ')
		{
			arr[2][i] = '#';
			q = 1;
			return q;
		}
		if (arr[0][i] == arr[2][i] && arr[0][i] == '#' && arr[1][i] == ' ')
		{
			arr[1][i] = '#';
			q = 1;
			return q;
		}
		if (arr[2][i] == arr[1][i] && arr[1][i] == '#' && arr[0][i] == ' ')
		{
			arr[0][i] = '#';
			q = 1;
			return q;
		}
	}
	//斜线
	if (arr[0][0] == arr[1][1] && arr[0][0] == '#' && arr[2][2] == ' ')
	{
		arr[2][2] = '#';
		q = 1;
		return q;
	}
	if (arr[0][0] == arr[2][2] && arr[0][0] == '#' && arr[1][1] == ' ')
	{
		arr[1][1] = '#';
		q = 1;
		return q;
	}
	if (arr[1][1] == arr[2][2] && arr[1][1] == '#' && arr[0][0] == ' ')
	{
		arr[0][0] = '#';
		return q;
	}
	//斜线
	if (arr[0][2] == arr[1][1] && arr[0][2] == '#' && arr[2][0] == ' ')
	{
		arr[2][0] = '#';
		q = 1;
		return q;
	}
	if (arr[0][2] == arr[2][0] && arr[2][0] == '#' && arr[1][1] == ' ')
	{
		arr[1][1] = '#';
		q = 1;
		return q;
	}
	if (arr[1][1] == arr[2][0] && arr[2][0] == '#' && arr[0][2] == ' ')
	{
		arr[0][2] = '#';
		q = 1;
		return q;
	}
	return q;
}
	int computer_defend(char arr[][COL], int row, int col)//电脑防守
	{
		int q = 0;
		//这里我们先判断玩家是否是要赢了
		for (int i = 0; i <= 2; i++)
		{
			if (arr[i][0] == arr[i][1] && arr[i][0] == '*' && arr[i][2] == ' ')
			{
				arr[i][2] = '#';
				q = 1;
				return q;
			}
			if (arr[i][0] == arr[i][2] && arr[i][2] == '*' && arr[i][1] == ' ')
			{
				arr[i][1] = '#';
				q = 1;
				return q;
			}
			if (arr[i][1] == arr[i][2] && arr[i][1] == '*' && arr[i][0] == ' ')
			{
				arr[i][0] = '#';
				q = 1;
				return q;
			}
		}
		for (int i = 0; i <= 2; i++)
		{
			if (arr[0][i] == arr[1][i] && arr[1][i] == '*' && arr[2][i] == ' ')
			{
				arr[2][i] = '#';
				q = 1;
				return q;
			}
			if (arr[0][i] == arr[2][i] && arr[2][i] == '*' && arr[1][i] == ' ')
			{
				arr[1][i] = '#';
				q = 1;
				return q;
			}
			if (arr[2][i] == arr[1][i] && arr[1][i] == '*' && arr[0][i] == ' ')
			{
				arr[0][i] = '#';
				q = 1;
				return q;
			}
		}
		//走到这里还差捺
		if (arr[0][0] == arr[1][1] && arr[1][1] == '*' && arr[2][2] == ' ')
		{
			arr[2][2] = '#';
			q = 1;
			return q;
		}
		if (arr[0][0] == arr[2][2] && arr[0][0] == '*' && arr[1][1] == ' ')
		{
			arr[1][1] = '#';
			q = 1;
			return q;
		}
		if (arr[1][1] == arr[2][2] && arr[1][1] == '*' && arr[0][0] == ' ')
		{
			arr[0][0] = '#';
			q = 1;
			return q;
		}
		//撇
		if (arr[0][2] == arr[1][1] && arr[1][1] == '*' && arr[2][0] == ' ')
		{
			arr[2][0] = '#';
			q = 1;
			return q;
		}
		if (arr[0][2] == arr[2][0] && arr[0][2] == '*' && arr[1][1] == ' ')
		{
			arr[1][1] = '#';
			q = 1;
			return q;
		}
		if (arr[1][1] == arr[2][0] && arr[1][1] == '*' && arr[0][2] == ' ')
		{
			arr[0][2] = '#';
			q = 1;
			return q;
		}
	


		return q;
	}
	
	

🥗 🥘game.h🥗 🥘

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<string.h>
#include<stdlib.h>

#define ROW 3
#define COL 3
void menu();//声明游戏菜单

void init_board(char arr[][COL], int row, int col);//棋盘初始化

void display_board(char arr[][COL], int row, int col);//打印棋盘

void game();

void player_move(char arr[][COL], int row, int col);//玩家下棋

void computer_move(char arr[][COL], int row, int col);//电脑随机下棋

int is_full(char arr[][COL], int row, int col);//棋盘是否满了,后面包含进is_win函数里面了

char is_win(char arr[][COL], int row, int col);//是否赢棋  玩家赢 返回*
                                                        //电脑赢  返回#
                                                         //棋盘下满平局 返回Q//继续下棋 返回C

int computer_attack(char arr[ROW][COL], int row, int col);//电脑进攻

int computer_defend(char arr[ROW][COL], int row, int col);//电脑防守






🥥 🥝 🍅运行截图🥥 🥝 🍅

 

 🍌 🍉 🍇 🍓  🍈 🍒 🍑 🥭 🍍 🥥 🥝 🍅 🍆 🥑 🥦 🥬

🍌 制作不易,如有帮助,请帮博主一键三连哦!!!🥦

🍌 制作不易,如有帮助,请帮博主一键三连哦!!!🥦

🍌 制作不易,如有帮助,请帮博主一键三连哦!!!🥦

 🍌 🍉 🍇 🍓  🍈 🍒 🍑 🥭 🍍 🥥 🥝 🍅 🍆 🥑 🥦 

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熬夜退役选手337

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值