return; } void replay(int *pbtnum1) { cleardevice(); initzxp(); grade=lnum=point=0; /*重玩只需将游戏成绩归零即可*/ initgame(); *pbtnum1=randompre(); /*随机产生一个方块形状到预览区*/ pretozxp(*pbtnum1); /*将预览区的方块形状传到游戏窗口*/ return; } void savelast(int btnum1,int btnum2,int x) { struct { int sign; /*通过sign来标记上次游戏是否已经结束*/ int sbtnum1,sbtnum2; int szxp[23][10],szxpcolor[23][10]; struct p_ztemp stempbt; int sgrade,slnum; unsigned int spoint; }lastdata; /*用该结构体临时存储上次游戏信息*/ int i,j; FILE *fp; lastdata.sign=x; /*x为1代表上次游戏结束,为0代表上次游戏没有结束*/ for(i=0;i<23;i++) for(j=0;j<10;j++) { lastdata.szxp[i][j]=zxp[i][j]; lastdata.szxpcolor[i][j]=zxpcolor[i][j]; } lastdata.sbtnum1=btnum1; lastdata.sbtnum2=btnum2; lastdata.stempbt=tempbt; lastdata.sgrade=grade; lastdata.slnum=lnum; lastdata.spoint=point; if((fp=fopen(\ /*新建文件 lastgame.txt */ return; fwrite(&lastdata,sizeof(lastdata),1,fp); /*将上次游戏信息写在该文件里*/ fclose(fp); return; }
36
int gamehandle(int *pbtnum1,int *pbtnum2) { int dnum=0,turnnum; /*dnum记录一次消的行数,turnnum记录旋转类型*/ char ch; ch=getche(); switch(ch) { case 'Q': case 'q': ch=getch(); while('Q'!=ch&&'q'!=ch) /*当ch为\或 \时终止循环(结束暂停)*/ { ch=getch(); } break; case 'S': case 's': case 80: if(judgedown(*pbtnum1)) { dnum=judgedel(); /*判断是否有需要消行的 */ if(dnum) { delfun(); /*消除需要删除的行*/ refzxp(); delay(30000); ash_down(); /*需删除行以上的所有行整体下移*/ lnum+=dnum; amark(&dnum); /*根据一次消除的行数进行加分*/ grade=point/5000; /*每5000分一个等级*/ delline[0]=delline[1]=delline[2]=delline[3]=0; /*用过后归零*/ } *pbtnum1=*pbtnum2; pretozxp(*pbtnum1); *pbtnum2=randompre(); refresh(); } else { clrzxpbt(); bktps_down(); /*方块形状向下移动,以实现加速*/ refzxp(); } break;
37
case 'A': case 'a': case 75: if(judgeleft(*pbtnum1)) { clrzxpbt(); bktps_left(); /*方块形状向左移动*/ refzxp(); } break; case 'D': case 'd': case 77: if(judgeright(*pbtnum1)) { clrzxpbt(); bktps_right(); /*方块形状向右移动*/ refzxp(); } break; case 'W': case 'w': case 72: turnnum=judgeturn(*pbtnum1); if(turnnum) { clrzxpbt(); bktps_turn(pbtnum1,turnnum); /*方块形状翻转*/ turntotemp(*pbtnum1); temptozxp(); /*将缓冲区(tempbt)中的信息传到主显屏*/ refzxp(); } break; case 27: /*按\建返回到菜单*/ savelast(*pbtnum1,*pbtnum2,0); /*上次游戏还没有结束*/ return 1; default: ; } return 0; } void bktps_down(void) { tempbt.y++; temptozxp(); /*将缓冲区(tempbt)中的信息传到主显屏*/
38
return; } void clrzxpbt(void) { int i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) if(tempbt.bp[i][j]) { zxp[tempbt.y+i][tempbt.x+j]=0; zxpcolor[tempbt.y+i][tempbt.x+j]=BKCOLOR; } return; } int judgeleft(int btnum) /*方法同下移判断 */ { int i; switch(btnum) { case 0: case 1: case 9: case 10: case 13: if(-1==tempbt.x) return 0; /*x为-1时,方块形状到了最左边*/ for(i=0;i<4;i++) if(tempbt.bp[i][1]&&zxp[tempbt.y+i][tempbt.x]) return 0; break; case 19: if(0==tempbt.x||zxp[tempbt.y][tempbt.x-1]) return 0; /*x为0时,方块形状到了最左边 */ for(i=1;i<4;i++) if(zxp[tempbt.y+i][tempbt.x]) return 0; break; case 2: case 12: if(0==tempbt.x||zxp[tempbt.y+2][tempbt.x-1]) return 0; /*x为0时,方块形状到了最左边 */ if(tempbt.bp[1][0]&&zxp[tempbt.y+1][tempbt.x-1]) return 0; break;
39
case 3: case 5: if(-1==tempbt.x||tempbt.bp[0][2]&&zxp[tempbt.y][tempbt.x+1]|| tempbt.bp[2][2]&&zxp[tempbt.y+2][tempbt.x+1]) return 0; for(i=0;i<3;i++) if(tempbt.bp[i][1]&&zxp[tempbt.y+i][tempbt.x]) return 0; break; case 4: if(0==tempbt.x||zxp[tempbt.y+1][tempbt.x-1]||zxp[tempbt.y+2][tempbt.x]) return 0; break; case 6: case 15: if(-1==tempbt.x||zxp[tempbt.y+1][tempbt.x+1]||zxp[tempbt.y+2][tempbt.x]) return 0; break; case 7: if(-1==tempbt.x||zxp[tempbt.y][tempbt.x]||zxp[tempbt.y+1][tempbt.x+1]|| zxp[tempbt.y+2][tempbt.x+1]) return 0; break; case 8: if(-1==tempbt.x||zxp[tempbt.y+1][tempbt.x+2]||zxp[tempbt.y+2][tempbt.x]) return 0; break; case 11: if(-1==tempbt.x||zxp[tempbt.y][tempbt.x+1]||zxp[tempbt.y+1][tempbt.x+1]|| zxp[tempbt.y+2][tempbt.x]) return 0; break; case 14: if(0==tempbt.x||zxp[tempbt.y+1][tempbt.x-1]||zxp[tempbt.y+2][tempbt.x+1]) return 0; break; case 16: if(-2==tempbt.x) /*x为-2时,方块形状到了最左边*/ return 0; for(i=0;i<3;i++) if(zxp[tempbt.y+i][tempbt.x+1]) return 0; break; case 17:
40