C语言如果没有学过指针,这个代码还能简化吗?
#include <stdio.h>int main(){
int x,y;
int xy={
{8,8,8},
{8,8,8},
{8,8,8},
};
int i=2;
printf("1 2 3\n\n1 %d|%d|%d\n-----\n2 %d|%d|%d\n-----\n3 %d|%d|%d\n",xy, xy, xy, xy, xy, xy, xy, xy, xy);//排出井字棋
while(i==2){
const int SIZE = 3;
int t,j;
int hz,hf,lz,lf,zdjz,zdjf,fdjz,fdjf; //定义行,列,对角线的正反方计数变量
hz=hf=lz=lf=zdjz=zdjf=fdjz=fdjf=0;//初始化变量
//输入
do{
printf("正方,请在8的区域输入:");
scanf("%d,%d", &x, &y);
} while(xy!=8 || x>3 || x<1 || y>3 || y<1 );//检查
xy=1; //1为正方
printf("1 2 3\n\n1 %d|%d|%d\n-----\n2 %d|%d|%d\n-----\n3 %d|%d|%d\n",xy, xy, xy, xy, xy, xy, xy, xy, xy);//排出井字棋
//循环判断
for(t=0; t<SIZE; t++){
hz=lz=0;
for(j=0; j<SIZE; j++){
//检查行
if(xy==1 && xy!=8){
hz++;
}
if(hz==3){
i=1;
goto out;
}
//检查列
if(xy==1 && xy!=8){
lz++;
}
if(lz==3){
i=1;
goto out;
}
}
//检查正对角线
if(xy==1 && xy!=8){
zdjz++;
}
if(zdjz==3){
i=1;
goto out;
}
//检查反对角线
if(xy==1 && xy!=8){
fdjz++;
}
if(fdjz==3){
i=1;
goto out;
}
}
// printf("hz:%d,lz:%d,zdjz:%d,fdjz:%d\n\n",hz,lz,zdjz,fdjz);
do{
printf("反方,请在8的区域输入:");
scanf("%d,%d", &x, &y);
} while(xy!=8 || x>3 || x<1 || y>3 || y<1 );//检查
xy=0;//0为反方
printf("1 2 3\n\n1 %d|%d|%d\n-----\n2 %d|%d|%d\n-----\n3 %d|%d|%d\n",xy, xy, xy, xy, xy, xy, xy, xy, xy);//排出井字棋
//循环判断
for(t=0; t<SIZE; t++){
hf=lf=0;
for(j=0; j<SIZE; j++){
//检查行
if(xy==0 && xy!=8){
hf++;
}
if(hf==3){
i=0;
goto out;
}
//检查列
if(xy==0 && xy!=8){
lf++;
}
if(lf==3){
i=0;
goto out;
}
}
//检查正对角线
if(xy==0 && xy!=8){
zdjf++;
}
if(zdjf==3){
i=0;
goto out;
}
//检查反对角线
if(xy==0 && xy!=8){
fdjf++;
}
if(fdjf==3){
i=0;
goto out;
}
}
// printf("hf:%d,lf:%d,zdjf:%d,fdjf:%d\n\n",hf,lf,zdjf,fdjf);
}
out:
if(i==1){
printf("正方胜利");
}else{
printf("反方胜利");
}
return 0;
}
学的翁恺的C语言入门,现在学到了第六周,第四节二维数组,这里讲到了井字棋,我觉得我可以用之前学过的东西写一个,所以我就写了一个,但是我觉得代码应该还可以用我学的知识进行简化,但是我不知道怎么简化了。。。 我觉得代码里重复的太多,想单独弄个子函数的,可是没学过指针,不知道怎么把整个数组的值传递给子函数。 开o3编译优化,如何反编译看代码 LZ 你好。
其实你可以设置一个变量is_zheng 来判断当前是哪一方下棋,然后做一次操作后 is_zheng = ! is_zheng (或是 is_zheng ^= 1)就可以。
然后你就只需要设置一个while循环来保证游戏的运行即可。
具体可以这样写:
int main(){
bool is_zheng = 1; // 当前正方下为1,反方为0
bool is_end = 0; // 游戏是否结束
while(! is_end){
//下棋的代码,用is_zheng 来判断当前谁下,下完后取反即可
//判断是否结束的代码,在其中改一行,若结束就设置 is_end = 1;
}
//结束输出谁赢的代码
return 0;
} #include <stdio.h>
const int SIZE = 3;
const int ONE = 1;
const int ZERO = 0;
int x,y;
int xy={
{8,8,8},
{8,8,8},
{8,8,8},
};
int playGame(int flag){
xy=flag; //1为正方
printf("1 2 3\n\n1 %d|%d|%d\n-----\n2 %d|%d|%d\n-----\n3 %d|%d|%d\n",xy, xy, xy, xy, xy, xy, xy, xy, xy);//排出井字棋
int t,j;
int hz,hf,lz,lf,zdjz,zdjf,fdjz,fdjf;
hz=hf=lz=lf=zdjz=zdjf=fdjz=fdjf=0;
//循环判断
for(t=0; t<SIZE; t++){
hz=lz=0;
for(j=0; j<SIZE; j++){
//检查行
if(xy==flag && xy!=8){
hz++;
}
if(hz==3){
return flag;
}
//检查列
if(xy==flag && xy!=8){
lz++;
}
if(lz==3){
return flag;
}
}
//检查正对角线
if(xy==flag && xy!=8){
zdjz++;
}
if(zdjz==3){
return flag;
}
//检查反对角线
if(xy==flag && xy!=8){
fdjz++;
}
if(fdjz==3){
return flag;
}
}
return -1;
}
int main(){
printf("1 2 3\n\n1 %d|%d|%d\n-----\n2 %d|%d|%d\n-----\n3 %d|%d|%d\n",
xy, xy, xy, xy, xy, xy, xy, xy, xy);//排出井字棋
while(1){
//输入
do
{
printf("正方,请在8的区域输入:");
scanf("%d %d", &x, &y);
} while(xy!=8 || x>3 || x<1 || y>3 || y<1 );//检查
if (playGame(ONE) == ONE){
printf("正方胜利\n");
break;
}
do{
printf("反方,请在8的区域输入:");
scanf("%d %d", &x, &y);
} while(xy!=8 || x>3 || x<1 || y>3 || y<1 );//检查
if (playGame(ZERO) == ZERO){
printf("反方胜利\n");
break;
}
}
return 0;
}
guanguanjujiu 发表于 2021-1-23 17:53
我觉得代码里重复的太多,想单独弄个子函数的,可是没学过指针,不知道怎么把整个数组的值传递给子函数。
不需要指针直接定义两个常量判断一下就行 B4o 发表于 2021-1-23 21:50
LZ 你好。
其实你可以设置一个变量is_zheng 来判断当前是哪一方下棋,然后做一次操作后 is_zheng = ! is_z ...
谢谢您,您说的这个方法,确实用我所学的知识可以完美实现。{:1_927:}
页:
[1]