#include #include #include #include #include #include #define ESC 0x011b #define UP 0x4800 #define DOWN 0x5000 #define LEFT 0x4b00 #define RIGHT 0x4d00 #define SPACE 0x3920 #define Y 0x1579 #define N 0x316e #define clearkbd(); while(bioskey(1)) bioskey(0); /*清空键盘缓冲队列*/ void update(); void messagebox(); void process(); void initremove(); void initinfo(); void initbox(); void initposition(); void next_shape(); typedef struct shape /*形状单一状态的记录*/ { int attr; int co[8]; }shape; typedef struct RE_AB /*相对,绝对坐标记录*/ { int Rx,Ry; int x1,x2,y1,y2; }RE_AB; RE_AB RA; shape p[19]={ { RED,0,1,1,0,1,1,2,1 }, /*数组中保证y最大的在最后,以便initposition使用*/ { RED,0,1,1,0,1,1,1,2 }, { RED,0,0,1,0,2,0,1,1 }, { RED,0,0,0,1,1,1,0,2 }, { GREEN,0,0,1,0,2,0,3,0 }, { GREEN,0,0,0,1,0,2,0,3 }, { CYAN,0,0,0,1,1,0,1,1 }, { BROWN,0,0,1,0,1,1,2,1 }, { BROWN,1,0,0,1,1,1,0,2 }, { BLUE,1,0,2,0,1,1,0,1 }, { BLUE,0,0,0,1,1,1,1,2 }, { MAGENTA,0,0,0,1,0,2,1,2 }, { MAGENTA,2,0,0,1,1,1,2,1}, { MAGENTA,0,0,1,0,1,1,1,2 }, { MAGENTA,0,0,0,1,1,0,2,0 }, { YELLOW,0,2,1,0,1,1,1,2 }, { YELLOW,0,0,1,0,2,0,2,1 }, { YELLOW,1,0,0,0,0,1,0,2}, { YELLOW,0,0,0,1,1,1,2,1 }, }; int nback,nleft,nright,r_f[12][22],rs1,rs2,xcors,xcorb,ycors,ycorb; /*检查方快有没有左,右,下接触,游戏区内所有格子有无颜色记录数组,rs1形状记录,rs2为提示框用,记录小格子在游戏区中的位置,按键存储*/ void interrupt (*oldint)(); /*系统定时中断*/ int count_down=0,count_other=0; /*中断记时*/ void interrupt newint() /*设置新的中断程序*/ { count_down++; count_other++; oldint(); } void intenable() /*设置中断向量表,启动新的中断程序*/ { oldint=getvect(0x1c); disable(); setvect(0x1c,newint); enable(); } void intrestore() /*恢复中断向量*/ { disable(); setvect(0x1c,oldint); enable(); } void HZ12(int x0,int y0,int w,int color,char *s) /*根据字模,在dos下显示汉字*/ /*横坐标,纵坐标,字间隔,汉字颜色,汉字字符串*/ { FILE *fp; register char buffer[24]; register char str[2]; unsigned long fpos;/*fpos为最终偏移动量*/ register int i,j,k; fp=fopen(hzk12,r);/*打开12*12汉字苦*/ while(*s)/*一直到字符串结束为止*/ { if(*s<0)/*汉字输出*/ { str[0]=(*s)-0xa0; str[1]=*(s+1)-0xa0; fpos=((str[0]-1)*94+(str[1]-1))*24L;/*计算汉字在hzk12的偏移量*/ fseek(fp,fpos,SEEK_SET);/*指针移动到当前位置*/ fread(buffer,24,1,fp);/*读取一个汉字到数组中*/ for(i=0;i<12;i++)/*12行*/ for(j=0;j<2;j++)/*两个字节*/ for(k=0;k<8;k++)/*8位*/ if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)/*是一就画点*/ putpixel(x0+8*j+k,y0+i,color); s+=2;/*一个汉字占两个字节,现在将指针移动两个字节*/ x0+=w;/*显示坐标也按照间隔移动*/ } else/*显示非汉字字符*/ { settextstyle(0,0,1); setcolor(color); str[0]=*s;str[1]=0; outtextxy(x0,y0+3,str);/*显示单个字符*/ x0+=w-7;/*显示单个字符后的x坐标变化*/ s++;/*指针移动到下一个字节*/ } } fclose(fp); } void translation() /*把相对坐标解释为绝对坐标*/ { if(RA.Rx==1) { RA.x1=1; RA.x2=16; } else { RA.x1=16*(RA.Rx-1); RA.x2=16*RA.Rx; } if(RA.Ry==1) { RA.y1=1; RA.y2=16; } else { RA.y1=16*(RA.Ry-1); RA.y2=16*RA.Ry; } } int check_b() /*检查是否到达低部*/ { int x,y,i,zf=0; /*zf为是否有颜色填充记录*/ for(i=0;i<7;i++,i++) { x=RA.Rx+p[rs1].co[i]; y=RA.Ry+p[rs1].co[i+1]; if(y>=6) zf+=r_f[x-15][y-6+1]; } if(zf==0) return 1; else return 0; } int finish() { int tfull=0,i; /*判断顶层空间是否有填充*/ for(i=1;i<11;i++) tfull+=r_f[i][1]; if(tfull!=0) return 1; /*告诉judge()可以结束了*/ } int check_l() /*检查形状是否与左接触*/ { int x,y,i,zf=0; for(i=0;i<7;i++,i++) { x=RA.Rx+p[rs1].co[i]; y=RA.Ry+p[rs1].co[i+1]; if(y>6) zf+=r_f[x-15-1][y-6]; if(y<=6&&x==16) zf+=1; } if(zf==0) return 1; else return 0; } int check_r() /*检查形状是否与右接触*/ { /*zf为是否有颜色填充记录*/ int x,y,i,zf=0; /*zf为是否有颜色填充记录*/ for(i=0;i<7;i++,i++) { x=RA.Rx+p[rs1].co[i]; y=RA.Ry+p[rs1].co[i+1]; if(y>6) zf+=r_f[x-15+1][y-6]; if(y<=6&&x==25) zf+=1; } if(zf==0) return 1; else return 0; } void check_touch() { nback=check_b(); nleft=check_l(); nright=check_r(); } void draw(int cb) /*画形状,cb=1以填充色画形状,cb=2以背景色画形状,cb=3以白色画形状*/ { int i,recordx=RA.Rx,recordy=RA.Ry; for(i=0;i<7;i++,i++) { RA.Rx+=p[rs1].co[i]; RA.Ry+=p[rs1].co[i+1]; if(RA.Ry<=6) { RA.Rx=recordx; RA.Ry=recordy; continue; } translation(); if(cb==1) setfillstyle(1,p[rs1].attr); else if(cb==2) setfillstyle(1,BLACK); else if(cb==3) { setfillstyle(1,WHITE); r_f[RA.Rx-15][RA.Ry-6]=1; /*置对应数组标记元素*/ } bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1); RA.Rx=recordx; RA.Ry=recordy; } } void mov(int key) /*向下,左,右移动方块*/ { draw(2); if(key==LEFT&&nleft) RA.Rx--; else if(key==RIGHT&&nright) RA.Rx++; else RA.Ry++; nback=check_b(); if(nback) /*判断形状有没有到达底部,有就将其颜色变为白色*/ draw(1); else draw(3); } void change() /*变换形状*/ { int status=rs1,buffer,i,x,y,zf=0; if(p[rs1].attr==p[rs1+1].attr) rs1++; else while(p[rs1].attr==p[rs1-1].attr) rs1--; for(i=0;i<7;i++,i++) /*检查变化形状后是否与已存形状发生冲突*/ { x=RA.Rx+p[rs1].co[i]; y=RA.Ry+p[rs1].co[i+1]; if(y>6) zf+=r_f[x-15][y-6]; } if(zf!=0) rs1=status; buffer=rs1; rs1=status; status=buffer; draw(2); buffer=rs1; rs1=status; status=buffer; nback=check_b(); /*判断变化后的形状是不是到达了低部,这个检查是十分必要的*/ if(nback) draw(1); else draw(3); } void accelerate() { if(count_down>=1) { check_touch(); /*消除上一步动作对方块状态的影响*/ count_down=0; if(nback) /*0表示到达底部,1表示没有到达*/ mov(DOWN); } } void drawbox() /*画方块所在方框*/ { int xcor,ycor; for(xcor=xcors;xcor<=xcorb;xcor++) for(ycor=ycors;ycor<=ycorb;ycor++) { if(xcor==xcors||xcor==xcorb||ycor==ycors||ycor==ycorb) { RA.Rx=xcor; RA.Ry=ycor; translation(); setfillstyle(1,DARKGRAY); bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1); } } } void erasure(int k) { int i,j,recordx=RA.Rx,recordy=RA.Ry; { j=k-1; for(;j>0;j--) { for(i=1;i<11;i++) { r_f[i][j+1]=r_f[i][j]; RA.Rx=i+15; RA.Ry=j+1+6; translation(); if(r_f[i][j+1]==1) setfillstyle(1,WHITE); else setfillstyle(1,BLACK); bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1); RA.Rx=recordx; RA.Ry=recordy; } } } } void pause() { HZ12(450,400,15,BLACK,正常); HZ12(450,400,15,GREEN,暂停); for(;;) if(bioskey(1)&&bioskey(0)==SPACE) { clearkbd(); HZ12(450,400,15,BLACK,暂停); HZ12(450,400,15,RED,正常); return; } } void judge() { int i,j,full=0; /*full等于10说明某一行满,该消除了*/ if(finish()) /*判断游戏是否该结束了*/ messagebox(); /*win编程里有这个函数*/ for(j=1;j<21;j++) /*判断某一行是否满了*/ { for(i=1;i<11;i++) full+=r_f[i][j]; if(full==10) erasure(j); /*消除这行*/ full=0; } } void update() /*使程序可以重新运行*/ { cleardevice(); setbkcolor(BLACK); initinfo(); /*提示信息初始化*/ initbox(); /*游戏框架初始化*/ srand((unsigned)time(NULL)); /*随机器函数的初始化*/ rs1=random(19); rs2=random(19); next_shape(); initposition(); /*方块最开始的出现位置*/ initremove(); /*记录每个方格有无颜色填充数组初始化*/ HZ12(450,400,15,RED,正常); process(); } void EXIT() { closegraph(); intrestore(); /*恢复中断向量*/ exit(0); } void initremove() { int i,j; for(i=0;i<12;i++) for(j=0;j<22;j++) if(i==0||i==11||j==0||j==21) r_f[i][j]=1; else r_f[i][j]=0; } void initinfo() { char aStr[2]; setcolor(RED); outtextxy(450,100,This game's writer is:); HZ12(450,140,15,RED,该程序作者:NULL); outtextxy(525,110,NULL); outtextxy(450,180,FUNCTION FOR KEYS:); outtextxy(450,200,UP:change the shape); outtextxy(450,210,DOWN:accelerate); outtextxy(450,220,LEFT:move left); outtextxy(450,230,RIGHT:move right); outtextxy(450,240,ESC:exit this game); outtextxy(450,250,SPACE:pause); HZ12(450,260,20,RED,上:); HZ12(450,280,20,RED,下:); HZ12(450,300,20,RED,左:); HZ12(450,320,20,RED,右:); HZ12(450,340,20,RED,ESC:退出); HZ12(450,360,15,RED,空格: 暂停/开始); HZ12(450,380,15,RED,目前状态:); HZ12(20,200,15,RED,下一个形状); aStr[0]=24; aStr[1]=0; aStr[6]=0; HZ12(480,260,12,GREEN,aStr); HZ12(500,260,12,GREEN,( 变形 )); aStr[0]=25; aStr[1]=0; HZ12(480,280,12,GREEN,aStr); HZ12(500,280,12,GREEN,( 加速 )); aStr[0]=27; aStr[1]=0; HZ12(480,300,12,GREEN,aStr); HZ12(500,300,12,GREEN,向左); aStr[0]=26; aStr[1]=0; HZ12(480,320,12,GREEN,aStr); HZ12(500,320,12,GREEN,向右); } void messagebox() { int key; setcolor(GREEN); setfillstyle(1,DARKGRAY); rectangle(220,200,420,300); bar(221,201,419,299); HZ12(280,210,15,GREEN,GAME OVER); HZ12(275,230,15,GREEN,重新游戏: Y); HZ12(275,270,15,GREEN,退出游戏: N); HZ12(450,400,15,BLACK,正常); HZ12(450,400,15,GREEN,GAME OVER); for(;;) if(bioskey(1)) { key=bioskey(0); if(key==Y) { clearkbd(); update(); } else if(key==N) { clearkbd(); EXIT(); } else clearkbd(); } } void initbox() { xcors=15; /*画游戏框*/ xcorb=26; ycors=6; ycorb=27; drawbox(); xcors=2; /*画提示框*/ xcorb=7; ycors=6; ycorb=11; drawbox(); } void initposition() { RA.Rx=18; RA.Ry=6-p[rs1].co[7];; RA.x1=0; RA.x2=0; RA.y1=0; RA.y2=0; }http://www.huihui.cn/share/32085516
http://www.huihui.cn/share/32086062
http://www.huihui.cn/share/32086460
http://www.huihui.cn/share/32086902
http://www.huihui.cn/share/32087540
http://www.huihui.cn/share/32088042
http://www.huihui.cn/share/32088540
http://www.huihui.cn/share/32088980
http://www.huihui.cn/share/32089946
http://www.huihui.cn/share/32090314
http://www.huihui.cn/share/32091338
http://www.huihui.cn/share/32091870
http://www.huihui.cn/share/32092320
http://www.huihui.cn/share/32092780
http://www.huihui.cn/share/32093232
http://www.huihui.cn/share/32093726
http://www.huihui.cn/share/32094168
http://www.huihui.cn/share/32094774
http://www.huihui.cn/share/32095230
http://www.huihui.cn/share/32095744
http://www.huihui.cn/share/32096204
http://www.huihui.cn/share/32096586
http://www.huihui.cn/share/32097012
http://www.huihui.cn/share/32097454
http://www.huihui.cn/share/32097908
http://www.huihui.cn/share/32098344
http://www.huihui.cn/share/32098902
http://www.huihui.cn/share/32099278
http://www.huihui.cn/share/32099690
http://www.huihui.cn/share/32100098
http://www.huihui.cn/share/32100502
http://www.huihui.cn/share/32101128
http://www.huihui.cn/share/32101556
http://www.huihui.cn/share/32102210
http://www.huihui.cn/share/32103274
http://www.huihui.cn/share/32103798
http://www.huihui.cn/share/32104280
http://www.huihui.cn/share/32104786
http://www.huihui.cn/share/32105234
http://www.huihui.cn/share/32105826
http://www.huihui.cn/share/32106354
http://www.huihui.cn/share/32106792
http://www.huihui.cn/share/32107316
http://www.huihui.cn/share/32107962
http://www.huihui.cn/share/32108410
http://www.huihui.cn/share/32108974
http://www.huihui.cn/share/32109544
http://www.huihui.cn/share/32110134
http://www.huihui.cn/share/32110740
http://www.huihui.cn/share/32111290
http://www.huihui.cn/share/32111862
http://www.huihui.cn/share/32112468
http://www.huihui.cn/share/32114722
http://www.huihui.cn/share/32117666
http://www.huihui.cn/share/32118256
http://www.huihui.cn/share/32120098
http://www.huihui.cn/share/32120644
http://www.huihui.cn/share/32121382
http://www.huihui.cn/share/32125100
http://www.huihui.cn/share/32125730
http://www.huihui.cn/share/32126162
http://www.huihui.cn/share/32126698
http://www.huihui.cn/share/32151652
http://www.huihui.cn/share/32152160
http://www.huihui.cn/share/32153714
http://www.huihui.cn/share/32154340
http://www.huihui.cn/share/32155058
http://www.huihui.cn/share/32159676
http://www.huihui.cn/share/32172238
http://www.huihui.cn/share/32173152
http://www.huihui.cn/share/32173782
http://www.huihui.cn/share/32174352
http://www.huihui.cn/share/32174920
http://www.huihui.cn/share/32175576
http://www.huihui.cn/share/32176140
http://www.huihui.cn/share/32176780
http://www.huihui.cn/share/32177318
http://www.huihui.cn/share/32177858
http://www.huihui.cn/share/32178394
http://www.huihui.cn/share/32179108
http://www.huihui.cn/share/32187636
http://www.huihui.cn/share/32188162
http://www.huihui.cn/share/32193002
http://www.huihui.cn/share/32198494
http://www.huihui.cn/share/32199012
http://www.huihui.cn/share/32200718
http://www.huihui.cn/share/32201590
http://www.huihui.cn/share/32202668
http://www.huihui.cn/share/32204074
http://www.huihui.cn/share/32206528
http://www.huihui.cn/share/32208680
http://www.huihui.cn/share/32209208
http://www.huihui.cn/share/32209734
http://www.huihui.cn/share/32225096
http://www.huihui.cn/share/32225524
http://www.huihui.cn/share/32226046
http://www.huihui.cn/share/32226410
http://www.huihui.cn/share/32226832
http://www.huihui.cn/share/32227310
http://www.huihui.cn/share/32227720
http://www.huihui.cn/share/32228310
http://www.huihui.cn/share/32229516
http://www.huihui.cn/share/32230042
http://www.huihui.cn/share/32230516
http://www.huihui.cn/share/32230886
http://www.huihui.cn/share/32231390
http://www.huihui.cn/share/32231776
http://www.huihui.cn/share/32232158
http://www.huihui.cn/share/32232526
http://www.huihui.cn/share/32232914
http://www.huihui.cn/share/32233276
http://www.huihui.cn/share/32233754
http://www.huihui.cn/share/32234242
http://www.huihui.cn/share/32234714
http://www.huihui.cn/share/32235140
http://www.huihui.cn/share/32235714
http://www.huihui.cn/share/32236134
http://www.huihui.cn/share/32236642
http://www.huihui.cn/share/32237682
http://www.huihui.cn/share/32241870
http://www.huihui.cn/share/32242318
http://www.huihui.cn/share/32242972
http://www.huihui.cn/share/32244090
http://www.huihui.cn/share/32244552
http://www.huihui.cn/share/32261208
http://www.huihui.cn/share/32262616
http://www.huihui.cn/share/32263554
http://www.huihui.cn/share/32264280
http://www.huihui.cn/share/32265442
http://www.huihui.cn/share/32266146
http://www.huihui.cn/share/32266654
http://www.huihui.cn/share/32267218
http://www.huihui.cn/share/32267650
http://www.huihui.cn/share/32268068
http://www.huihui.cn/share/32268516
http://www.huihui.cn/share/32269098
http://www.huihui.cn/share/32269602
http://www.huihui.cn/share/32270186
http://www.huihui.cn/share/32270842
http://www.huihui.cn/share/32271650
http://www.huihui.cn/share/32272436
http://www.huihui.cn/share/32275454
http://www.huihui.cn/share/32285302
http://www.huihui.cn/share/32285774
http://www.huihui.cn/share/32286216
http://www.huihui.cn/share/32286682
http://www.huihui.cn/share/32287148
http://www.huihui.cn/share/32287744
http://www.huihui.cn/share/32288154
http://www.huihui.cn/share/32288618
http://www.huihui.cn/share/32289104
http://www.huihui.cn/share/32289658
http://www.huihui.cn/share/32290984
http://www.huihui.cn/share/32291466
http://www.huihui.cn/share/32293404
http://www.huihui.cn/share/32293886
http://www.huihui.cn/share/32294546
http://www.huihui.cn/share/32295008
http://www.huihui.cn/share/32295378
http://www.huihui.cn/share/32295854
http://www.huihui.cn/share/32296304
http://www.huihui.cn/share/32296702
http://www.huihui.cn/share/32297286
http://www.huihui.cn/share/32297794
http://www.huihui.cn/share/32298330
http://www.huihui.cn/share/32298850
http://www.huihui.cn/share/32299456
http://www.huihui.cn/share/32299908
http://www.huihui.cn/share/32300278
http://www.huihui.cn/share/32302006
http://www.huihui.cn/share/32302466
http://www.huihui.cn/share/32304464
http://www.huihui.cn/share/32305386
http://www.huihui.cn/share/32306214
http://www.huihui.cn/share/32306692
http://www.huihui.cn/share/32307766
http://www.huihui.cn/share/32308194
http://www.huihui.cn/share/32309094
http://www.huihui.cn/share/32309574
http://www.huihui.cn/share/32310530
http://www.huihui.cn/share/32310918
http://www.huihui.cn/share/32315730
http://www.huihui.cn/share/32316042
http://www.huihui.cn/share/32316428
http://www.huihui.cn/share/32317308
http://www.huihui.cn/share/32317824
http://www.huihui.cn/share/32318448
http://www.huihui.cn/share/32319058
http://www.huihui.cn/share/32322508
http://www.huihui.cn/share/32323000
http://www.huihui.cn/share/32323446
http://www.huihui.cn/share/32323954
http://www.huihui.cn/share/32324312
http://www.huihui.cn/share/32327336
http://www.huihui.cn/share/32332016
http://www.huihui.cn/share/32332374
http://www.huihui.cn/share/32332732
http://www.huihui.cn/share/32333272
http://www.huihui.cn/share/32333660
http://www.huihui.cn/share/32333974
void next_shape() /*画下一形状提示框*/ { int recordx=RA.Rx,recordy=RA.Ry,buffer; RA.Rx=3; RA.Ry=7; draw(2); buffer=rs1; rs1=rs2; rs2=buffer; draw(1); RA.Rx=recordx; RA.Ry=recordy; buffer=rs1; rs1=rs2; rs2=buffer; } void process() /*游戏过程*/ { for(;;) { check_touch(); if(!nback) { rs1=rs2; rs2=random(19); /*产生另一种方块的码数*/ initposition(); judge(); /*判断某一行是否满了和这个游戏是否可以结束了*/ draw(1); next_shape(); } if(count_other>=1) { count_other=0; if(bioskey(1)) /*对按键的处理*/ { int key=bioskey(0); clearkbd(); /*清除键盘缓冲队列*/ if(key==ESC) EXIT(); if(key==LEFT&&nleft&&nback) mov(LEFT); if(key==RIGHT&&nright&&nback) mov(RIGHT); if(key==UP&&nback) change(); if(key==SPACE) pause(); if(key==DOWN) accelerate(); } } if(count_down>=4) { check_touch(); /*消除上一步动作对方块状态的影响*/ count_down=0; if(nback) /*0表示到达底部,1表示没有到达*/ mov(DOWN); } }/*for*/ } main() { int gdriver=DETECT,gmode=0; initgraph(&gdriver,&gmode,d:turboc); /*启动图形与中断部分*/ intenable(); update(); }
c语言扫雷的游戏续集
最新推荐文章于 2024-01-30 21:09:55 发布