Augenstern... 2022-03-19 15:22 采纳率: 75%
浏览 14
已结题

C语言2048小游戏 为什么总是运行着就突然掉数


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include<conio.h>//用来调用getch函数 

char Change(char C)//输出第一个页面 
{
    printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
    printf("@@@@@@@@@ 请输入数字切换页面    @@@@@@\n");
    printf("@@@@@@@@@ 输入1开始2048小游戏   @@@@@@\n");
    printf("@@@@@@@@@ 输入2开始贪吃蛇小游戏 @@@@@@\n");
    printf("@@@@@@@@@ 输入3开始俄罗斯方块   @@@@@@\n");
    printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
    return 0;
}

void Page(int a[4][4],int count){//输出表格
    for(int i=0;i<4;i++){
        printf(" ----");
    }
    printf("\n");
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            if(j==0){
                printf("|");
            }if(a[i][j]==0){
                printf("    |");
            }else{
                printf("%3d |",a[i][j]);
            }
        }
        printf("\n");
        for(int k=0;k<4;k++){
            printf(" ----");
        }
        printf("\n");
    }
    printf("请使用wsad分别表示上下左右\n");
    printf("当前得分为:%d\n",count);
    return;
}

int Star(int a[4][4]){//输出随机数
    srand((unsigned)time(NULL));
    int x,y,N;
    x=rand()%4;
    y=rand()%4;
    N=rand()%4;
    if(N==0){
        N+=4;
    }else if(N%2!=0){
        N++;
    }
    a[x][y]=N;
    return 0;
}
void Fresh(int a[4][4]){//在数组中不为零的随机部分继续输出随机数2或者4
    srand((unsigned)time(NULL));
    int x,y,N;
    x=rand()%4;
    y=rand()%4;//在数组中取一个随机位置
    N=rand()%4;
    if(N==0){
        N+=4;
    }else if(N%2!=0){
        N++;
    }
    while(a[x][y]!=0){//如果取得的随机位置上的数不为零,就继续取随机位置
        x=rand()%4;
        y=rand()%4;
    }
    a[x][y]=N;
    return;
}

int Over(int a[4][4]){//如果还有位子为零则游戏继续,或者相近位子有相同的数则继续游戏,否则游戏结束 
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            if(a[i][j]==2048){
                return 0;
            }
        }
    }
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            if(a[i][j]==0){
                return 1;
            }
        }
    }
    return 0;//能够走到这一步就说明没有相邻的数相等,返回零,表示游戏结束 
}

void run(int a[4][4]){//移动合并 
    char ch;
    ch=getch();//getch函数自动读取无需按回车,且不显示在屏幕上 
    switch(ch){
        case 'w'://上
        case 'W':
            for(int l=0;l<4;l++){
                for(int h=3;h>0;h--){
                    if(a[h][l]!=0){
                        if(a[h][l]==a[h-1][l]){//相同的数合并 
                            a[h-1][l]=2*a[h][l];
                            a[h][l]=0;
                        }else if(a[h-1][l]==0){//为了应付0808这类数 
                            a[h-1][l]=a[h][l];
                            a[h][l]=0;
                        }
                    }
                }
            }    
            for(int l=0;l<4;l++){//移动 
                for(int h=3;h>0;h--){
                    if(a[h][l]!=0){
                        if(a[h-1][l]==0){
                            a[h-1][l]=a[h][l];
                            a[h][l]=0;
                        }if(h<3&&a[h][l]==0){
                            a[h][l]=a[h+1][l];
                            a[h+1][l]=0;
                        }
                    }
                }
            }
            break;
        case 's'://下
        case 'S':
            //先合并再移动更方便
            //合并
            for(int l=0;l<4;l++){
                for(int h=0;h<3;h++){
                    if(a[h][l]!=0){
                        if(a[h][l]==a[h+1][l]){
                            a[h+1][l]=2*a[h][l];
                            a[h][l]=0;
                        }else if(a[h+1][l]==0){
                            a[h+1][l]=a[h][l];
                            a[h][l]=0;
                        }
                    }
                }
            }
            for(int l=0;l<4;l++){
                for(int h=0;h<3;h++){
                    if(a[h][l]!=0){
                        if(a[h+1][l]==0){
                            a[h+1][l]=a[h][l];
                            a[h][l]=0;
                        }if(h>0&&a[h][l]==0){
                            a[h][l]=a[h-1][l];
                            a[h-1][l]=0;
                        }
                    }
                }
            }    
            break;
        case 'a'://左  
        case 'A':
            for(int h=0;h<4;h++){
                for(int l=3;l>0;l--){
                    if(a[h][l]!=0){
                        if(a[h][l-1]==a[h][l]){
                            a[h][l-1]=2*a[h][l-1];
                            a[h][l]=0;
                        }else if(a[h][l-1]==0){
                            a[h][l-1]=a[h][l];
                            a[h][l]=0;
                        }
                    }
                }
            }    
            for(int h=0;h<4;h++){
                for(int l=3;l>0;l--){
                    if(a[h][l]!=0){
                        if(a[h][l-1]==0){
                            a[h][l-1]=a[h][l];
                            a[h][l]=0;
                        }if(l<3&&a[h][l]==0){
                            a[h][l]=a[h][l+1];
                            a[h][l+1]=0;
                        }
                    }
                }
            }
            break;
        case 'd'://右  
        case 'D':
            for(int h=0;h<4;h++){
                for(int l=0;l<3;l++){
                    if(a[h][l]!=0){
                        if(a[h][l+1]==a[h][l]){
                            a[h][l+1]=2*a[h][l+1];
                            a[h][l]=0;
                        }else if(a[h][l+1]==0){
                            a[h][l+1]=a[h][l];
                            a[h][l]=0;
                        }
                    }
                }
            }    
            for(int h=0;h<4;h++){
                for(int l=0;l<3;l++){
                    if(a[h][l]!=0){
                        if(a[h][l+1]==0){
                            a[h][l+1]=a[h][l];
                            a[h][l]=0;
                        }if(l>0&&a[h][l]==0){
                            a[h][l+1]=a[h][l];
                            a[h][l]=0;
                        }
                    }
                }
            }
            break;
        default:
            break;
    }
}

int main()
{
    int a[4][4]={0};
    int count=0;
    char C;
    char c=Change(C);
    printf("%c",c); 
    int i=0;
    scanf("%d",&i); 
    system("cls");
    switch(i)
    {
        case 1:
            Star(a);//输出随机数 
            Page(a,count);//打印 
            run(a);//移动 
            count++;//计分加一 
            system("cls");//清空 
            Fresh(a);//输出新的随机数 
            Page(a,count);//打印 
            Sleep(50);
            while(1){//循环 
                if(Over(a)==1){//判断是否结束游戏 
                    run(a);//移动 
                    Fresh(a);//输出新的随机数 
                    count++;//计分加一 
                    system("cls");//清空 
                    Page(a,count);//打印 
                    Sleep(5);
                }else{
                    system("cls");//清空 
                    printf("游戏结束,最终得分为:%d\n",count);
                    break;
                }
            }
            break;
        case 2:
            printf("哈哈骗你的,我不会写贪吃蛇^-^");
            break;
        case 3:    
            printf("hh~没想到把我只会写2048@-@~~");
            break;
    }
    return 0;
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 3月27日
    • 创建了问题 3月19日

    悬赏问题

    • ¥30 模拟电路 logisim
    • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
    • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
    • ¥15 安装quartus II18.1时弹出此error,怎么解决?
    • ¥15 keil官网下载psn序列号在哪
    • ¥15 想用adb命令做一个通话软件,播放录音
    • ¥30 Pytorch深度学习服务器跑不通问题解决?
    • ¥15 部分客户订单定位有误的问题
    • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
    • ¥15 Bug traq 数据包 大概什么价