📄
字号:
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 + -