俄罗斯方块纯c版_第1页
俄罗斯方块纯c版_第2页
俄罗斯方块纯c版_第3页
俄罗斯方块纯c版_第4页
俄罗斯方块纯c版_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include <stdio.h>#include <dos.h>#include <conio.h>#include <graphics.h>#include <stdlib.h>#ifdef _cplusplus#define _CPPARGS .#else#define _CPPARGS#endif#define MINBOXSIZE 15 /* 最小方块的尺寸 */#define BGCOLOR 7 /* 背景着色 */#define GX 200#define GY 10#define SJNUM 10000 /* 每当玩

2、家打到一万分等级加一级*/* 按键码*/#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x4800#define VK_HOME 0x4700#define VK_END 0x4f00#define VK_SPACE 0x3920#define VK_ESC 0x011b#define VK_ENTER 0x1c0d/* 定义俄罗斯方块的方向(我定义他为4种)*/#define F_DONG 0#define F_NAN 1#define F_XI 2#define F_BEI

3、3#define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/#define NEXTROW 12 /* 要出的下一个方块的横从标*/#define MAXROW 14 /* 游戏屏幕大小*/#define MAXCOL 20#define SCCOL 100 /*游戏屏幕大显示器上的相对位置*/#define SCROW 60int gril2216; /* 游戏屏幕坐标*/int col=1,row=7; /* 当前方块的横纵坐标*/int boxfx=0,boxgs=0; /* 当前寺块的形壮和方向*/int nextboxfx=0,nextboxgs=0,maxcol=22

4、;/*下一个方块的形壮和方向*/int minboxcolor=6,nextminboxcolor=6;int num=0; /*游戏分*/int dj=0,gamedj10=18,16,14,12,10,8,6,4,2,1;/* 游戏等级*/* 以下我用了一个3维数组来纪录方块的最初形状和方向*/int boxstr7416=1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0

5、,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0

6、,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0

7、,1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0.0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0;/* 随机得到当前方块和下一个方块的形状和方向*/void boxrad()minboxcolor=nextminboxcolor;boxgs=nextboxgs;boxfx=nextboxfx;nextminboxcolor=random(14)+1;if(nextminbo

8、xcolor=4|nextminboxcolor=7|nextminboxcolor=8)nextminboxcolor=9;nextboxfx=F_DONG;nextboxgs=random(7);/*初始化图形模试*/void init(int gdrive,int gmode)int errorcode;initgraph(&gdrive,&gmode,"D:tc");errorcode=graphresult();if(errorcode!=grOk)printf("error of: %s",grapherrormsg(erro

9、rcode);exit(1);/* 在图形模式下的清屏 */void cls()setfillstyle(SOLID_FILL,0);setcolor(0);bar(0,0,640,480);/*在图形模式下的高级清屏*/void clscr(int a,int b,int c,int d,int color)setfillstyle(SOLID_FILL,color);setcolor(color);bar(a,b,c,d);/*最小方块的绘制*/void minbox(int asc,int bsc,int color,int bdcolor)int a=0,b=0;a=SCCOL+asc

10、;b=SCROW+bsc;clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color);if(color!=BGCOLOR)setcolor(bdcolor);line(a+1,b+1,a-1+MINBOXSIZE,b+1);line(a+1,b+1,a+1,b-1+MINBOXSIZE);line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE);line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE);/*游戏中出现的文字*/void txt(int

11、 a,int b,char *txt,int font,int color)setcolor(color);settextstyle(0,0,font);outtextxy(a,b,txt);/*windows 绘制*/void win(int a,int b,int c,int d,int bgcolor,int bordercolor)clscr(a,b,c,d,bgcolor);setcolor(bordercolor);line(a,b,c,b);line(a,b,a,d);line(a,d,c,d);line(c,b,c,d);/* 当前方块的绘制*/void funbox(int

12、a,int b,int color,int bdcolor)int i,j;int boxz44;for(i=0;i<16;i+)boxzi/4i%4=boxstrboxgsboxfxi;for(i=0;i<4;i+)for(j=0;j<4;j+)if(boxzij=1)minbox(j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor);/*下一个方块的绘制*/void nextfunbox(int a,int b,int color,int bdcolor)int i,j;int boxz44;for(i=0;i&l

13、t;16;i+)boxzi/4i%4=boxstrnextboxgsnextboxfxi;for(i=0;i<4;i+)for(j=0;j<4;j+)if(boxzij=1)minbox(j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color,bdcolor);/*时间中断定义*/#define TIMER 0x1cint TimerCounter=0;void interrupt ( *oldhandler)(_CPPARGS);void interrupt newhandler(_CPPARGS)TimerCounter+;oldhandler();voi

14、d SetTimer(void interrupt (*IntProc)(_CPPARGS)oldhandler=getvect(TIMER);disable();setvect(TIMER,IntProc);enable();/*由于游戏的规则,消掉都有最小方块的一行*/void delcol(int a)int i,j;for(i=a;i>1;i-)for(j=1;j<15;j+)minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR);grilij=grili-1j;if(grilij=1)minbox(j*MINBOXSIZE,i*

15、MINBOXSIZE,minboxcolor,0);/*消掉所有都有最小方块的行*/void delete()int i,j,zero,delgx=0;char *nm="00000"for(i=1;i<21;i+)zero=0;for(j=1;j<15;j+)if(grilij=0)zero=1;if(zero=0)delcol(i);delgx+;num=num+delgx*delgx*10;dj=num/10000;sprintf(nm,"%d",num);clscr(456,173,500,200,4);txt(456,173,&qu

16、ot;Number:",1,15);txt(456,193,nm,1,15);/*时间中断结束*/void KillTimer()disable();setvect(TIMER,oldhandler);enable();/* 测试当前方块是否可以向下落*/int downok()int i,j,k=1,a44;for(i=0;i<16;i+)ai/4i%4=boxstrboxgsboxfxi;for(i=0;i<4;i+)for(j=0;j<4;j+)if(aij && grilcol+i+1row+j)k=0;return(k);/* 测试当前方块

17、是否可以向左行*/int leftok()int i,j,k=1,a44;for(i=0;i<16;i+)ai/4i%4=boxstrboxgsboxfxi;for(i=0;i<4;i+)for(j=0;j<4;j+)if(aij && grilcol+irow+j-1)k=0;return(k);/* 测试当前方块是否可以向右行*/int rightok()int i,j,k=1,a44;for(i=0;i<16;i+)ai/4i%4=boxstrboxgsboxfxi;for(i=0;i<4;i+)for(j=0;j<4;j+)if(ai

18、j && grilcol+irow+j+1)k=0;return(k);/* 测试当前方块是否可以变形*/int upok()int i,j,k=1,a44;for(i=0;i<4;i+)for(i=0;i<16;i+)ai/4i%4=boxstrboxgsboxfx+1i;for(i=3;i>=0;i-)for(j=3;j>=0;j-)if(aij && grilcol+irow+j)k=0;return(k);/*当前方块落下之后,给屏幕坐标作标记*/void setgril()int i,j,a44;funbox(0,0,minbo

19、xcolor,0);for(i=0;i<16;i+)ai/4i%4=boxstrboxgsboxfxi;for(i=0;i<4;i+)for(j=0;j<4;j+)if(aij)grilcol+irow+j=1;col=1;row=7;/*游戏结束*/void gameover()int i,j;for(i=20;i>0;i-)for(j=1;j<15;j+)minbox(j*MINBOXSIZE,i*MINBOXSIZE,2,0);txt(103,203,"Game Over",3,10);/*按键的设置*/void call_key(int

20、 keyx)switch(keyx)case VK_DOWN: /*下方向键,横坐标加一。*/if(downok()col+;funbox(0,0,minboxcolor,0);elsefunbox(0,0,minboxcolor,0);setgril();nextfunbox(NEXTCOL,NEXTROW,4,4);boxrad();nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);delete();break;case VK_UP: /*上方向键,方向形状旋转90度*/if(upok()boxfx+;if(boxfx>3)boxfx=0;f

21、unbox(0,0,minboxcolor,0);break;case VK_LEFT: /*左方向键,纵坐标减一*/if(leftok()row-;funbox(0,0,minboxcolor,0);break;case VK_RIGHT: /*右方向键,纵坐标加一*/if(rightok()row+;funbox(0,0,minboxcolor,0);break;case VK_SPACE: /*空格键,直接落到最后可以落到的们置*/while(downok()col+;funbox(0,0,minboxcolor,0);setgril();nextfunbox(NEXTCOL,NEXTR

22、OW,4,4);boxrad();nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);delete();break;default:txt(423,53,"worng key!",1,4);txt(428,80,"Plese Enter Anly Key AG!",1,4);getch();clscr(420,50,622,97,BGCOLOR);/*时间中断开始*/void timezd(void)int key;SetTimer(newhandler);boxrad();nextfunbox(NEXTCOL,N

23、EXTROW,nextminboxcolor,0);for(;)if(bioskey(1)key=bioskey(0);funbox(0,0,BGCOLOR,BGCOLOR);if(key=VK_ESC)break;call_key(key);if(TimerCounter>gamedjdj)TimerCounter=0;if(downok()funbox(0,0,BGCOLOR,BGCOLOR);col+;funbox(0,0,minboxcolor,0);else if(col=1)gameover();getch();break;setgril();delete();funbox(

24、0,0,minboxcolor,0);col=1;row=7;funbox(0,0,BGCOLOR,BGCOLOR);nextfunbox(NEXTCOL,NEXTROW,4,4);boxrad();nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);/*主程序开始*/void main(void)int i,j;char *nm="00000"init(VGA,VGAHI);cls();/*屏幕坐标初始化*/for(i=0;i<=MAXCOL+1;i+)for(j=0;j<=MAXROW+1;j+)grilij=0;fo

25、r(i=0;i<=MAXCOL+1;i+) grili0=1;grili15=1;for(j=1;j<=MAXROW;j+)gril0j=1;gril21j=1;clscr(0,0,640,480,15);win(1,1,639,479,4,15);win(SCCOL+MINBOXSIZE-2,SCROW+MINBOXSIZE-2,SCCOL+15*MINBOXSIZE+2,SCROW+21*MINBOXSIZE+2,BGCOLOR,0);nextboxgs=random(8);nextboxfx=random(4);sprintf(nm,"%d",num);t

26、xt(456,173,"Number:",1,15);txt(456,193,nm,1,15);txt(456,243,"Next Box:",1,15);timezd();KillTimer();closegraph();56回答者:热心网友 | 回答时间:2008-9-13 09:11 | 我来评论相关内容2011-5-15VC6.0环境下的俄罗斯方块C语言源代码52009-11-4求俄罗斯方块C语言源代码,用Microsoft C+ 6.0能编译出来。92008-6-19俄罗斯方块的c语言源代码 api实现22009-9-8求用c语言写的俄罗斯方块

27、源代码432011-1-29哪个才是俄罗斯方块源代码 C语言的更多关于俄罗斯方块源码的问题>>查看同主题问题: 俄罗斯方块 语言 语言 源代码等待您来回答0回答MiniGUI 程序中为什么我的鼠标无法正常工作0回答smdk2410 是什么,与S3C2410什么关系1回答那个开题报告也能发我一份么!谢谢!你有上市公司财务风险研究的开题.0回答50关于百雀羚凡士林保湿润肤霜与大宝SOD蜜的市场份额比例的具体情况,大.2回答“MiniGUI图形库”这个词是怎么读的0回答20谁有 s3c2410板子的wince6.0 的BSP包。0回答10求运算放大器应用的开题报告,及运算放大器的现状,学

28、习的重点和难点。1回答20sod公司的电影有迅雷地址的,有的朋友发723453145 好了给分更多等待您来回答的问题>>其他回答 共8条只有100分回答者: chenyilong58 | 一级 | 2008-9-13 09:04#include <graphics.h>#include <stdio.h>#include <dos.h>#include <conio.h>#include <time.h>#include <math.h>#include <stdlib.h>/*定义左上角点在屏幕上

29、的位置*/#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+中的表示略有不同。如果定义了_

30、cplusplus则表示在C+环境下,否则是在C环境下。 */#ifdef _cplusplus#define _CPPARGS .#else#define _CPPARGS#endifint TimerCounter=0; /* 计时变量,每秒钟增加18。 */* 指向原来时钟中断处理过程入口的中断处理函数指针(句柄) */void interrupt ( *oldhandler)(_CPPARGS);/* 新的时钟中断处理函数 */void interrupt newhandler(_CPPARGS) /* increase the global counter */ TimerCount

31、er+; /* 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); enabl

32、e();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,

33、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

34、, 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 d

35、raw_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; ra

36、ndomize(); while(!flag) /*flag为0表示重新开始游戏*/ level=score=speed=0; strcpy(le,"0"); strcpy(sp,"0"); strcpy(sc,"00000"); for(i=0;i<10;i+) for(j=0;j<20;j+) boardij=0; /*初始化一些变量为0*/ initialize(); /*初始化进入图形模式*/ init(); /*初始化游戏板记分器等*/ SetTimer(newhandler); /* 修改时钟中断 */ aju

37、stment(); /*开始游戏前调整速度和高度*/ if(level>0) 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;j<=20;j+) /*使方块下降*/ if(!check_block(i,j,styl

38、e) break; draw_block(i,j,style,1); while(1) if(speed0=0) /*未按下加速键时的处理*/ if (TimerCounter>18/(speed+1) /* 恢复计时变量 */ TimerCounter=0; break; else if(TimerCounter>18/(9+1)/*按下加速键时的处理*/ /* 恢复计时变量 */ TimerCounter=0; speed0=0; break; if(bioskey(1) key=bioskey(0); if(change(&i,&j,key)/*根据按键值做调

39、整*/ 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); se

40、ttextstyle(0,0,2); TimerCounter=0; while(1) if(TimerCounter>54) 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=bi

41、oskey(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 (e

42、rrorcode != 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

43、,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)

44、*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,(MAPYO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论