} void initbt5(int bt_color) /*初始化 \ # \ # \{ /* # ### # # */ int i; /* # ## */ for(i=0;i<3;i++) { bt[7].bktp[i][2]=1; bt[8].bktp[2][i+1]=1; bt[9].bktp[i][1]=1; bt[10].bktp[1][i+1]=1; } bt[7].bktp[0][1]=1; bt[8].bktp[1][3]=1; bt[9].bktp[2][2]=1; bt[10].bktp[2][1]=1; bt[7].color=bt_color; bt[8].color=bt_color; bt[9].color=bt_color; bt[10].color=bt_color; return; } void initbt6(int bt_color) /*初始化 \ # \ \ ## \ ### \{ /* # ### # # */ int i; /* ## # */ for(i=0;i<3;i++) { bt[11].bktp[i][2]=1; bt[12].bktp[2][i]=1; bt[13].bktp[i][1]=1; bt[14].bktp[1][i]=1; } bt[11].bktp[2][1]=1; bt[12].bktp[1][0]=1; bt[13].bktp[0][2]=1; bt[14].bktp[2][2]=1; bt[11].color=bt_color; bt[12].color=bt_color; bt[13].color=bt_color; bt[14].color=bt_color; return; } void initbt7(int bt_color) { int i;
26
for(i=0;i<3;i++) { /*初始化 \ # \ # \ ### \ # \ bt[15].bktp[2][i+1]=1; /* ### ## # ## */ bt[16].bktp[i][2]=1; /* # # */ bt[17].bktp[1][i+1]=1; bt[18].bktp[i][2]=1; } bt[15].bktp[1][2]=1; bt[16].bktp[1][3]=1; bt[17].bktp[2][2]=1; bt[18].bktp[1][1]=1; bt[15].color=bt_color; bt[16].color=bt_color; bt[17].color=bt_color; bt[18].color=bt_color; return; } int randompre(void) /*随机产生一个方块形状到预览区,并记录下方块形状的下标*/ { int btnum; srand(time(NULL)); btnum=rand(); pre=bt[btnum]; return btnum; } void pretozxp(int btnum) { pretotemp(btnum); temptozxp(); return; } void pretotemp(int btnum) /*将预览区的方块信息传给\其中的\记录方块的位置*/ { int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { tempbt.bp[i][j]=bt[btnum].bktp[i][j]; } } tempbt.color=bt[btnum].color; tempbt.y=0;
27
tempbt.x=3; } void temptozxp(void) /*将\中的信息显示到游戏窗口*/ { int i,j; for(i=tempbt.y;i 28 for(j=0;j<4;j++) { if(pre.bktp[i][j]) hfk(441,71,i,j,pre.color); } } return; } void hfk(int x0,int y0,int i,int j,int color) /*画一个color颜色的方块*/ { setcolor(color); setfillstyle(1,color); bar(j*20+x0,i*20+y0,j*20+x0+18,i*20+y0+18); return; } void refgmglp(void) { char gstr[20],lstr[20],pstr[20]; setfillstyle(1,BKCOLOR1); bar(436,200,600,450); sprintf(gstr,\ sprintf(lstr,\ sprintf(pstr,\ setcolor(GLP_COLOR); outtextxy(436,200,gstr); outtextxy(436,300,lstr); outtextxy(436,400,pstr); return; } int judgedown(int btnum) { int j; switch(btnum) { case 0: case 8: case 9: case 11: case 12: case 15: /*第0,8,9,11,12,15方块形状只需判断tempbt的第三行为1的下方 对应的游戏窗口位置是否为1 */ if(20==tempbt.y) /*以及tempbt的第三行是否到了最底行*/ return 1; for(j=0;j<4;j++) 29 if(tempbt.bp[2][j]&&zxp[tempbt.y+3][tempbt.x+j]) return 1; break; case 1: case 19: if(19==tempbt.y) /*方法同上*/ return 1; for(j=1;j<3;j++) if(tempbt.bp[3][j]&&zxp[tempbt.y+4][tempbt.x+j]) return 1; if(tempbt.bp[0][0]&&zxp[tempbt.y+1][tempbt.x]||tempbt.bp[0][3]&& zxp[tempbt.y+1][tempbt.x+3]) return 1; break; case 2: /*方法同上*/ if(20==tempbt.y) return 1; for(j=0;j<4;j++) if(zxp[tempbt.y+3][tempbt.x+j]) return 1; break; case 3: case 10: if(20==tempbt.y) return 1; if(zxp[tempbt.y+3][tempbt.x+1]||zxp[tempbt.y+2][tempbt.x+2]||tempbt.bp[1][3] &&zxp[tempbt.y+2][tempbt.x+3]) return 1; break; case 4: case 6: if(20==tempbt.y||tempbt.bp[1][0]&&zxp[tempbt.y+2][tempbt.x]||tempbt.bp[1][3] &&zxp[tempbt.y+2][tempbt.x+3]) return 1; for(j=1;j<3;j++) if(zxp[tempbt.y+3][tempbt.x+j]) return 1; break; case 5: case 14: case 18: if(20==tempbt.y) return 1; for(j=0;j<2;j++) 30