⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 俄罗斯方块
💻
📖 第 1 页 / 共 2 页
字号:
                    break;
                case 0:
                    quad[0].q[3].y-=40;
                    quad[0].q[0].x-=40;
                    quad[0].q[0].y-=40;
            }
            break;
        case 6:          /* L形 */
            switch(flag_change%4)   /* 判断从什么变到什么 */
            {
                case 1:
                    quad[0].q[0].y+=40;
                    quad[0].q[1].x-=40;
                    quad[0].q[1].y+=40;
                    break;
                case 2:
                    quad[0].q[2].x-=40;
                    quad[0].q[3].x-=40;
                    quad[0].q[3].y-=40;
                    break;
                case 3:
                    quad[0].q[0].y-=40;
                    quad[0].q[1].x+=40;
                    quad[0].q[1].y-=40;
                    break;
                case 0:
                    quad[0].q[2].x+=40;
                    quad[0].q[3].x+=40;
                    quad[0].q[3].y+=40;
            }
            break;
        case 7:          /* 方形 */
            break;    /* 不需要变形直接跳出 */
    }
}

 

void draw_assembly_now()    /* 画出本次出现的组合体 */
{
    for(i=0;i<4;i++)
        quadrel(quad[0].q[i].x,quad[0].q[i].y);
} 


void draw_assembly_cover()  /* 组合体变形后覆盖原来的组合体 */
{
    setfillstyle(EMPTY_FILL,BLACK);    /* 设置bar()的填充模式 */
    for(i=0;i<4;i++)
        bar(quad[1].q[i].x,quad[1].q[i].y,quad[1].q[i].x+20,quad[1].q[i].y+20);
}

void draw_assembly_next()   /* 画出下次即将出现的组合体 */
{
    setfillstyle(EMPTY_FILL,BLACK);    /* 设置bar()的填充模式 */
    bar(370,100,450,180);    /* 覆盖上次出现的组合体 */
    for(i=0;i<4;i++)
        quadrel(quad[2].q[i].x-a_x+370,quad[2].q[i].y-a_y+100);
}

int trans_ln(int x)   /* 行转换 */
{
    return((410-x)/20);
}

int trans_col(int x)  /* 列转换 */
{
    return((x-100)/20);
}

void gameplay()      /* 游戏的主要函数 */
{
    int key,time_start,time_end,flag_break,flag_delete[20]={0},sum;
    int flag_head,flag_bott;
    long time_lag=3;   /* 设置延时变量 */
    randomize();   /* 设置随机数发生器 */
    logo_ddpie();   /* 标志输出 */
    infor_control();     /* 游戏控制信息 */
    for(i=0;i<=10;i++)   /* 设置底边 */
        flag_quad[0][i]=1;
    for(i=0;i<19;i++)     /* 设置两边 */
    {
        flag_quad[i][0]=1;
        flag_quad[i][11]=1;
    }
    a_x=180;
    a_y=50;
    flag_assembly[1]=rand;   /* 随机出现组合体类型 */
    while(1)     /* 按Esc键退出 */
    {
        infor_now();    /* 游戏的主要信息 */
        flag_break=0;
        flag_change=0;   /* 组合体变形标志初始化 */
        flag_assembly[0]=flag_assembly[1];
        flag_assembly[1]=rand;   /* 随机出现组合体类型 */
        assembly(flag_assembly[1]);
        quad[2]=quad[0];       /* 赋值 */
        draw_assembly_next();     /* 画出下次将出现的组合体 */
        assembly(flag_assembly[0]);        /* 组合体类型初始化 */
        while(2)
        {
            time_start=time(0);  /* 记录开始时间 */
            draw_assembly_now(); /* 画出当前出现的组合 */
            while(3)
            {
                if(kbhit())         /* 如果有键被按下就执行 */
                {
                    quad[1]=quad[0];   /* 为覆盖原来的形状作准备 */
                    key=bioskey(0);     /* 接受按键 */
                    if(key==ESC)      /* 退出 */
                        break;
                    if(key==DOWN)     /* 向下加速  跳出while(3) */
                        break;
                    switch(key)
                    {
                        case UP:     /* 当前组合体变形 */
                            flag_change++;
                            change_assembly(flag_assembly[0]);
                            for(i=0;i<4;i++)
                                if(flag_quad[trans_ln(quad[0].q[i].y)][trans_col(quad[0].q[i].x)]==1)
                                                            /* 如果变形有障碍物 */
                                {
                                    quad[0]=quad[1];
                                    flag_change--;
                                    break;
                                }
                            break;
                        case LEFT:   /* 向左移动 */
                            for(i=0;i<4;i++)
                                quad[0].q[i].x-=20;
                            for(i=0;i<4;i++)
                                if(flag_quad[trans_ln(quad[0].q[i].y)][trans_col(quad[0].q[i].x)]==1)
                                                            /* 如果左边有障碍物 */
                                {
                                    for(i=0;i<4;i++)
                                        quad[0].q[i].x+=20;
                                    break;
                                }
                            break;
                        case RIGHT:  /* 向右移动 */
                            for(i=0;i<4;i++)
                                quad[0].q[i].x+=20;
                            for(i=0;i<4;i++)
                                if(flag_quad[trans_ln(quad[0].q[i].y)][trans_col(quad[0].q[i].x)]==1)
                                                            /* 如果右边有障碍物 */
                                {
                                    for(i=0;i<4;i++)
                                        quad[0].q[i].x-=20;
                                    break;
                                }
                            break;
                        case ENTER:  /* 回车键 */
                            while(1)     /* 暂停 */
                            {
                                unsigned size;
                                void *save;
                                size=imagesize(180,245,260,265);  /* 计算保存区域的大小 */
                                save=malloc(size);    /* 开辟保存空间的大小 */
                                getimage(180,245,260,265,save);    /* 获取位图 */
                                setfillstyle(EMPTY_FILL,BLACK);    /* 设置bar()的填充模式 */
                                bar(180,245,260,265);
                                setcolor(MAGENTA);
                                outtextxy(190,250,"PAUSED...");
                                key=bioskey(0);
                                if(key==ENTER)
                                {
                                    putimage(180,245,save,COPY_PUT);  /* 输出位图 */
                                    break;
                                }
                                if(key==ESC)
                                    break;
                            }
                    }
                    draw_assembly_cover();  /* 覆盖原来的形状 */
                    draw_assembly_now();     /* 画出变形或移动后的组合体 */
                }
                time_end=time(0);   /* 记录当前时间 */
                if(time_end-time_start>=time_lag)      /* 如果时间差达到一定程度跳出while(3) */
                    break;
            } /* end while(3) */
            if(key==ESC)     /* 退出 */
                break;
            for(i=0;i<4;i++)
                if(flag_quad[trans_ln(quad[0].q[i].y)-1][trans_col(quad[0].q[i].x)]==1)
                                                   /* 判断是否已经不能再移动 */
                {
                    flag_break=1;
                    for(i=0;i<4;i++)
                        flag_quad[trans_ln(quad[0].q[i].y)][trans_col(quad[0].q[i].x)]=1;
                                                   /* 给这个地方做标记 */
                }
            if(flag_break)
                break;         /* 跳出while(2) */
            quad[1]=quad[0];
            draw_assembly_cover();  /* 覆盖原来的形状 */
            for(i=0;i<4;i++)        /* 整体向下移动一个单位 */
                quad[0].q[i].y+=20;
        }  /* end while(2) */
        k=0;         /* k值初始化 */
        flag_head=flag_bott=-1;
        for(i=1;i<20;i++)
        {
            sum=0;
            for(j=1;j<=10;j++)  /* 判断本行是否都是方块 */
                sum+=flag_quad[i][j];
            if(sum==10)   /* 如果本行都是方块 */
            {
                for(j=1;j<=10;j++)
                    flag_quad[i][j]=0;    /* 清空本行的标记 */
                flag_delete[k++]=i;    /* 储存这一行 */
            }
        }
        if(k>0)
        {
            switch(k)
            {
                case 1:grade+=100;break;
                case 2:grade+=300;break;
                case 3:grade+=500;break;
                case 4:grade+=800;
            }
            setfillstyle(EMPTY_FILL,BLACK);    /* 设置bar()的填充模式 */
            for(i=0;i            {
                bar(120,410-20*flag_delete[i],320,430-20*flag_delete[i]); /* 用黑色条覆盖本行 */
                flag_delete[i]=0;      /* 清空储存值 */
            }
            for(i=18;i>=flag_delete[0];i--)      /* 记录最上面的方块所在的行数 */
            {
                sum=0;
                for(j=1;j<=10;j++)
                    sum+=flag_quad[i][j];
                if(sum!=0)            /* 判断本行是否有方块 */
                {
                    flag_head=i;
                    break;
                }
            }
            for(i=flag_head;i>=flag_delete[0];i--)    /* 实现消行后整体下移 */
            {
                sum=0;
                for(j=1;j<=10;j++)
                    sum+=flag_quad[i][j];
                if(sum==0)                      /* 如果本行被消 */
                {
                    for(k=i;k<=flag_head;k++)
                        for(j=1;j<=10;j++)
                            flag_quad[k][j]=flag_quad[k+1][j];
                }
            }
            setfillstyle(EMPTY_FILL,BLACK);    /* 设置bar()的填充模式 */
            bar(120,50,320,410);      /* 用黑色条覆盖主屏幕 */
            for(i=1;i<20;i++)
                for(j=1;j<=10;j++)
                    if(flag_quad[i][j]==1)  /* 如果应该有方块就画出方块 */
                        quadrel(100+20*j,410-20*i);
        }
        for(i=1;i<=10;i++)
            if(flag_quad[18][i]==1)    /* 如果顶到了最上面  游戏结束 */
            {
                gameover();
                key=ESC;
                break;
            }
        if(key==ESC)     /* 退出 */
            break;
    }/* end while(1) */
}

main()
{
    initgr(); /* BGI初始化 */
    drawwall();   /* 画墙 */
    gameplay();   /* 玩游戏的主要函数 */
    closegraph(); /* 恢复TEXT屏幕模式 */

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -