• 俄罗斯方块(升级版)


    #include<bits/stdc++.h>
    #include<windows.h>
    #include<conio.h>
    using namespace std;
    #define Y 22
    #define X 14
    #define WHITE 7
    #define WAIT_TIME 250
    int Map[Y][X];
    int z[6][4][2],which,_long[6],zx,zy;
    char c;
    int df;
    void color(int a);
    void gotoxy(int x,int y);
    void csh();
    void start();
    void drawmap();
    bool candown();
    void drawz();
    void clsz();
    void change();
    void turn(string s);
    void _cin();
    void printdf();
    bool gameover();
    int main(){
        while(true){
            df=0;
            start();
            drawmap();
            for(int i=0;i<Y;i++){
                gotoxy(i,X*2+2);
                for(int j=0;j<X;j++)
                    printf("%d",Map[i][j]);
                printf("\n");
            }
            while(true){
                while(true){
                    df++;
                    zy++;
                    if(!candown())
                        break;
                    zy--;
                    clsz();
                    zy++;
                    drawz();
                    _cin();
                    if(!candown())
                        break;
                    printdf();
                    _sleep(WAIT_TIME);
                }
                change();
                if(gameover()){
                    system("cls");
                    system("color 1B");
                    printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
                    printf("                                   游戏结束!\n");
                    printf("                                 最终得分:%d\n",df/4);
                    printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
                    system("pause");
                    break; 
                }
                which=rand()%6;
                csh();
                color(WHITE);
                for(int i=0;i<Y;i++){
                    gotoxy(i,X*2+2);
                    for(int j=0;j<X;j++)
                        printf("%d",Map[i][j]);
                    printf("\n");
                }
            }
        }
        return 0;
    }
    void color(int a){
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
    }
    void gotoxy(int i,int j){
        COORD position={j,i};
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
    }
    void csh(){
        bool _bool[6][3][3]={{{1,0,0},
                              {1,0,0},
                              {1,1,0}},
                              
                             {{0,1,0},
                              {0,1,0},
                              {1,1,0}},

                             {{0,1,1},
                              {1,1,0},
                              {0,0,0}},

                             {{0,1,0},
                              {0,1,0},
                              {0,1,0}},

                             {{0,1,0},
                              {1,1,1},
                              {0,0,0}},

                             {{1,0,0},
                              {1,1,0},
                              {0,0,0}}};
        for(int sw=0;sw<6;sw++)
            _long[sw]=-1;
        for(int sw=0;sw<6;sw++)
            for(int y=0;y<3;y++)
                for(int x=0;x<3;x++)
                    if(_bool[sw][y][x]){
                        _long[sw]++;
                        z[sw][_long[sw]][0]=y;
                        z[sw][_long[sw]][1]=x;
                    }
        zx=X/2-2;
        zy=-2;
        return;
    }
    void start(){
        system("cls");
        system("color 1B");
        MessageBox(NULL,"按a键左移,按d键右移,w,s键旋转,p键暂停","游戏规则:",MB_OK);
        srand(time(NULL));
        CONSOLE_CURSOR_INFO cursor_info={1,0};
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
        for(int y=0;y<Y;y++)
            for(int x=0;x<X;x++)
                Map[y][x]=0;
        for(int y=0;y<Y;y++)
            Map[y][0]=Map[y][X-1]=7;
        for(int x=0;x<X;x++)
            Map[0][x]=Map[Y-1][x]=7;
        which=0;
        csh();
        return;
    }
    void drawmap(){
        gotoxy(0,0);
        color(WHITE);
        for(int y=0;y<Y;y++){
            for(int x=0;x<X;x++){
                if(Map[y][x]>0){
                    color(Map[y][x]);
                    printf("■");
                }
                else    printf("  ");
            }
            printf("\n");
        }
        for(int x=1;x<X-1;x++)
            Map[0][x]=0;
        return;
    }
    bool candown(){
        for(int l=0;l<=_long[which];l++)
            if(Map[z[which][l][0]+zy+1][z[which][l][1]+zx+1]>0&&z[which][l][0]+zy>=0)
                return false;
        return true;
    }
    void drawz(){
        color(which+1);
        for(int l=0;l<=_long[which];l++){
            if(z[which][l][0]+zy>-1){
                gotoxy(z[which][l][0]+zy+1,(z[which][l][1]+zx+1)*2);
                printf("■");
            }
        }
        return;
    }
    void clsz(){
        for(int l=0;l<=_long[which];l++){
            if(z[which][l][0]+zy>-1){
                gotoxy(z[which][l][0]+zy+1,(z[which][l][1]+zx+1)*2);
                printf("  ");
            }
        }
        return;
    }
    void change(){
        for(int l=0;l<=_long[which];l++)
            if(z[which][l][0]+zy>-1)
                Map[z[which][l][0]+zy][z[which][l][1]+zx+1]=which+1;
        bool s;
        for(int y=1;y<Y-1;y++){
            s=true;
            for(int x=1;x<X-1;x++)
                s=(s&&(Map[y][x]>0));
            if(s==true){
                for(int i=y;i>0;i--)
                    for(int x=1;x<X-1;x++)
                        Map[i][x]=Map[i-1][x];
                for(int x=1;x<X-1;x++)
                    Map[0][x]=7;
                drawmap();
            }
        }
        return;
    }
    void turn(string s){
        if(s=="left"){
            for(int l=0;l<=_long[which];l++){
                int y=z[which][l][0],x=z[which][l][1];
                z[which][l][0]=2-x;z[which][l][1]=y;
            }
        }
        if(s=="right"){
            for(int l=0;l<=_long[which];l++){
                int y=z[which][l][0],x=z[which][l][1];
                z[which][l][0]=x;z[which][l][1]=2-y;
            }
        }
        return;
    }
    void _cin(){
        if(kbhit()!=0){
            while(kbhit()!=0)
                c=getch();
            switch(c){
                case 'a':case 'A':{
                    zx--;
                    if(candown()){
                        zx++;
                        clsz();
                        zx--;
                        drawz();
                    }else
                        zx++;
                    break;
                }
                case 'd':case 'D':{
                    zx++;
                    if(candown()){
                        zx--;
                        clsz();
                        zx++;
                        drawz();
                    }else
                        zx--;
                    break;
                }
                case 'w':case 'W':{
                    turn("left");
                    if(!candown())
                        turn("right");
                    else{
                        turn("right");
                        clsz();
                        turn("left");
                        drawz();
                    }
                    break;
                }
                case 's':case 'S':{
                    turn("right");
                    if(!candown())
                        turn("left");
                    else{
                        turn("left");
                        clsz();
                        turn("right");
                        drawz();
                    }
                    break;
                }
                case 'p':case 'P':{
                    c=getch();
                    break;
                }
                default:break;
            }
        }
        return;
    }
    void printdf(){
        gotoxy(Y,0);
        color(WHITE);
        printf("得分:%d",df/4);
        return;
    }
    bool gameover(){
        for(int x=1;x<X-1;x++)
            if(Map[0][x]>0)
                return true;
        return false;
    }//qybcjmy

  • 相关阅读:
    HTML5期末大作业:基于HTML+CSS+JavaScript实现中国风文化传媒企业官网源码
    jdbc连接oracle数据库
    [源码解析] TensorFlow 分布式环境(2)---Master 静态逻辑
    第4章SpringBoot ⽇志
    启动两个线程,用另一个线程以通知的终止另一个线程
    使用MySQL,请善用 JSON 这张牌
    Promethus(普罗米修斯)安装与配置(亲测可用)
    靠“山寨”发家的名创优品,如今是什么模样
    Python + Django4 搭建个人博客(十九):搜索文章
    使用vLLM和ChatGLM3-6b批量推理
  • 原文地址:https://blog.csdn.net/qybcjmy/article/details/125619514