




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include #include #include #include #include #include #include /*定义左上角点在屏幕上的位置*/ #define MAPXOFT 9 #define MAPYOFT 5 /*定义下一个方块显示的位置*/ #define MAPXOFT1 13 #define MAPYOFT1 -2 #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 /*此键为加速键*/ #define UP 0x4800 /*此键为变形键*/ #define ESC 0x011b /*此键为退出键*/ #define ENTER 0x1c0d #define TIMER 0x1c /* 时钟中断的中断号 */ /* 中断处理函数在C和C+中的表示略有不同。 如果定义了_cplusplus则表示在C+环境下,否则是在C环境下。 */ #ifdef _cplusplus #define _CPPARGS . #else #define _CPPARGS #endif int TimerCounter=0; /* 计时变量,每秒钟增加18。 */ /* 指向原来时钟中断处理过程入口的中断处理函数指针(句柄) */ void interrupt ( *oldhandler)(_CPPARGS); /* 新的时钟中断处理函数 */ void interrupt newhandler(_CPPARGS) /* increase the global counter */ TimerCounter+; /* call the old routine */ oldhandler(); /* 设置新的时钟中断处理过程 */ void SetTimer(void interrupt (*IntProc)(_CPPARGS) oldhandler=getvect(TIMER); disable(); /* 设置新的时钟中断处理过程时,禁止所有中断 */ setvect(TIMER,IntProc); enable(); /* 开启中断 */ /* 恢复原有的时钟中断处理过程 */ void KillTimer() disable(); setvect(TIMER,oldhandler); enable(); struct shape int xy8,next; ; struct shape shapes19= /*x1,y1,x2,y2,x3,y3,x4,y4 指四个小方块的相对坐标,next指此方块变形后应变为哪个小方块 x1,y1,x2,y2,x3,y3,x4,y4,next*/ 0,-2, 0,-1, 0, 0, 1, 0, 1, -1, 0, 0, 0, 1,-1, 1, 0, 2, 0,-2, 1,-2, 1,-1, 1, 0, 3, -1,-1,-1, 0, 0,-1, 1,-1, 0, 0,-2, 0,-1, 0, 0, 1,-2, 5, -1,-1, 0,-1, 1,-1, 1, 0, 6, 0, 0, 1,-2, 1,-1, 1, 0, 7, -1,-1,-1, 0, 0, 0, 1, 0, 4, -1, 0, 0,-1, 0, 0, 1, 0, 9, 0,-2, 0,-1, 0, 0, 1,-1,10, -1,-1, 0,-1, 1,-1, 0, 0,11, 0,-1, 1,-2, 1,-1, 1, 0, 8, -1, 0, 0,-1, 0, 0, 1,-1,13, 0,-2, 0,-1, 1,-1, 1, 0,12, -1,-1, 0,-1, 0, 0, 1, 0,15, 0,-1, 0, 0, 1,-2, 1,-1,14, 0,-3, 0,-2, 0,-1, 0, 0,17, -1, 0, 0, 0, 1, 0, 2, 0,16, 0,-1, 0, 0, 1,-1, 1, 0,18 ; int board1020=0;/*定义游戏板初始化为0*/ char sp=0,le=0,sc=00000; int speed,speed0,level,score; int sign,flag; int style,style1; /*style为当前方块的种类,style1为即将输出的方块的种类*/ void draw_block(int x,int y,int style,int way); void draw_little_block(int x,int y); void init(); void initialize(); void speed_change(void); void score_change(int); void kill_line(int y); void fill_board(int x,int y, int style); int change(int *i,int *j,int key); void renovate(void); void ajustment(void); void level_change(void); main() int i,j,key,x0=5,y0=1; randomize(); while(!flag) /*flag为0表示重新开始游戏*/ level=score=speed=0; strcpy(le,0); strcpy(sp,0); strcpy(sc,00000); for(i=0;i10;i+) for(j=0;j0) level_change(); /*根据高度随机确定方块是否存在*/ style=random(19); /*随机确定方块种类*/ while(1) i=x0,j=y0; style1=random(19); /*随机确定即将出现的方块种类*/ setcolor(WHITE); sign=1; draw_block(MAPXOFT1,MAPYOFT1,style1,1); /*画出即将出现的方块*/ for(j=y0;j18/(speed+1) /* 恢复计时变量 */ TimerCounter=0; break; else if(TimerCounter18/(9+1)/*按下加速键时的处理*/ /* 恢复计时变量 */ TimerCounter=0; speed0=0; break; if(bioskey(1) key=bioskey(0); if(change(&i,&j,key)/*根据按键值做调整*/ flag=1; goto end; draw_block(i,j,style,0); renovate(); /*刷新屏幕*/ if(j=y0) break; j-; draw_block(i,j,style,1); fill_board(i,j,style); sign=1; draw_block(MAPXOFT1,MAPYOFT1,style1,0); style=style1; kill_line(j); /*消去的函数,消去若干行并改变分数和速度*/ while(bioskey(1) /*清除内存中的按键*/ key=bioskey(0); setcolor(CYAN); settextstyle(0,0,2); TimerCounter=0; while(1) if(TimerCounter54) TimerCounter=0; break; while(bioskey(1) /*清除内存中的按键*/ key=bioskey(0); outtextxy(400,340,Game over!); outtextxy(360,360,Enter to replay.); outtextxy(360,380,Esc to quit.); while(bioskey(1)=0); key=bioskey(0); end:; closegraph(); KillTimer(); if(key=ESC|flag) break; void initialize()/*初始化进入图形模式*/ int gdriver = VGA, gmode=VGAHI, errorcode; /* initialize graphics mode */ initgraph(&gdriver, &gmode, c:Turboc2); /* read result of initialization */ errorcode = graphresult(); if (errorcode != grOk) /* an error occurred */ printf(Graphics error: %sn, grapherrormsg(errorcode); printf(Press any key to halt:); getch(); exit(1); /* return with error code */ void init(void)/*初始化游戏板记分器等*/ int x1; x1=5+MAPXOFT; setcolor(GREEN); circle(x1+0.5)*16,(MAPYOFT-2)*16,3*16); setcolor(WHITE); line(x1-0.6)*16,(MAPYOFT-3.2)*16,x1*16,(MAPYOFT-3.2)*16); line(x1+1.4)*16,(MAPYOFT-3.2)*16,(x1+2.0)*16,(MAPYOFT-3.2)*16); line(x1+0.5)*16,(MAPYOFT-2)*16,(x1+0.5)*16,(MAPYOFT-1.7)*16); circle(x1+0.5)*16,(MAPYOFT-0.9)*16,0.3*16); setcolor(CYAN); line(MAPXOFT+3)*16,(MAPYOFT+21)*16,MAPXOFT*16,(MAPYOFT+23.5)*16); line(MAPXOFT+5.5)*16,(MAPYOFT+21)*16,MAPXOFT*16,(MAPYOFT+26)*16); line(MAPXOFT+9)*16,(MAPYOFT+21)*16,(MAPXOFT+12)*16,(MAPYOFT+23.5)*16); line(MAPXOFT+6.5)*16,(MAPYOFT+21)*16,(MAPXOFT+12)*16,(MAPYOFT+26)*16); setcolor(MAGENTA); ellipse(MAPXOFT+1)*16,(MAPYOFT+11)*16,90,270,7*16,7*16); ellipse(MAPXOFT+11)*16,(MAPYOFT+11)*16,-90,90,7*16,7*16); circle(MAPXOFT+24)*16,(MAPYOFT+6)*16,6*16); setcolor(WHITE); rectangle(x1-0.5)*16,(MAPYOFT-2.9)*16,(x1-0.1)*16,(MAPYOFT-2.5)*16); rectangle(x1+1.5)*16,(MAPYOFT-2.9)*16,(x1+1.9)*16,(MAPYOFT-2.5)*16); setcolor(YELLOW); rectangle(10*16,6*16,20*16,26*16); settextstyle(0,0,2); outtextxy(5*16,13.5*16,level); outtextxy(20.4*16,13.5*16,speed); outtextxy(MAPXOFT+22)*16,(MAPYOFT+3)*16,score); settextstyle(0,0,4); outtextxy(6.5*16,15*16,0); outtextxy(21.9*16,15*16,0); settextstyle(0,0,3); outtextxy(MAPXOFT+21)*16,(MAPYOFT+6)*16,sc); void ajustment(void) /*开始游戏前调整速度和高度*/ int key,boo=1,left=1; setcolor(YELLOW); settextstyle(0,0,2); outtextxy(500,340,PRESS); outtextxy(500,360,ENTER); outtextxy(500,380, TO ); outtextxy(500,400,START); while(1) if(TimerCounter8) TimerCounter=0; boo*=-1; if(boo=-1) setcolor(BLACK); else setcolor(YELLOW); if(left=1) line(6*16,17*16,8.5*16,17*16); setcolor(BLACK); line(21.4*16,17*16,23.9*16,17*16); else line(21.4*16,17*16,23.9*16,17*16); setcolor(BLACK); line(6*16,17*16,8.5*16,17*16); if(bioskey(1) key=bioskey(0); if(key=UP|key=DOWN) setcolor(BLACK); settextstyle(0,0,4); outtextxy(6.5*16,15*16,le); outtextxy(21.9*16,15*16,sp); if(key=ENTER) break; else if(key=UP) if(left=1) level-; if(level=-1) level=9; else speed-; if(speed=-1) speed=9; else if(key=DOWN) if(left=1) level+; if(level=10) level=0; else speed+; if(speed=10) speed=0; else if(key=LEFT|RIGHT) left*=-1; setcolor(YELLOW); sp0=speed+0; le0=level+0; settextstyle(0,0,4); outtextxy(6.5*16,15*16,le); outtextxy(21.9*16,15*16,sp); setcolor(YELLOW); sp0=speed+0; le0=level+0; settextstyle(0,0,4); outtextxy(6.5*16,15*16,le); outtextxy(21.9*16,15*16,sp); setcolor(BLACK); line(21.4*16,17*16,23.9*16,17*16); line(6*16,17*16,8.5*16,17*16); settextstyle(0,0,2); outtextxy(500,340,PRESS); outtextxy(500,360,ENTER); outtextxy(500,380, TO ); outtextxy(500,400,START); void level_change(void) /*根据高度随机确定方块是否存在*/ int i,j; setcolor(WHITE); for(i=1;i=10;i+) for(j=1;j=level;j+) if(random(2) boardi-120-j=1; draw_little_block(i+MAPXOFT,21-j+MAPYOFT); void draw_block(int x,int y,int style,int way) /*此x,y为虚拟坐标,为19中形式中的一种:018中的一个 x,y为10*20的方格的坐标,下标从1开始 way为1表填充,为0表清除*/ int x1=x+MAPXOFT,y1=y+MAPYOFT; int i; if(way=1) setcolor(WHITE); else setcolor(BLACK); for(i=0;i=10&x=6&y26)|sign) rectangle(x*16,y*16,x*16+16,y*16+16); circle(x*16+8,y*16+8,4); int check_block(int x,int y,int style)/*此处检查在(x,y)处放置一方块是否可以,若是,则返回1,否则返回0*/ int x1=x+MAPXOFT,y1=y+MAPYOFT; int x2,y2,i; for(i=0;i=10&x220&y226&(y2=(sp0-0)*100&(sp0-0)=1;i-) sci-1+=(sc-0)/10; sc-=(sc-0)/10*10; setcolor(YELLOW); settextstyle(0,0,3); outtextxy(MAPXOFT+21)*16,(MAPYOFT+6)*16,sc); /*输出新分数*/ void kill_line(int y)/*消去的函数,消去若干行并改变分数和速度*/ int count=0,i,t=1,j,k; for(;y=1&t=4;y-,t+) for(i=1;i=10;i+) if(!boardi-1y-1) break; if(i=11) count+; for(k=1;k=1;j-) for(k=1;k0) setcolor(CYAN); settextstyle(0,0,3); outtextxy(500,370,Good!); TimerCounter=0; while(1) if(TimerCounter3) TimerCounter=0; break; setcolor(BLACK); settextstyle(0,0,3); outtextxy(500,370,Good!); score_change(count); speed_change(); void fill_board(int x,int y, int style) /*当一方块停止时,将中相应的值改为1*/ int x1,y1,i; for(i=0;i=6;i+=2) x1=x+shapesstyle.xy; y1=y+shapesstyle.xyi+1; boardx1-1y1-1=1; int change(int *i,int *j,int key)/*控制方块移动、变形的函数*/ int key1; if(key=UP&check_block(*i,*j
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨境电商企业物流配送员工劳动合同及跨境电商规则
- 水利枢纽工程规划监理分公司长期合作协议
- 酒吧经营场所租赁合同附带独家经营权转让协议
- 国际物流进出口货物发票开具及关税申报协议
- 文化产业项目招投标与合同执行监管协议
- 智能绿化洒水车租赁及生态旅游服务合同
- 上班手机使用管理办法
- 行业网格防疫管理办法
- 管理员踢人管理办法
- 财务出入库管理办法
- GB/T 22076-2008气动圆柱形快换接头插头连接尺寸、技术要求、应用指南和试验
- JJG(新) 32 2022 工作用数字温度计检定规程
- 公共伦理学电子教案
- 埃美柯阀门检验报告汇总-391黄铜调节阀
- CJJ28-2014城镇供热管网工程施工及验收规范
- 500kV变电站屋外架构组立吊装工程施工安全技术交底
- 三字经全文带拼音注释打印版
- (完整版)污水处理站施工方案
- 生姜检验报告单
- 小型展览馆建筑设计精品ppt
- 膝关节镜下前交叉韧带重建术手术配合幻灯片课件
评论
0/150
提交评论