俄罗斯方块C语言源代码_第1页
俄罗斯方块C语言源代码_第2页
俄罗斯方块C语言源代码_第3页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、俄罗斯方块C语言源代码.txt43风帆,不挂在桅杆上,是一块无用的布;桅杆,不挂上风帆, 是一根平常的柱;理想,不付诸行动是虚无缥缈的雾;行动,而没有理想,是徒走没有尽头 的路。 44 成功的门往往虚掩着,只要你勇敢去推,它就会豁然洞开。 #include #include #include #include #include #ifdef _cplusplus#define _CPPARGS .#else#define _CPPARGS#endif#define MINBOXSIZE 15 /* 最小方块的尺寸 */#define BGCOLOR 7 /* 背景着色 */#define GX

2、 200#define GY 10#define SJNUM 10000 /* 每当玩家打到一万分等级加一级 */* 按键码 */#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_D

3、ONG 0#define F_NAN 1#define F_XI 2#define F_BEI 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=

4、0; /* 当前寺块的形壮和方向 */int nextboxfx=0,nextboxgs=0,maxcol=22;/* 下一个方块的形壮和方向 */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

5、,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,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

6、,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,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

7、,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,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=

8、nextboxgs;boxfx=nextboxfx; nextminboxcolor=random(14)+1;if(nextminboxcolor=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!=g

9、rOk)printf(error of: %s,grapherrormsg(errorcode); 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,in

10、t bsc,int color,int bdcolor)int a=0,b=0;a=SCCOL+asc;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

11、-1+MINBOXSIZE,b-1+MINBOXSIZE); /* 游戏中出现的文字 */void txt(int 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,

12、a,d);line(a,d,c,d);line(c,b,c,d);/* 当前方块的绘制 */void funbox(int a,int b,int color,int bdcolor)int i,j;int boxz44; for(i=0;i16;i+) boxzi/4i%4=boxstrboxgsboxfxi;for(i=0;i4;i+)for(j=0;j4;j+)if(boxzij=1) minbox(j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor);/* 下一个方块的绘制 */void nextfunbox(int a,int

13、 b,int color,int bdcolor)int i,j;int boxz44;for(i=0;i16;i+) boxzi/4i%4=boxstrnextboxgsnextboxfxi;for(i=0;i4;i+)for(j=0;j1;i-)for(j=1;j15;j+) minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR); grilij=grili-1j;if(grilij=1) minbox(j*MINBOXSIZE,i*MINBOXSIZE,minboxcolor,0);/* 消掉所有都有最小方块的行 */void delete()

14、int i,j,zero,delgx=0;char *nm=00000;for(i=1;i21;i+)zero=0; for(j=1;j15;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,Number:,1,15);txt(456,193,nm,1,15);/* 时间中断结束 */void KillTimer()disable();setvect(TIMER

15、,oldhandler);enable();/* 测试当前方块是否可以向下落 */int downok()int i,j,k=1,a44;for(i=0;i16;i+) ai/4i%4=boxstrboxgsboxfxi;for(i=0;i4;i+)for(j=0;j4;j+)if(aij & grilcol+i+1row+j) k=0;return(k);/* 测试当前方块是否可以向左行 */int leftok()int i,j,k=1,a44;for(i=0;i16;i+) ai/4i%4=boxstrboxgsboxfxi;for(i=0;i4;i+)for(j=0;j4;j+)if(

16、aij & grilcol+irow+j-1) k=0;return(k);/* 测试当前方块是否可以向右行 */ int rightok()int i,j,k=1,a44;for(i=0;i16;i+) ai/4i%4=boxstrboxgsboxfxi;for(i=0;i4;i+)for(j=0;j4;j+)if(aij & grilcol+irow+j+1) k=0;return(k);/* 测试当前方块是否可以变形 */int upok()int i,j,k=1,a44; for(i=0;i4;i+) for(i=0;i=0;i-)for(j=3;j=0;j-)if(aij & gri

17、lcol+irow+j)k=0;return(k);/* 当前方块落下之后,给屏幕坐标作标记 */ void setgril()int i,j,a44; funbox(0,0,minboxcolor,0);for(i=0;i16;i+) ai/4i%4=boxstrboxgsboxfxi;for(i=0;i4;i+)for(j=0;j0;i-)for(j=1;j3) boxfx=0;funbox(0,0,minboxcolor,0);break;case VK_LEFT: /* 左方向键,纵坐标减一 */ if(leftok() row-;funbox(0,0,minboxcolor,0);b

18、reak;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,NEXTROW,4,4); boxrad();nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0); delete();break;default:txt(423

19、,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,NEXTROW,nextminboxcolor,0); for(;)if(bioskey(1) key=bioskey(0);funbox(0,0,BGCOLOR,BGCOLOR); if(key=VK_ESC) break;c

20、all_key(key); if(TimerCountergamedjdj)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(0,0,minboxcolor,0);col=1;row=7; funbox(0,0,BGCOLOR,BGCOLOR); nextfunbox(NEXTCOL,NEXTROW,4,4);boxrad();nextfu

21、nbox(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;for(i=0;i=MAXCOL+1;i+) grili0=1;grili15=1;for(j=1;j 查看同主题问题: 俄罗斯方块 语言 语言 源代码 等待您来回答0 回答MiniGUI 程序中为什么我的鼠标无法正常工作0 回答smdk

22、2410 是什么,与 S3C2410 什么关系1 回答 那个开题报告也能发我一份么!谢谢!你有上市公司财务风险研究的开题0 回答50关于百雀羚凡士林保湿润肤霜与大宝SOD蜜的市场份额比例的具体情况,大2 回答“ MiniGUI 图形库”这个词是怎么读的0 回答20谁有s3c2410板子的 wince6.0 的BSP包。0 回答10求运算放大器应用的开题报告,及运算放大器的现状,学习的重点和难点。1 回答20sod 公司的电影有迅雷地址的, 好了给分更多等待您来回答的问题 其他回答 共 8 条只有 100 分回答者: chenyilong58 | 一级 | 2008-9-13 09:04 #in

23、clude #include #include #include #include #include #include /* 定义左上角点在屏幕上的位置 */#define MAPXOFT 9#define MAPYOFT 5/* 定义下一个方块显示的位置 */#define MAPXOFT1#define MAPYOFT1#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000 /*#define UP 0x4800 /*#define ESC 0x011b /*#define ENTER 0x1c0d#define TIMER 0

24、x1c /*13-2此键为加速键 */此键为变形键 */此键为退出键 */时钟中断的中断号 */*中断处理函数在 C和C+中的表示略有不同。C 环境下。 */如果定义了 _cplusplus则表示在C+环境下,否则是在 #ifdef _cplusplus #define _CPPARGS .#else #define _CPPARGS#endifint TimerCounter=0; /* 计时变量,每秒钟增加 18。 */* 指向原来时钟中断处理过程入口的中断处理函数指针(句柄) */void interrupt ( *oldhandler)(_CPPARGS);/* 新的时钟中断处理函数

25、*/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(); /*开启中断 */* 恢复原

26、有的时钟中断处理过程 */void KillTimer()disable();setvect(TIMER,oldhandler);enable();struct shapeint 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,-

27、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,-

28、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 为当前方块的种类, style1void draw_block(int

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

30、);main()int i,j,key,x0=5,y0=1;为 0 表示重新开始游戏 */randomize();while(!flag) /*flag 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

31、(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;got

32、o 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);TimerCoun

33、ter=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()

34、/* 初始化进入图形模式 */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 a

35、ny 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)*

36、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)

37、*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)

38、*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);

39、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,38

40、0, TO );outtextxy(500,400,START);while(1)if(TimerCounter8)TimerCounter=0;boo*=-1;if(boo=-1)setcolor(BLACK);elsesetcolor(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);elseline(21.4*16,17*16,23.9*16,17*16);setcolor(BLACK);line(6*16,17*16,8.5*16,17*16

41、);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;elsespeed-;if(speed=-1)speed=9;else if(key=DOWN)if(left=1)level+;if(level=10) level=0;els

42、espeed+;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

43、(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 d

温馨提示

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

评论

0/150

提交评论