温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言如何开发实现井字棋

发布时间:2022-03-03 15:19:02 来源:亿速云 阅读:134 作者:小新 栏目:开发技术

这篇文章主要为大家展示了“C语言如何开发实现井字棋”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言如何开发实现井字棋”这篇文章吧。

    总体思路

    井字棋棋盘我们总体可以当成一个二维数组来操作,我们分别需要实现初始化二维数组,打印棋盘,玩家下棋,电脑下棋,判断输赢等代码

    项目的创建

    C语言如何开发实现井字棋

    我们创建了头文件用于放函数的声明,game.c文件放置函数的实现,test.c文件用于测试。

    测试结果

    电脑获胜:

    C语言如何开发实现井字棋

    玩家获胜:

    C语言如何开发实现井字棋

    平局:

    C语言如何开发实现井字棋

    各函数代码的实现

    我们在game.c文件中实现函数功能的代码

    初始化二维数组

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

    打印棋盘

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

    这里的棋盘我们只打印了井字的形状,如果为了美观,还可以进行封边,这里就留给朋友们自行实现啦。

    玩家下棋

    void PlayMove(char Board[ROW][COL], int row, int col)
    {	
    	while (1)
    	{
    		int x = 0, y = 0;
    		printf("请输入坐标:\n");
    		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");
    		}
    	}
    }

    电脑下棋

    在电脑落子之前,先检测有没有下一步可以直接赢的,若有,则落子在此处,电脑获胜,若没有,再检测玩家下一步是否有机会获胜,若玩家下一步可以直接获胜,那么电脑将抢占这一步。

    如果上述两种情况均不存在,当发现(1,1)位置是空时,电脑先下这一步。

    其他情况均随意落子。

    void ComputerMove(char Board[ROW][COL], int row, int col)
    {
    	int x = 0, y = 0;
    	while (1)
    	{
    		if (JudgeComputer(Board, ROW, COL))
    		{
    			for (int i = 0; i < row; i++)
    			{
    				if (Board[i][0] == Board[i][1] && Board[i][0] == '*' && Board[i][2] == ' ')
    				{
    					Board[i][2] = '*';
    					return;
    				}
    				else if (Board[i][0] == Board[i][2] && Board[i][0] == '*' && Board[i][1] == ' ')
    				{
    					Board[i][1] = '*';
    					return;
    				}
    				else if (Board[i][1] == Board[i][2] && Board[i][1] == '*' && Board[i][0] == ' ')
    				{
    					Board[i][0] = '*';
    					return;
    				}
    			}
    			for (int j = 0; j < col; j++)
    			{
    				if (Board[0][j] == Board[1][j] && Board[0][j] == '*' && Board[2][j] == ' ')
    				{
    					Board[2][j] = '*';
    					return;
    				}
    				else if (Board[0][j] == Board[2][j] && Board[0][j] == '*' && Board[1][j] == ' ')
    				{
    					Board[1][j] = '*';
    					return;
    				}
    				else if (Board[1][j] == Board[2][j] && Board[1][j] == '*' && Board[0][j] == ' ')
    				{
    					Board[0][j] = '*';
    					return;
    				}
    			}
    			if (Board[0][0] == Board[1][1] && Board[0][0] == '*' && Board[2][2] == ' ')
    			{
    				Board[2][2] = '*';
    				return;
    			}
    			else if (Board[0][0] == Board[2][2] && Board[0][0] == '*' && Board[1][1] == ' ')
    			{
    				Board[1][1] = '*';
    				return;
    			}
    			else if (Board[1][1] == Board[2][2] && Board[1][1] == '*' && Board[0][0] == ' ')
    			{
    				Board[0][0] = '*';
    				return;
    			}
    			else if (Board[0][2] == Board[1][1] && Board[0][2] == '*' && Board[2][0] == ' ')
    			{
    				Board[2][0] = '*';
    				return;
    			}
    			else if (Board[0][2] == Board[2][0] && Board[0][2] == '*' && Board[1][1] == ' ')
    			{
    				Board[1][1] = '*';
    				return;
    			}
    			else if (Board[2][0] == Board[1][1] && Board[2][0] == '*' && Board[0][2] == ' ')
    			{
    				Board[0][2] = '*';
    				return;
    			}
    		}
    		else if (JudgePlayer(Board, ROW, COL))
    		{
    			for (int i = 0; i < row; i++)
    			{
    				if (Board[i][0] == Board[i][1] && Board[i][0] == '#' && Board[i][2] == ' ')
    				{
    					Board[i][2] = '*';
    					return;
    				}
    				else if (Board[i][0] == Board[i][2] && Board[i][0] == '#' && Board[i][1] == ' ')
    				{
    					Board[i][1] = '*';
    					return;
    				}
    				else if (Board[i][1] == Board[i][2] && Board[i][1] == '#' && Board[i][0] == ' ')
    				{
    					Board[i][0] = '*';
    					return;
    				}
    			}
    			for (int j = 0; j < col; j++)
    			{
    				if (Board[0][j] == Board[1][j] && Board[0][j] == '#' && Board[2][j] == ' ')
    				{
    					Board[2][j] = '*';
    					return;
    				}
    				else if (Board[0][j] == Board[2][j] && Board[0][j] == '#' && Board[1][j] == ' ')
    				{
    					Board[1][j] = '*';
    					return;
    				}
    				else if (Board[1][j] == Board[2][j] && Board[1][j] == '#' && Board[0][j] == ' ')
    				{
    					Board[0][j] = '*';
    					return;
    				}
    			}
    			if (Board[0][0] == Board[1][1] && Board[0][0] == '#' && Board[2][2] == ' ')
    			{
    				Board[2][2] = '*';
    				return;
    			}
    			else if (Board[0][0] == Board[2][2] && Board[0][0] == '#' && Board[1][1] == ' ')
    			{
    				Board[1][1] = '*';
    				return;
    			}
    			else if (Board[1][1] == Board[2][2] && Board[1][1] == '#' && Board[0][0] == ' ')
    			{
    				Board[0][0] = '*';
    				return;
    			}
    			else if (Board[0][2] == Board[1][1] && Board[0][2] == '#' && Board[2][0] == ' ')
    			{
    				Board[2][0] = '*';
    				return;
    			}
    			else if (Board[0][2] == Board[2][0] && Board[0][2] == '#' && Board[1][1] == ' ')
    			{
    				Board[1][1] = '*';
    				return;
    			}
    			else if (Board[2][0] == Board[1][1] && Board[2][0] == '#' && Board[0][2] == ' ')
    			{
    				Board[0][2] = '*';
    				return;
    			}
    		}
    		else
    		{
    			if (Board[1][1] == ' ')
    			{
    				Board[1][1] = '*';
    				return;
    			}
    			else
    			{
    				x = rand() % row;
    				y = rand() % col;
    				if (Board[x][y] == ' ')
    				{
    					Board[x][y] = '*';
    					break;
    				}
    			}
    		}
    	}
    }

    判断电脑是否有位置可以获胜

    static int JudgeComputer(char Board[ROW][COL], int row, int col)
    {
    	for (int i = 0; i < row; i++)
    	{
    		if (Board[i][0] == Board[i][1] && Board[i][0] == '*' && Board[i][2] == ' ')
    			return 1;
    		else if (Board[i][0] == Board[i][2] && Board[i][0] == '*' && Board[i][1] == ' ')
    			return 1;
    		else if (Board[i][1] == Board[i][2] && Board[i][1] == '*' && Board[i][0] == ' ')
    			return 1;
    	}
    	for (int j = 0; j < col; j++)
    	{
    		if (Board[0][j] == Board[1][j] && Board[0][j] == '*' && Board[2][j] == ' ')
    			return 1;
    		else if (Board[0][j] == Board[2][j] && Board[0][j] == '*' && Board[1][j] == ' ')
    			return 1;
    		else if (Board[1][j] == Board[2][j] && Board[1][j] == '*' && Board[0][j] == ' ')
    			return 1;
    	}
    	if (Board[0][0] == Board[1][1] && Board[0][0] == '*' && Board[2][2] == ' ')
    		return 1;
    	else if (Board[0][0] == Board[2][2] && Board[0][0] == '*' && Board[1][1] == ' ')
    		return 1;
    	else if (Board[1][1] == Board[2][2] && Board[1][1] == '*' && Board[0][0] == ' ')
    		return 1;
    	else if (Board[0][2] == Board[1][1] && Board[0][2] == '*' && Board[2][0] == ' ')
    		return 1;
    	else if (Board[0][2] == Board[2][0] && Board[0][2] == '*' && Board[1][1] == ' ')
    		return 1;
    	else if (Board[2][0] == Board[1][1] && Board[2][0] == '*' && Board[0][2] == ' ')
    		return 1;
    	else
    		return 0;
    }

    判断玩家是否有位置获胜

    static int JudgePlayer(char Board[ROW][COL], int row, int col)
    {
    	for (int i = 0; i < row; i++)
    	{
    		if (Board[i][0] == Board[i][1] && Board[i][0] == '#' && Board[i][2] == ' ')
    			return 1;
    		else if (Board[i][0] == Board[i][2] && Board[i][0] == '#' && Board[i][1] == ' ')
    			return 1;
    		else if (Board[i][1] == Board[i][2] && Board[i][1] == '#' && Board[i][0] == ' ')
    			return 1;
    	}
    	for (int j = 0; j < col; j++)
    	{
    		if (Board[0][j] == Board[1][j] && Board[0][j] == '#' && Board[2][j] == ' ')
    			return 1;
    		else if (Board[0][j] == Board[2][j] && Board[0][j] == '#' && Board[1][j] == ' ')
    			return 1;
    		else if (Board[1][j] == Board[2][j] && Board[1][j] == '#' && Board[0][j] == ' ')
    			return 1;
    	}
    	if (Board[0][0] == Board[1][1] && Board[0][0] == '#' && Board[2][2] == ' ')
    		return 1;
    	else if (Board[0][0] == Board[2][2] && Board[0][0] == '#' && Board[1][1] == ' ')
    		return 1;
    	else if (Board[1][1] == Board[2][2] && Board[1][1] == '#' && Board[0][0] == ' ')
    		return 1;
    	else if (Board[0][2] == Board[1][1] && Board[0][2] == '#' && Board[2][0] == ' ')
    		return 1;
    	else if (Board[0][2] == Board[2][0] && Board[0][2] == '#' && Board[1][1] == ' ')
    		return 1;
    	else if (Board[2][0] == Board[1][1] && Board[2][0] == '#' && Board[0][2] == ' ')
    		return 1;
    	else
    		return 0;
    }

    判断输赢

    char IsWin(char Board[ROW][COL], int row, int col)
    for (int i = 0; i < row; i++)
    	{
    		if (Board[i][0] == Board[i][1] && Board[i][2] == Board[i][1] && Board[i][1] != ' ')
    		{
    			return Board[i][0];
    		}
    	}
    	for (int j = 0; j < col; j++)
    	{
    		if (Board[0][j] == Board[1][j] && Board[1][j] == Board[2][j] && Board[j][1] !=  ' ')
    		{
    			return Board[0][j];
    		}
    	}
    	if (Board[0][0] == Board[1][1] && Board[2][2] == Board[1][1] && Board[2][2] != ' ')
    		return Board[0][0];
    	if (Board[0][2] == Board[1][1] && Board[2][0] == Board[1][1] && Board[1][1] != ' ')
    		return Board[1][1];
    	if (IsFull(Board, ROW, COL))
    	{
    		return 'o';
    	}
    	return 'C';
    }

    判断和棋

    static int IsFull(char Board[ROW][COL], int row, int col)
    {
    	for (int i = 0; i < row; i++)
    	{
    		for (int j = 0; j < col; j++)
    		{
    			if (Board[i][j] == ' ')
    				return 0;
    		}
    	}
    	return 1;
    }

    声明代码

    我们在game.h头文件中进行函数的声明。

    void meun();
    #define ROW 3
    #define COL 3
    //游戏主函数
    void game();
    //初始化二维数组
    void InitBoard(char Board[ROW][COL], int row, int col);
    //打印棋盘
    void DisplayBoard(char Board[ROW][COL], int row, int col);
    //玩家下棋
    void PlayMove(char Board[ROW][COL], int row, int col);
    //电脑下棋
    void ComputerMove(char Board[ROW][COL], int row, int col);
    //判断赢否
    char IsWin(char Board[ROW][COL], int row, int col);
    //判断棋盘满了吗
    //int IsFull(char Board[ROW][COL], int row, int col);
    //判断电脑下一部是否可以直接赢
    //int JudgeComputer(char Board[ROW][COL], int row, int col);
    //判断玩家下一步是否会赢
    //int JudgePlayer(char Board[ROW][COL], int row, int col);

    测试代码

    我们在test.c文件中测试该游戏。

    #include "game.h"
    void game()
    {
    	char ret = 0;
    	char Board[ROW][COL] = { 0 };
    	//初始化数组
    	InitBoard(Board, ROW, COL);
    	//打印棋盘
    	printf("棋盘如下:\n");
    	DisplayBoard(Board, ROW, COL);
    	while (1)
    	{
    		//玩家下棋
    		printf("玩家落子:\n");
    		PlayMove(Board, ROW, COL);
    		//每下一步打印一次棋盘
    		DisplayBoard(Board, ROW, COL);
    		//每下一步判断一次胜负
    		ret = IsWin(Board, ROW, COL);
    		if (ret != 'C')
    		{
    			break;
    		}
    		//电脑下棋
    		printf("电脑落子:\n");
    		ComputerMove(Board, ROW, COL);
    		//每下一步打印一次棋盘
    		DisplayBoard(Board, ROW, COL);
    		ret = IsWin(Board, ROW, COL);
    		if (ret != 'C')
    		{
    			break;
    		}
    	}
    	if (ret == '#')
    		printf("玩家获胜\n");
    	else if (ret == '*')
    		printf("电脑获胜\n");
    	else if (ret == 'o')
    		printf("卧龙凤雏\n");
    }
    void test()
    {
    	int input = 0;
    	srand((size_t)time(NULL));
    	do
    	{
    		meun();
    		printf("请选择:>");
    		scanf("%d", &input);
    		switch (input)
    		{
    		case 1:
    			game();
    			break;
    		case 0:
    			printf("游戏结束\n");
    			break;
    		default:
    			printf("输入错误,请重新输入:\n");
    			break;
    		}
    	} while (input);
    }
    int main()
    {
    	test();
    	return 0;
    }

    以上是“C语言如何开发实现井字棋”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI