C语言实现三子棋

C语言实现三子棋,第1张

目录

一、整体逻辑

游戏界面截图

游戏的功能实现截图

二、代码的讲解

1.数组初始化函数

2.棋盘显示函数

3.玩家走棋函数

4.电脑走棋函数

5.胜负判断函数

6.棋盘满子函数

7.主函数

 

三、总结


一、整体逻辑

游戏界面截图

游戏的功能实现截图

 

 

 

二、代码的讲解 1.数组初始化函数
void board_init(char a[ROW][COL], int row, int col)//棋盘初始化函数
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			a[i][j] = ' ';
		}
	}
}
2.棋盘显示函数
void display(char a[ROW][COL], int row, int col)//显示棋盘函数
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)//对二维数组的行列循环扫描
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", a[i][j]);//把“空格%c空格”当做一个数组元素打印,每行打印3个
			if (j < col - 1)//同时打印完一个元素后打印分隔竖杠,最后一列不出现分隔竖杠,所以用if来判断打印到了第几列
				printf("|");
		}
		printf("\n");//每打印一行就实现换行
		for (j = 0; j < col; j++)//在同一个循环里面实现两次列的打印,上面的是打印空白+分隔,这里打印的是界面的“---”,也是当成一个元素打印
		{
			printf("---");
			if (j < col - 1)//同时打印完一个元素后打印分隔竖杠,最后一列不出现分隔竖杠,所以用if来判断打印到了第几列
				printf("|");
		}
		printf("\n");//上面的第i行元素打印完成,换到下一行打印	
	}
}
3.玩家走棋函数
void playermove(char a[ROW][COL], int row, int col)//玩家下棋
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请玩家输入坐标:>");
		scanf("%d%d", &x, &y);//输入坐标
		if (x >= 1 && x <= row && y >= 1 && y <= col)//判断输入的坐标是否合法
		{
			if (a[x - 1][y - 1] == ' ')//判断想要输入的坐标是否有棋子
			{
				a[x - 1][y - 1] = '*';//‘*’代表玩家落棋
				break;//落棋完成退出循环,到下一个函数实现功能
			}
			else//棋盘落子位置已下有棋,则给玩家打印提示信息
				printf("坐标被占用\n");
		}
		else//坐标非法,则提示玩家重新输入
			printf("坐标输入有误,请重新输入!");
	}
}
4.电脑走棋函数
void computermove(char a[ROW][COL], int row, int col)//电脑下棋
{
	printf("电脑下棋\n");
	int x = 0;
	int y = 0;
	while (1)//电脑下棋,用随机数来实现模拟电脑下棋
	{
		x = rand() % row;//调用rand函数,再对所取的数对3取模,把这个随机数固定在0~2
		y = rand() % col;//同理
		if (a[x][y] == ' ')//在棋盘为空的地方落棋,用if判断
		{
			a[x][y] = '#';
			break;
		}
	}
}
5.胜负判断函数
char winorlose(char a[ROW][COL], int row, int col)//判断输赢
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)//行胜利的判断
	{
		j = 0;
		while (j <= col - 2)
		{
			if (a[i][j] == a[i][j + 1] && a[i][j] != ' ')//先判断每一行的第一个元素和第二个元素是否相等,并且不能为空格
			{
				j += 1;//如果每一行的第一个元素和第二个元素相等,则跳到下一个元素
				if (a[i][j] == a[i][j + 1])//如果下一个元素和最后一个元素相等,则返回元素字符,通过返回的字符判断是电脑赢还是玩家赢
				{
					return a[i][j];
				}		
			}
			j++;
		}
	}
	for (j = 0; j < col; j++)//列胜利的判断,这里的判断与行判断同理
	{
		i = 0;
		while (i <= row - 2)
		{
			if (a[i][j] == a[i+1][j] && a[i][j] != ' ')
			{
				i += 1;
				if (a[i][j] == a[i + 1][j])
				{			
					return a[i][j];				
				}
			}
			i++;
		}
	}
	i = 0;//这里把元素定位到左上角
	j = 0;
	while (i <= (row - 2) && j <= (col - 2))//左上角到右下角对角线的胜利判断
	{
		if (a[i][j] != ' '&&a[i][j]==a[i+1][j+1] )//判断对角线的第一个元素与第二个元素是否相等,并且元素不能为空格
		{
			i += 1;//如果相等,则对对角线的下一个元素进行比较
			j += 1;
			if (a[i][j] == a[i + 1][j + 1])//如果第二个元素和第三个元素相等,则第一个元素和第三个元素相等,则判断出胜利条件
			{		
				return a[i][j];			//返回元素字符,用以判断是玩家胜利还是电脑胜利	
			}
		}	
		i++;//用以退出循环,不写会死循环
		j++;
	}
	i = 0;
	j = col - 1;
	while (i <= row - 2)//右上角到左下角的胜利判断
	{
		if (a[i][j] != ' '&&a[i][j]==a[i+1][j-1])//这里的判断与上面的同理,只是要注意行列是怎么变化的
		{
			i += 1;
			j -= 1;
			if (a[i][j] == a[i + 1][j - 1])
			{
				return a[i][j];
			}	
		}	
		i++;
	}
	if (fullornot(a, ROW, COL))
		return 1;
	return 'c';
}
6.棋盘满子函数
int fullornot(char a[ROW][COL], int row, int col)//判断棋盘是否满子,满子即平局
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)//原理是对整个数组元素遍历,如果发现有元素仍为空格,则返回0,否则遍历完成还没有发现空格,则退出循环返回1
	{
		for (j = 0; j < col; j++)
		{
			if (a[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
7.主函数
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	char a[ROW][COL] = { 0 };
	menu();
	printf("请输入数字:>");
	scanf("%d", &input);
	while (input)
	{
		switch (input)
		{
		case 1:
			game(a, ROW, COL);
			break;
		case 0:
			break;
		default:
			printf("输入错误,请重新选择:>");
			break;
		}
		menu();
		printf("请选择:>");
		scanf("%d", &input);
	}
	return 0;
}
 
三、总结

三子棋代码实现起来不难,主要考验的是代码的逻辑关系,很适合初学者手敲,用到的知识就函数,数组,还有循环结构。

有些地方写的不是很好,比如胜负的判断那里,纯纯就是按照三子棋来写的,代码的复用性不高,后续的话会写一个5子棋,也算是锻炼锻炼自己。

其次是我写的博客次数不多,可能写的不是很好,希望大家凑合着看吧

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

原文地址:https://54852.com/langs/872619.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存