PTA-7-13-TicTacToe游戏-胜负判定正向简单思考
目录
PTA 7-13 TicTacToe游戏–胜负判定(正向简单思考)
通过这道题,可以重新思考%c与%s在输入字符时的不同点
井字棋是一种在3x3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边框,格线排成井字故得名。
游戏规则:由分别代表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:
X.O
OX.
O.X
输出样例2:
X win!
输入样例2:
O.O
XX.
X..
输出样例2:
No one win!
注意,本题的出错点在于输入字符串到数组中时对回车符号的忽略,导致错误。
在输入字符串时,我们有两种选择
1.0(%c输入,需要注意回车符)
#include<stdio.h>
int main(){
char a[3][3];
int i,x=0,o=0;
for(i=0;i<3;i++)
scanf("%c",&a[0][i]);
getchar();
for(i=0;i<3;i++)
scanf("%c",&a[1][i]);
getchar(); //用两个getchar()来吸收回车符
for(i=0;i<3;i++)
scanf("%c",&a[2][i]); //输入字符串
for(i=0;i<3;i++){
if(a[i][0]=='X'&&a[i][1]=='X'&&a[i][2]=='X')
x++;
else if(a[0][i]=='X'&&a[1][i]=='X'&&a[2][i]=='X')
x++;
else if(a[i][0]=='O'&&a[i][1]=='O'&&a[i][2]=='O')
o++;
else if(a[0][i]=='O'&&a[1][i]=='O'&&a[2][i]=='O') //行或列连成获胜情况
o++;
else if(a[0][0]=='X'&&a[1][1]=='X'&&a[2][2]=='X')
x++;
else if(a[0][0]=='O'&&a[1][1]=='O'&&a[2][2]=='O')
o++;
else if(a[2][0]=='X'&&a[1][1]=='X'&&a[0][2]=='X')
x++;
else if(a[2][0]=='O'&&a[1][1]=='O'&&a[0][2]=='O')
o++;} //对角线连成获胜情况
if(x==3||x==1)
printf("X win!");
else if(o==3||o==1)
printf("O win!");
else
printf("No one win!"); //当数字等于3时为对角线
//当数字等于1时为行或列
return 0;
}
2.0(%s 输入,遇到回车符停止,且该回车符不进入数组中)
#include<stdio.h>
int main(){
char a[3][3];
int i,x=0,o=0;
for(i=0;i<3;i++)
scanf("%s",a[i]); //输入字符串
for(i=0;i<3;i++){
if(a[i][0]=='X'&&a[i][1]=='X'&&a[i][2]=='X')
x++;
else if(a[0][i]=='X'&&a[1][i]=='X'&&a[2][i]=='X')
x++;
else if(a[i][0]=='O'&&a[i][1]=='O'&&a[i][2]=='O')
o++;
else if(a[0][i]=='O'&&a[1][i]=='O'&&a[2][i]=='O') //行或列连成获胜情况
o++;
else if(a[0][0]=='X'&&a[1][1]=='X'&&a[2][2]=='X')
x++;
else if(a[0][0]=='O'&&a[1][1]=='O'&&a[2][2]=='O')
o++;
else if(a[2][0]=='X'&&a[1][1]=='X'&&a[0][2]=='X')
x++;
else if(a[2][0]=='O'&&a[1][1]=='O'&&a[0][2]=='O')
o++;} //对角线连成获胜情况
if(x==3||x==1)
printf("X win!");
else if(o==3||o==1)
printf("O win!");
else
printf("No one win!"); //当数字等于3时为对角线
//当数字等于1时为行或列
return 0;
}