关于#三子棋代码#的问题,显示标识符未声明,如何解决?

三子棋代码 显示未申明标识符,可是明明定义了呀

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define row 3
#define col 3
void menu()
{
      printf("*******************\n");
      printf("**1.paly   0.exit**\n");
      printf("*******************\n");
}
void game()
{
   char arr[row][col]={0};/*空格填充*/
   srand((int)time(NULL));
   int i=0;
   int j=0;
   int a=0;
   int b=0;
   int m=0;
   int n=0;
   int t=0;
   /*打印棋盘*/
   for(i=0;i<row;i++)
   {
       /*打印一行内容*/
       for(j=0;j<col;j++)
         {
             printf(" %c ",arr[i][j]);
             if(j<col-1)
             printf("|");
         }
       printf("\n");
       if(i<row-1)/*最后一行不需---|*/
       {
       /*打印第二行内容*/
           for(j=0;j<col;j++)
              {
                 printf("---");
                 if(j<col-1)
                 printf("|");
               }
           printf("\n");
       }
    }
 while(1)
 {
   /*玩家输入坐标*/
   while(1)
   {
    printf("请输入坐标:");
    scanf("%d%d",&a,&b);
       if((a>0&&a<=row)&&(b>0&&b<=col)&&(arr[a-1][b-1]==' '))
         {
            arr[a-1][b-1]='*';
            break;
         }
      
   }
    /*判断输赢*/
   for(m=0;m<row;m++)
    {
       if((arr[m][0]==arr[m][1]==arr[m][2])&&arr[m][0]!=' ')
           t=arr[m][0];
    }
    for(m=0;m<row;m++)
    {
       if((arr[0][m]==arr[1][m]==arr[2][m])&&arr[0][m]!=' ')
           t=arr[0][m];
    }
       if((arr[0][0]==arr[1][1]==arr[2][2])&&arr[0][0]!=' ')
           t=arr[m][0];
       if((arr[0][2]==arr[1][1]==arr[2][0])&&arr[0][0]!=' ')
           t=arr[0][2];
       for(m=0;m<row;m++)
       {
           for(n=0;n<col;n++)
            {
             if(arr[m][n]!=' ')
                 {
                      t=1; 
                  }
            }
       }

    if(t=='*')
    {
        printf("恭喜你赢啦");
       break;
    }

    else if(t=='#')
    {
        printf("输了");
        break;
    }

    else if(t==1)
    {
        printf("平局");
        break;
    }

   /*电脑输入坐标*/
   while(1)
    {
        printf("电脑输入坐标:");
        a=rand()%row;
        b=rand()%col;
        if(arr[a][b]==' ')
        {
            arr[a][b]='#';
            printf("%c",arr[a][b]);
            break;
        }

    }
  /* 判断输赢*/
    for(m=0;m<row;m++)
    {
       if((arr[m][0]==arr[m][1]==arr[m][2])&&arr[m][0]!=' ')
           t=arr[m][0];
    }
    for(m=0;m<row;m++)
    {
       if((arr[0][m]==arr[1][m]==arr[2][m])&&arr[0][m]!=' ')
           t=arr[0][m];
    }
       if((arr[0][0]==arr[1][1]==arr[2][2])&&arr[0][0]!=' ')
           t=arr[m][0];
       if((arr[0][2]==arr[1][1]==arr[2][0])&&arr[0][0]!=' ')
           t=arr[0][2];
       for(m=0;m<row;m++)
       {
           for(n=0;n<col;n++)
            {
             if(arr[m][n]!=' ')
                 {
                      t=1;
                  }
            }
       }
    if(t=='*')
    {
        printf("恭喜你赢啦");
       break;
    }

    else if(t=='#')
    {
        printf("输了");
        break;
    }

    else if(t==1)
    {
        printf("平局");
        break;
    }

 }

}

int main()
{
    int input=0;    
    menu();
    printf("请输入(1/0):");
    do
    {
    scanf("%d",&input);
    switch(input)
    {
    case 1:game();
        break;
    case 0:printf("退出游戏");
        break;
    default:printf("请重新输入:");
        break;
    }

    }while(input);

    


}

img

为啥在我的编译器里,就不报错呢?

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7795503
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:模拟用户登录过程,验证用户名、密码和校验码,如果全部正确提示用户登录成功,否则,提示用户相关输入错误
  • 除此之外, 这篇博客: 猿创征文| 指针,这还拿不下你?中的 🍑4、阅读两段有趣的代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 代码1:(*(void (*)())0)();
    代码2:void (*signal(int , void(*)(int)))(int);

    代码分析:

    在读代码时,代码2可谓是相当复杂,为了增加代码的可读性,我们可以使用typedfy-类型重定义关键字对其进行简化:

    int main()
    {
    
    	void(*signal(int, void(*)(int)))(int);
    
    	typedef void(*pf_t)(int) ;//语法规定pf_t在*后边
    	pf_t signal( int, pf_t);
    
    	//////////////////////////////注释////////////////////////////
    	//上述代码是一次函数声明
    	//声明的函数叫:signal
    	//signal函数的第一个参数是int类型的
    	//signal函数的第二个参数是一个函数指针类型,该函数指针指向的函数参数是int,返回类型是void
    	//signal函数的返回类型也是一个函数指针类型,该函数指针指向的函数参数是int,返回类型是void
    	//void (*)(int) signal(int, void(*)(int)); //err
    
    	return 0;
    }
    

    📖总结:像上面这样的表达式恐怕会令我们“不寒而粟”。然而我们大可不必对此望而生畏,我们只需要对其进行拆解,就能对其很好地理解。

  • 您还可以看一下 易文星老师的手把手教你实现人脸识别支付系统课程中的 代码解读之预处理和模型使用之三小节, 巩固相关知识点