当前位置: 首页 > 工具软件 > tictac > 使用案例 >

二维数组应用之tic-tac-toe游戏胜负判断

冯良才
2023-12-01

博主不定期更新【保研/推免、C/C++、5G移动通信、Linux、生活随笔】系列文章,喜欢的朋友【点赞+关注】支持一下吧!


tic-tac-toe游戏

  读入一个3×3矩阵,矩阵中的数字为1表示该位置上有一个X,为0表示该位置上有一个O,要求编写程序判断这个矩阵中是否有获胜的一方,输出表示获胜一方的字符X或O,或输出无人获胜。
  本游戏获胜是指在同一行、同一列或同一对角线上,有三个相同字符。
  代码如下:

#include <stdio.h>

int main()
{
	//定义变量 
	const int size = 3;
	int board[size][size];
	int i, j;
	int numofXr, numofOr;  //numofXr表示同一行row中X的个数, numofOr表示同一行中O的个数
	int numofXc, numofOc;  //numofXc表示同一列column中X的个数, numofOc示同一列中O的个数
	int numofXd1, numofOd1, numofXd2, numofOd2;  //numofXd表示对角线diagonal上X的个数, numofOd表示对角线上O的个数,d1表示主对角线,d2表示次对角线 
	int result = -1;  // -1表示没人赢,1表示X赢,0表示O赢
	
		
	//读入矩阵
	for (i=0; i<size; i++)
	{
		for (j=0; j<size; j++)
		{
			scanf("%d", &board[i][j]);
		}
	} 
	
	//判断行和列 
	for (i=0; i<size && result==-1; i++) 
	{
		numofXr =  numofOr = numofXc = numofOc = 0;
		for (j=0; j<size; j++)
		{
			//判断行
			if (board[i][j] == 1)
			{
				numofXr++;
			}
			else
			{
				numofOr++;
			}
			//判断列
			if (board[j][i] == 1)
			{
				numofXc++;
			}
			else
			{
				numofOc++;
			}
		}
		if (numofXr == size || numofXc == size)
		{
			result = 1;
		}
		else if (numofOr == size || numofOc == size)
		{
			result = 0;
		}
	
	} 
	
	//判断对角线 
	numofXd1 = numofOd1 = numofXd2 = numofOd2 = 0;  //此处初始化值需要在循环外面,而在判断行与列时初始化在循环里面,注意区分。 
	for (i=0; i<size && result==-1; i++)
	{
		if (board[i][i] == 1)
		{
			numofXd1++;
		}
		else
		{
			numofOd1++;
		}
		if (board[i][size-i-1] == 1)
		{
			numofXd2++;
		}
		else
		{
			numofOd2++;
		}
	}
	if (numofXd1 == size || numofXd2 == size)
	{
		result = 1;
	}
	else if (numofOd1 == size || numofOd2 == size)
	{
		result = 0;
	}	
	
	//输出结果 
	switch (result)
	{
		case -1:
			printf("没有人赢\n");
			break;
		case 0:
			printf("O\n");
			break;
		case 1:
			printf("X\n");
			break;
		default:
			printf("Error!\n");
			break;
	}
	
	return 0;
}

  此程序编写过程中需注意以下几点:
1.数组初始化 例如:int board[3][3]={1,0,1,0,1,0,0,0,1}; 在定义数组时给数组初始化称为数组的集成初始化,以上方式初始化只能在定义数组时(且数组定义中不能含有变量如board[size][size]),如果定义时没有给数组初始化(或者定义数组时使用了变量),则初始化数组只能通过遍历用for循环来实现;
常见错误及正确初始化方式:

//常见错误1
int a[3][3];
a[3][3] = {1,0,1,0,1,0,0,0,1}; 
//常见错误2
int size = 3;
int a[size][size] = {1,0,1,0,1,0,0,0,1}; 
//正确初始化1
int a[3][3] = {1,0,1,0,1,0,0,0,1}; 
//正确初始化2
int size = 3;
int a[size][size]; //以上两句也可以是 int a[3][3];
for (i=0, i<size, i++)
{
	for (j=0, j<size, j++)
	{
		a[i][j]=i*j;
	}
}

2.由于矩阵是3×3矩阵,因此判断行与列时,只是下标i与j的互换,因此可以利用矩阵下标的对称性简化程序,将行、列放在一个循环中判断即可。

3.在判断行列与判断对角线上是否有三个同样的符号时,需要注意,判断行列时是逐行或逐列判断,而判断对角线是整个矩阵只判断一次,因此,计数值初始化位置不同,前者需放在循环内,每次循环重新至0,后者需放在循环外。

 类似资料: