题目内容:TicTacToe游戏–胜负判定

井字棋是一种在3×3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边框,格线排成井字故得名。

游戏规则:由分别代表O和X的两个游戏者轮流在格子里留下标记。由最先在任意一条直线上成功连接三个标记的一方获胜。(摘抄自百度百科)

读入一个3X3的二维数组,数组元素为’X’表示下X,元素为’O’表示下O,数组元素为’.’(英文符号“点”)表示未下棋,现编写程序进行当前胜负的判断,如果X方胜,则显示”X win!”,如果O方胜,则显示”O win!”,如果无人获胜,则显示”No one win!”。

输入格式:

读入一个3X3的二维数组,数组元素为’X’表示下X,元素为’O’表示下O,数组元素为’.’(英文符号“点”)表示未下棋。

输出格式:

若X方胜,则显示”X win!”;若O方胜,则显示”O win!”;若无人获胜,则显示”No one win!”。

输入样例1:

  1. X . O

  2. O X .

  3. O . X

输出样例2:

X win!

输入样例2:

  1. O . O

  2. X X .

  3. X . .

输出样例2:

No one win!

解决思路:

1、将”O” “X” “.”数字化,分别为”1” “-1” “0”,然后存入3行3列的整型数组a。

2、求数组a中”每一条直线“的合,然后依次存入数组b。

3、检测数组b。若有值等于3,说明存在”O”三连成线;若有值等于-3,说明存在”X”三连成线。

4、利用p,q分析数据并输出结果。

代码如下:

#includeint main(){int i,j,m[3][3],n[8],p=0,q=0;char a;for(i=0;i<3;i++){for(j=0;j<3;j++){a=getchar();switch(a){case 'O':m[i][j]=1;break;case 'X':m[i][j]=-1;break;case '.':m[i][j]=0;break;}}getchar();}n[0]=m[0][0]+m[0][1]+m[0][2];n[1]=m[1][0]+m[1][1]+m[1][2];n[2]=m[2][0]+m[2][1]+m[2][2];n[3]=m[0][0]+m[1][0]+m[2][0];n[4]=m[0][1]+m[1][1]+m[2][1];n[5]=m[0][2]+m[1][2]+m[2][2];n[6]=m[0][0]+m[1][1]+m[2][2];n[7]=m[0][2]+m[1][1]+m[2][0];for(i=0;i<8;i++){if(n[i] == 3) p++;else if(n[i] == -3) q++;}if(p == 0 && q != 0) printf("X win!");else if(p != 0 && q ==0) printf("O win!");else printf("No one win!");return 0;}