一、tic-tac-toe连珠游戏的介绍
在3行3列的九宫格上进行的连珠游戏,只需用笔在白纸上画两条横线和两条竖线构成九宫格,
形似汉字"井"。两名游戏选手分别代表X和O,这两名选手轮流在"井"字棋盘的格子内画X和O。
第一个把相同的符号(X或O)连成一条直线的选手获胜。
二、本文的目的
判断一个3行3列的二维数组是否存在获胜方。
三、本文展示的算法的突出特点
使用一个二重循环实现行检查和列检查。
四、C语言代码
#include<stdio.h>
/*程序采用单一出口,根据不同情况下的返回值ret去判断获胜一方的符号*/
int main()
{
/* 数组的行数、列数 */
int row=3,column=3;
int a[row][column];
/* 行下标(索引)、列下标(索引) */
int i,j;
/* 每一行所有元素之和、每一列所有元素之和 */
int sum_row,sum_column;
/* 返回值初始化为2
如果不存在三个相同的符号连成一条直线的情况,返回值默认是2*/
int ret=2;
/* 提示信息 */
printf("Enter a two dimensional array.\n");
printf("For example:\t1\t 0\t 1\n");
printf("\t\t1\t 0\t 1\n");
printf("\t\t0\t 1\t 0\n");
printf("\n\nPlease enter a two dimensional array.\n");
/* 输入一个二维数组 */
for(i=0;i<row;i++)
{
for(j=0;j<column;j++)
{
scanf("%d",&a[i][j]);
}
}
/* 一个二重循环实现行检查和列检查
数学原理:第一行所有元素的行下标(i)和列下标(j)交换之后,
表示第一列的所有元素。
同理,第二行所有元素的行下表(i)和列下标(j)交换之后,
表示第二列的所有元素。
同理,第三行所有元素的行下表(i)和列下标(j)交换之后,
表示第三列的所有元素。*/
for(i=0;i<row;i++)
{
sum_row=0;
sum_column=0;
for(j=0;j<column;j++)
{
/* 第i行的所有元素之和 */
sum_row+=a[i][j];
/* 第i列的所有元素之和 */
sum_column+=a[j][i];
}
/* 检查行 */
if(sum_row==0 || sum_row==3)
{
/* 返回值是第i行第0列的元素的值 */
ret=a[i][0];
}
/* 检查列 */
else if(sum_column==0 || sum_column==3)
{
/* 返回值是第0行第i列的元素的值 */
ret=a[0][i];
}
/* 检查对角线 */
else if(a[0][0]+a[1][1]+a[2][2]==0 || a[0][0]+a[1][1]+a[2][2]==3 || a[0][2]+a[1][1]+a[2][0]==0 || a[0][2]+a[1][1]+a[2][0]==3)
{
ret=a[1][1];
}
if(ret==2)
{
continue;
}
else
{
break;
}
}
/* 判断返回值
如果返回值是0或1,输出获胜者的符号。
否则,输出"No one wins" */
switch(ret)
{
/* 利用switch-case多分支语句的性质
执行某个case语句,如果这个case语句中没有设置break语句,
那么执行完这个case语句后会继续执行后面的case语句,
直到遇到break语句或者执行完所有剩余语句才结束 */
case 0:
case 1:
{
printf("The winner is %d\n",ret);
break;
}
default:
{
printf("no one wins\n");
}
}
return 0;
}