最近学C语言,学到了循环这一节,按照书上代码写了一个井字棋游戏,运行起来可以出现书上的效果,但是,测试时出现了问题。
先上原代码。
#include <stdio.h>
#include <stdbool.h>
int main(void){
int player=0;
int winner=0;
int choice=0;
unsigned int row=0;
unsigned int column=0;
char board[3][3]={
{'1','2','3'},
{'4','5','6'},
{'7','8','9'}
};
for(unsigned int i=0;i<9&&winner==0;++i){
player=i%2+1;
printf(" %c | %c | %c \n",board[0][0],board[0][1],board[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",board[1][0],board[1][1],board[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",board[2][0],board[2][1],board[2][2]);
printf("---+---+---\n");
do{
printf("玩家 %d ,请在合适的位置输入 %c ",player,(player==1)?'X':'O');//原文是英文,改为了中文
scanf("%d",&choice);
row=--choice/3;
column=choice%3;
}while(choice<0||choice>8||board[row][column]>'9');
board[row][column]=(player==1)?'X':'O';
if((board[0][0]==board[1][1]&&board[0][0]==board[2][2])||
(board[0][2]==board[1][1]&&board[0][2]==board[2][0])){
winner=player;
}else{
for(unsigned int line=0;line<2;++line){
if(board[line][0]==board[line][1]&&board[line][0]==board[line][2]||
board[0][line]==board[1][line]&&board[0][line]==board[2][line]){
winner=player;
}
}
}
}
printf("\n");
printf(" %c | %c | %c \n",board[0][0],board[0][1],board[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",board[1][0],board[1][1],board[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",board[2][0],board[2][1],board[2][2]);
printf("---+---+---\n");
if(winner){
printf("\n%d,你赢了\n",player);//原文是英文,改为了中文
}else{
printf("真没意思,平局\n");//原文是英文,改为了中文
}
return 0;
}
运行起来如下图。
似乎还阔以。然而,输入其他的,比如输入一个字符'a',就是如下图。
改。过程比较艰辛,其实不难,只是对C语言的输入方法不了解,调试过程中出现了不限于二次出现输入提示,必须再次点击enter键等。最终解决了,又加了一些提高用户体验的功能。最终版代码如下。
#include <stdio.h>
#include <stdbool.h>
int main(void){
int player=0;
int winner=0;
int choice=0;
char ctemp=0;
unsigned int row=0;
unsigned int column=0;
bool inputright=true;
bool isover=false;
char board[3][3]={
{'1','2','3'},
{'4','5','6'},
{'7','8','9'}
};
for(unsigned int i=0;i<9&&winner==0;++i){
player=i%2+1;
printf(" %c | %c | %c \n",board[0][0],board[0][1],board[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",board[1][0],board[1][1],board[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",board[2][0],board[2][1],board[2][2]);
printf("---+---+---\n");
do{
if(inputright){
if(isover){
printf("玩家 %d ,此位置已有占用,请重新选择合适的位置输入 %c ",player,(player==1)?'X':'O');
}else{
printf("玩家 %d ,请在合适的位置输入 %c ",player,(player==1)?'X':'O');
}
}else{
printf("玩家 %d ,您输入错了,请重新在合适的位置输入 %c ",player,(player==1)?'X':'O');
}
scanf("%c",&ctemp);
if(ctemp<49||ctemp>57){//不在0-9范围之内
choice=0;
//--i;
inputright=false;
//continue;
}else{
choice=ctemp-48;
row=--choice/3;
column=choice%3;
inputright=true;
isover=false;
}
if(board[row][column]>'9'){
isover=true;
}
getchar();
}while(choice<0||choice>8||board[row][column]>'9'||inputright==false);
if(inputright){
board[row][column]=(player==1)?'X':'O';
}
if((board[0][0]==board[1][1]&&board[0][0]==board[2][2])||
(board[0][2]==board[1][1]&&board[0][2]==board[2][0])
){
winner=player;
}else{
for(unsigned int line=0;line<2;++line){
if(board[line][0]==board[line][1]&&board[line][0]==board[line][2]||
board[0][line]==board[1][line]&&board[0][line]==board[2][line]
){
winner=player;
}
}
}
}
printf("\n");
printf(" %c | %c | %c \n",board[0][0],board[0][1],board[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",board[1][0],board[1][1],board[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n",board[2][0],board[2][1],board[2][2]);
printf("---+---+---\n");
if(winner){
printf("\n%d,你赢了\n",player);
}else{
printf("真没意思,平局\n");
}
return 0;
}
运行起来如下图。
还阔以。但是,只是现有的问题解决了,或许仍需要进一步测试,比如输入了中文字符,或者其他的情况。