C语言学习笔记w3d2

变量的作用域

全局变量

  • 定义在函数外的变量(一般定义在开头)
  • 作用域:在程序的任意位置(定义开始)都能使用
  • 生命周期:从定义开始(分配存储空间),到程序结束(释放存储空间)

局部变量

  • 定义在某些区域中的变量:{ } 中或函数的参数列表

函数中还可以嵌套一个 { } ,所定义的局部变量作用域仅在 { }

  • 作用域:被定义的 { }
  • 生命周期:从定义开始到超出作用域( { } 结束)
  • 变量隐藏:若定义的不同作用域里的变量名字一致,越大作用域的变量被隐藏,使用作用域较小的变量

变量的修饰符

auto(C中):默认的变量修饰符,可以省略,表示变量由系统自动分配空间
signed :默认的变量修饰符,可以省略,表示有符号。

int a 相当于 auto signed int a;

unsigned :无符号数据,最高位是数据位
const:常量修饰符,不能修改不能赋值,一般变量名大写

常量直接量:int 4、double 8、char 4

static:静态变量

  1. static 修饰全局变量时,该全局变量只能在本文件内使用
  2. static 修饰局部变量时,变量只会定义初始化一次;且生命周期延长为整个程序,作用域不变

例如写在循环中
for(10) static int a = 0 ; printf ("%d" , a) ; a++;
执行的最后结果为 10

异常处理

  • 编译异常报告
    错误和警告信息,只检测语法正误

gcc 的编译器优化 :后加 -O0,~,-O4,进行编译优化,使比如说创建但未使用的变量就不进行创建

作业:五子棋

要求:

  1. 有行列提示
  2. 落子位置正误判断
  3. 输赢判断
#include<stdio.h>
const int SIZE=24;

int board[24][24];
char player1chess='O';
char player2chess='X';
char blankchess=' ';

void initboard();
void player1do();
void player2do();
void boardshow();
int wincheck();
void whowin(int);

void whowin(int iswin){


    if (iswin==1){
        printf("P1 Win!\ncontinue:0/1?\n");
        return ;
    }
    
    else if (iswin==2){
        printf("P2 Win!\ncontinue:0/1?\n");
        return ;
    }
    
    
    
}

int main(){
    
    int iswin =0;
    int choose =0;
    while (1)
    {
        initboard(board);
        while (1)
        {
            boardshow(board);
            player1do(board);
            boardshow(board);
            iswin=wincheck(board);
            whowin(iswin);
            if(iswin==1||iswin==2){
                printf("player%d Win!\ncontinue:0/1?",iswin);
                scanf("%d",&choose);
                if(choose==1)
                    break;
                else
                    return 0;
            }
            player2do(board);
            boardshow(board);
            iswin=wincheck(board);
            whowin(iswin);
            if(iswin==1||iswin==2){
                printf("player%d Win!\ncontinue:0/1?",iswin);
                scanf("%d",&choose);
                if(choose==1)
                    break;
                else
                    return 0;
            }
        }
        
        
        
    }
    
}
void initboard(){
        for (int i = 0; i < SIZE; i++)
        {
            for (int j = 0; j < SIZE; j++)
            {
                if(i==0){
                    board[i][j]=j;
                }
                else if(j==0){
                    board[i][j]=i;
                }
                else 
                    board[i][j]=0;
            }
            
        }
}

void boardshow(){
    for (int i = 0; i < SIZE; i++)
        {
            for (int j = 0; j < SIZE; j++)
            {
                if(i>0&&j>0){
                    if(board[i][j]==-1)
                        printf("%3c",player1chess);
                    else if(board[i][j]==-2)
                        printf("%3c",player2chess);
                    else
                        printf("%3c",blankchess);
                }
                else
                    printf("%3d",board[i][j]);
            }
            printf("\n");
            
        }

}

void player1do(){
    int x,y;
    while(1){
        printf("P1   please play:x,y\n");
        scanf("%d %d",&x,&y);
        if((x==0||y==0)||(x>23||y>23)){
            printf("error!Retry!");
            continue;
        }
        else if(board[y][x]==-1||board[y][x]==-2){
            printf("error!Retry!");
            continue;
        }
        else{
            board[y][x]=-1;
            break;
        }
    }

}

void player2do(){
    int x,y;
    while(1){
        printf("P2   please play:x,y\n");
        scanf("%d %d",&x,&y);
        if((x==0||y==0)||(x>23||y>23)){
            printf("error!Retry!");
            continue;
        }
        else if(board[y][x]==-1||board[y][x]==-2){
            printf("error!Retry!");
            continue;
        }
        else{
            board[y][x]=-2;
            break;
        }
    }

}

int wincheck(){

    //判断横向可赢
    for(int i=1 ; i<SIZE ; i++){
        for(int j=1 ; j<SIZE ; j++){
            if((board[i][j]==-1)&&(board[i][j]==board[i][j+1]) && (board[i][j]==board[i][j+2]) && (board[i][j]==board[i][j+3]) && (board[i][j]==board[i][j+4]))
                return 1;
            else if((board[i][j]==-2)&&(board[i][j]==board[i][j+1]) && (board[i][j]==board[i][j+2]) && (board[i][j]==board[i][j+3]) && (board[i][j]==board[i][j+4]))
                return 2;
            else
                continue;
        }
    }

    //判断竖向可赢
    for(int i=1 ; i<SIZE ; i++){
        for(int j=1 ; j<SIZE ; j++){
            if((board[j][i]==-1)&&(board[j][i]==board[j][i+1])&&(board[j][i]==board[j][i+2])&&(board[j][i]==board[j][i+3])&&(board[j][i]==board[j][i+4]))
                return 1;
            else if((board[j][i]==-2)&&(board[j][i]==board[j][i+1])&&(board[j][i]==board[j][i+2])&&(board[j][i]==board[j][i+3])&&(board[j][i]==board[j][i+4]))
                return 2;
            else
                continue;
        }
    }
    
    //判断左上到右下可赢
    for(int i=1 ; i<SIZE ; i++){
        for(int j=1 ; j<SIZE ; j++){
           if((board[j][i]==-1)&&(board[j][i]==board[j+1][i+1])&&(board[j][i]==board[j+2][i+2])&&(board[j][i]==board[j+3][i+3])&&(board[j][i]==board[j+4][i+4]))
                return 1;
            else if((board[j][i]==-2)&&(board[j][i]==board[j+1][i+1])&&(board[j][i]==board[j+2][i+2])&&(board[j][i]==board[j+3][i+3])&&(board[j][i]==board[j+4][i+4]))
                return 2;
            else
                continue;
        }
    }


    //判断左下到右上可赢
    for(int i=1 ; i<SIZE ; i++){
        for(int j=SIZE-1 ; j>4 ; j--){
           if((board[j][i]==-1)&&(board[j][i]==board[j-1][i+1])&&(board[j][i]==board[j-2][i+2])&&(board[j][i]==board[j-3][i+3])&&(board[j][i]==board[j-4][i+4]))
                return 1;
            else if((board[j][i]==-2)&&(board[j][i]==board[j-1][i+1])&&(board[j][i]==board[j-2][i+2])&&(board[j][i]==board[j-3][i+3])&&(board[j][i]==board[j-4][i+4]))
                return 2;
            else
                continue;
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值