1、 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_f1222,rs1,rs2,xcors,xcorb,ycors,ycorb;/*检查方快有没有左,右,下接触,游戏区内所有格子有无颜色记录数组,rs1形状记录,rs2为提示框用,记录小格子在游戏区
2、中的位置,按键存储*/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();se
3、tvect(0x1c,oldint);void HZ12(int x0,int y0,int w,int color,char *s) /*根据字模,在dos下显示汉字*/*横坐标,纵坐标,字间隔,汉字颜色,汉字字符串*/ FILE *fp;register char buffer24;register char str2;unsigned long fpos;/*fpos为最终偏移动量*/register int i,j,k;fp=fopen(hzk12,r);/*打开12*12汉字苦*/while(*s)/*一直到字符串结束为止*/if(*s0)/*汉字输出*/ str0=(*s)-0xa
4、0;str1=*(s+1)-0xa0;fpos=(str0-1)*94+(str1-1)*24L;/*计算汉字在hzk12的偏移量*/fseek(fp,fpos,SEEK_SET);/*指针移动到当前位置*/fread(buffer,24,1,fp);/*读取一个汉字到数组中*/for(i=0;i12;i+)/*12行*/for(j=0;j2;j+)/*两个字节*/for(k=0;k(7-k)&0x1)!=NULL)/*是一就画点*/putpixel(x0+8*j+k,y0+i,color);s+=2;/*一个汉字占两个字节,现在将指针移动两个字节*/x0+=w;/*显示坐标也按照间隔移动*/
5、else/*显示非汉字字符*/ settextstyle(0,0,1);setcolor(color);str0=*s;str1=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; RA.y1=16*
6、(RA.Ry-1); RA.y2=16*RA.Ry;int check_b() /*检查是否到达低部*/ int x,y,i,zf=0; /*zf为是否有颜色填充记录*/7;i+,i+) x=RA.Rx+prs1.coi;y=RA.Ry+prs1.coi+1;if(y=6)zf+=r_fx-15y-6+1;if(zf=0)return 1;return 0;int finish() int tfull=0,i; /*判断顶层空间是否有填充*/for(i=1;11;i+)tfull+=r_fi1;if(tfull!=0) /*告诉judge()可以结束了*/int check_l() /*检查形
7、状是否与左接触*/6)zf+=r_fx-15-1y-6;if(y=6&x=16)zf+=1;int check_r() /*检查形状是否与右接触*/ /*zf为是否有颜色填充记录*/int x,y,i,zf=0;x=RA.Rx+prs1.coi;zf+=r_fx-15+1y-6;x=25)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,record
8、y=RA.Ry; RA.Rx+=prs1.coi;RA.Ry+=prs1.coi+1;if(RA.Ry=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;ycor0;j-) for(i=1; r_fij+1=r_fij;RA.Rx=i+15;RA.Ry=j+1+6;if(r_fij+1=1)se
9、tfillstyle(1,WHITE);void pause() HZ12(450,400,15,BLACK,正常);HZ12(450,400,15,GREEN,暂停);)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
10、;21;j+) /*判断某一行是否满了*/full+=r_fij;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(
11、); /*记录每个方格有无颜色填充数组初始化*/process();void EXIT() closegraph();intrestore(); /*恢复中断向量*/exit(0);void initremove() int i,j;22;j+)if(i=0|i=11|j=0|j=21)r_fij=1;r_fij=0;void initinfo() char aStr2;setcolor(RED);outtextxy(450,100,This games writer is:);HZ12(450,140,15,RED,该程序作者:NULL);outtextxy(525,110,NULL);ou
12、ttextxy(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,
13、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,下一个形状);aStr0=24;aStr1=0;aStr6=0;HZ12(480,260,12,GREEN,aStr);HZ12(500,260,12,GREEN,( 变形 );aStr0=25;HZ12(480,280,12,GREEN,aStr);HZ12(500,280,12,GREEN,( 加速 );aStr0=2
14、7;HZ12(480,300,12,GREEN,aStr);HZ12(500,300,12,GREEN,向左);aStr0=26;HZ12(480,320,12,GREEN,aStr);HZ12(500,320,12,GREEN,向右);void messagebox() int key;setcolor(GREEN);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,退出游戏:
15、 N);HZ12(450,400,15,BLACK,正常);HZ12(450,400,15,GREEN,GAME OVER);if(bioskey(1) key=bioskey(0);if(key=Y)update();if(key=N)EXIT();clearkbd();void initbox() xcors=15; /*画游戏框*/xcorb=26;ycors=6;ycorb=27;drawbox();xcors=2; /*画提示框*/xcorb=7;ycorb=11;void initposition() RA.Rx=18;RA.Ry=6-prs1.co7;RA.x1=0;RA.x2=
16、0;RA.y1=0;RA.y2=0;void next_shape() /*画下一形状提示框*/ int recordx=RA.Rx,recordy=RA.Ry,buffer;RA.Rx=3;RA.Ry=7;rs1=rs2;rs2=buffer;void process() /*游戏过程*/ for(;if(!nback) rs1=rs2; /*产生另一种方块的码数*/judge(); /*判断某一行是否满了和这个游戏是否可以结束了*/if(count_other count_other=0;if(bioskey(1) /*对按键的处理*/ int key=bioskey(0); /*清除键盘缓冲队列*/if(key=ESC)nleft&mov(LEFT);nright&mov(RIGHT);if(key=UP&change();if(key=SPACE)pause();if(key=DOWN)accelerate();if(count_down=4)/*for*/main() int gdriver=DETECT,gmode=0;initgraph(&gdriver,&gmode,d:turboc); /*启动图形与中断部分*/intenable();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1