欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-29 10:46:52
...

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,后者需放在循环外。