guanguanjujiu 发表于 2021-1-23 17:51

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语言入门,现在学到了第六周,第四节二维数组,这里讲到了井字棋,我觉得我可以用之前学过的东西写一个,所以我就写了一个,但是我觉得代码应该还可以用我学的知识进行简化,但是我不知道怎么简化了。。。

guanguanjujiu 发表于 2021-1-23 17:53

我觉得代码里重复的太多,想单独弄个子函数的,可是没学过指针,不知道怎么把整个数组的值传递给子函数。

nj001 发表于 2021-1-23 20:49

开o3编译优化,如何反编译看代码

B4o 发表于 2021-1-23 21:50

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;
}

古月不傲 发表于 2021-1-23 22:34

#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;
}

古月不傲 发表于 2021-1-23 22:44

guanguanjujiu 发表于 2021-1-23 17:53
我觉得代码里重复的太多,想单独弄个子函数的,可是没学过指针,不知道怎么把整个数组的值传递给子函数。

不需要指针直接定义两个常量判断一下就行

guanguanjujiu 发表于 2021-1-24 13:33

B4o 发表于 2021-1-23 21:50
LZ 你好。
其实你可以设置一个变量is_zheng 来判断当前是哪一方下棋,然后做一次操作后 is_zheng = ! is_z ...

谢谢您,您说的这个方法,确实用我所学的知识可以完美实现。{:1_927:}
页: [1]
查看完整版本: C语言如果没有学过指针,这个代码还能简化吗?