为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

俄罗斯方块[经典]

2017-09-01 32页 doc 63KB 15阅读

用户头像

is_888153

暂无简介

举报
俄罗斯方块[经典]俄罗斯方块[经典] 俄罗斯方块 #include # include #include #include #define TIMER 0x1c #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 0x...
俄罗斯方块[经典]
俄罗斯方块[经典] 俄罗斯方块 #include # include #include #include #define TIMER 0x1c #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 #define MAX_BOX 19 /*总共有19种各形态的方块*/ #define BSIZE 16 /*方块的边长是16个象素*/ #define Sys_x 160 /*显示方块界面的左上角x座标*/ #define Sys_y 25 /*显示方块界面的左上角y座标*/ #define Horizontal_boxs 15 /*水平的方向以方块为单位的长度*/ #define Vertical_boxs 25 /*垂直的方向以方块为单位的长度,也就说长是30个方块*/ #define Begin_boxs_x 15/2 /*产生第一个方块时应该出现的起始位置 这里指定是在第5格出现*/ #define FgColor 2 /*前景颜色,如文字*/ #define BgColor 0 /*背景颜色*/ #define LeftWin_x Sys_x+Horizontal_boxs*BSIZE+50 /* 左边状态栏的x座标*/ #define false 0 #define true 1 /**//*移动的方向*/ #define MoveLeft 1 #define MoveRight 2 #define MoveDown 3 #define MoveRoll 4 #define MoveDown_direct 5 /**//* *以后坐标的每个像素点看作是BSIZE*BSIZE正方形的方块 */ int current_box_numb; /**//*保存当前方块编号*/ /**//*int Table_board[Vertical_boxs][Horizontal_boxs]; /*保存游戏当前状态的数组 */ int Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y;/**//*x,y 是保存方块的当前坐标的*/ int flag_newbox=false; /**//*是否要产生新方块的标记0*/ int speed=0; /**//*下落速度*/ int score=0; /**//*总分*/ int speed_step=15; /**//*每等级所需要分数*/ void interrupt (*oldtimer)(void);/**//* function pointer variable */ struct BOARD /**//*游戏底板结构,表示每个点所具有的属性*/ ...{ int var; /**//*当前状态 只有0和1*/ int color; /**//*颜色*/ }Table_board[Vertical_boxs][Horizontal_boxs]; /**//*方块结构*/ struct SHAPE ...{ char box[2]; /**//*一个字节等于8位,每4位来表示一个方块的一行*/ int color; /**//*颜色*/ int next; /**//*下个方块的编号*/ int prev; /**//*上个方块的编号*/ }; /**//*为游戏底板分配内存*/ /**//*初始化方块内容*/ struct SHAPE shapes[MAX_BOX]= ...{ /**//* * 口 口口口 口口 口 * 口 口 口 口口口 * 口口 口 */ ...{0x88, 0xc0, CYAN, 1, 3}, ...{0xe8, 0x0, CYAN, 2, 0}, ...{0xc4, 0x40, CYAN, 3, 1}, ...{0x2e, 0x0, CYAN, 0, 2}, /**//* * 口 口口 口口口 * 口 口 口 口 * 口口 口口口 口 */ ...{0x44, 0xc0, MAGENTA, 5, 7}, ...{0x8e, 0x0, MAGENTA, 6, 4}, ...{0xc8, 0x80, MAGENTA, 7, 5}, ...{0xe2, 0x0, MAGENTA, 4, 6}, /**//* * 口 * 口口 * 口 */ ...{0x8c, 0x40, YELLOW, 9, 9}, ...{0x6c, 0x0, YELLOW, 8, 8}, /**//* * 口 * 口口 * 口 */ ...{0x4c, 0x80, BROWN, 11, 11}, ...{0xc6, 0x0, BROWN, 10, 10}, /**//* * 口 * 口口口 */ ...{0x4e, 0x0, WHITE, 13, 15}, ...{0x8c, 0x80, WHITE, 14, 12}, ...{0xe4, 0x0, WHITE, 15, 13}, ...{0x4c, 0x40, WHITE, 12, 14}, /**//* 口 * 口 * 口 * 口 */ ...{0x88, 0x88, RED, 17, 17}, ...{0xf0, 0x0, RED, 16, 16}, /**//* * 口口 * 口口 */ ...{0xcc, 0x0, BLUE, 18, 18} }; unsigned int TimerCounter=0; void interrupt newtimer(void) ...{ (*oldtimer)(); TimerCounter++; } void SetTimer(void interrupt(*IntProc)(void)) ...{ oldtimer=getvect(TIMER); disable(); setvect(TIMER,IntProc); enable(); } void KillTimer() ...{ disable(); setvect(TIMER,oldtimer); enable(); } /**//*显示分数*/ void ShowScore(int score) ...{ int x,y; char score_str[5];/**//*保存游戏得分*/ setfillstyle(SOLID_FILL,BgColor); x=LeftWin_x; y=100; bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3); /**//* itoa(score,score_str,10);*/ sprintf(score_str,"%3d",score); outtextxy(x,y,"SCORE"); outtextxy(x,y+10,score_str); } /**//*显示速度*/ void ShowSpeed(int speed) ...{ int x,y; char speed_str[5];/**//*保存游戏得分*/ setfillstyle(SOLID_FILL,BgColor); x=LeftWin_x; y=200; bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3); sprintf(speed_str,"%3d",speed+1); outtextxy(x,y,"speed"); outtextxy(x,y+10,speed_str); } /**//* *********初始化界面******* *参数说明: * x,y为左上角坐标 * m,n对应于Vertical_boxs,Horizontal_boxs * 表示横肉纵方向的长度(以方块为单位) *BSIZE Sys_x Sys_y */ void initialize(int x,int y,int m,int n) ...{ int i,j,oldx; oldx=x; for(j=0;j=0;n--)/**//*从当前行往上看*/ ...{ totoal=0; for(m=0;m=t_boardy;n--) ...{ if(n<0 || n>=Vertical_boxs )...{continue;} /**//* 超过低线了*/ for(m=0;m=Vertical_boxs)continue; /**//*超过低线了*/ for(m=0;m=(Sys_x+BSIZE*Horizontal_boxs) )return(false );/**//*碰到最右边了*/ else if( Table_board[t_boardy+n][t_boardx+m].var) ...{ return(false); } } mask=mask/(2); if(mask==0)mask=128; } } return(true); } else if(direction==MoveDown) /**//*如果向下移*/ ...{ y+=BSIZE; t_boardx=(x-Sys_x)/BSIZE; t_boardy=(y-Sys_y)/BSIZE; mask=128; for(n=0;n<4;n++) ...{ for(m=0;m<4;m++) /**//*看最下边四个单元*/ ...{ if((shapes[box_numb].box[n/2]) & mask)/**//* 最下边有方块并且当前游戏板也有方块*/ ...{ if((y+BSIZE*n)>=(Sys_y+BSIZE*Vertical_boxs) || Table_board[t_boardy+n][t_boardx+m].var) ...{ flag_newbox=true; break; } } mask=mask/(2);/**//*这样可以得到每隔八位的mask 0001 0000,16 和 0000 0001*/ if(mask==0)mask=128; } } if(flag_newbox) ...{ return(false); } else return(true); } else if(direction==MoveRoll) /**//*转动*/ ...{ t_boardx=(x-Sys_x)/BSIZE; t_boardy=(y-Sys_y)/BSIZE; mask=128; for(n=0;n<4;n++) ...{ for(m=0;m<4;m++) /**//*看最下边四个单元*/ ...{ if((shapes[box_numb].box[n/2]) & mask)/**//* 最下边有方块并且当前游戏板也有方块*/ ...{ if((y+BSIZE*n)>=(Sys_y+BSIZE*Vertical_boxs) )return(false); /**//*碰到最下边了*/ if((x+BSIZE*n)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false );/**//*碰到最左边了*/ if((x+BSIZE*m)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false );/**//*碰到最右边了*/ else if( Table_board[t_boardy+n][t_boardx+m].var) ...{ return(false); } } mask=mask/(2);/**//*这样可以得到每隔八位的mask 0001 0000,16 和 0000 0001*/ if(mask==0)mask=128; } } return(true); } else ...{ return(false); } } /**//* 显示指定的方块 */ void show_box(int x,int y,int box_numb,int color) ...{ int i,ii,ls_x=x; if(box_numb<0 || box_numb>=MAX_BOX)/**//*指定的方块不存 在*/ box_numb=MAX_BOX/2; setfillstyle(SOLID_FILL,color); /**//********************************* * 移位来判断第哪一位是1 * 方块是每1行用半个字节来表示 * 128d=1000 0000b */ for(ii=0;ii<2;ii++) ...{ int mask=128; for(i=0;i<8;i++) ...{ if(i%4==0 && i!=0) /**//*表示转到 方块的下一行了*/ ...{ y+=BSIZE; x=ls_x; } /**//*if((shapes[box_numb].box[ii]>>(8-1-i))&1==1)/*左移后得到的是最高位*/ if((shapes[box_numb].box[ii])&mask) ...{ bar(x,y,x+BSIZE,y+BSIZE); line(x,y,x+BSIZE,y); line(x,y,x,y+BSIZE); line(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE); } x+=BSIZE; mask/=2; } y+=BSIZE; x=ls_x; } } void show_all_box() ...{ int i,ii,n; for(n=0;n>(8-1-i))&1==1) ...{ printf("%s","#"); } else ...{ printf("%s","O"); } } printf(" "); } getch(); } printf(" that's all!"); getch(); } /**//*返回下个方块号*/ int get_next_box(int box_numb) ...{ box_numb++; if(box_numb<0 || box_numb>=MAX_BOX)/**//*指定的方块不存 在*/ return 0; else return box_numb; } /**//*返回上个方块号*/ int get_prev_box(int box_numb) ...{ box_numb--; if(box_numb<0 || box_numb>=MAX_BOX)/**//*指定的方块不存 在*/ return 0; else return box_numb; } void main() ...{ int GameOver=0; int key,nextbox; int Currentaction=0;/**//*状态标记,往下移和,当前动作*/ int gd=VGA,gm=VGAHI,errorcode; /**//* int gd=EGA,gm=DETECT,errorcode; installuserdriver("VESA256",0); int gd=DETECT,gm,errorcode; */ initgraph(&gd,&gm,""); errorcode = graphresult(); if (errorcode != grOk) ...{ printf(" Graphics error: %s ", grapherrormsg(errorcode)); printf("Press any key to halt!"); getch(); exit(1); } setbkcolor(BgColor); setcolor(FgColor); randomize(); SetTimer(newtimer); initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);/**//*初始化*/ nextbox=MkNextBox(-1); line(LeftWin_x,Curbox_y+200,LeftWin_x+BSIZE*4,Curbox_y+200); line(LeftWin_x,Curbox_y+200,LeftWin_x,Curbox_y+200+BSIZE*4); line(LeftWin_x,Curbox_y+200+BSIZE*4,LeftWin_x+BSIZE*4,Curbox_y+200+BSIZE*4); line(LeftWin_x+BSIZE*4,Curbox_y+200,LeftWin_x+BSIZE*4,Curbox_y+200+BSIZE*4); show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); show_box(LeftWin_x,Curbox_y+200,nextbox,shapes[nextbox].color); getch(); while(1) ...{ /**//* Currentaction=0; flag_newbox=false; /*检测是否有按键*/ if (bioskey(1))...{key=bioskey(0); } else ...{ key=0; } switch(key) ...{ case VK_LEFT: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveLeft)) ...{EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x-=BSIZE;Currentaction=MoveLeft;} break; case VK_RIGHT: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight)) ...{EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x+=BSIZE;Currentaction=MoveRight;} break; case VK_DOWN:/**//*加速*/ if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)) ...{EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;Currentaction=MoveDown;} else...{ flag_newbox=true;} break;/**//*MoveDown_direct*/ case VK_SPACE:/**//*直接下落*/ if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)) ...{ EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;Currentaction=MoveDown_direct; } else ...{flag_newbox=true;} break; case 0x1e61:/**//*a转动方块*/ if(MoveAble(Curbox_x,Curbox_y,shapes[current_box_numb].prev,MoveRoll)) ...{ EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapes[current_box_numb].prev; Currentaction=MoveRoll; } break; case VK_UP:/**//*变换方块*/ if(MoveAble(Curbox_x,Curbox_y,shapes[current_box_numb].next,MoveRoll)) ...{ EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapes[current_box_numb].next; Currentaction=MoveRoll; } break; case VK_ESC: GameOver=1; break; default: break; } if(Currentaction && MoveDown_direct!=Currentaction) ...{/**//*表示当前有动作,移动或转动*/ show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); } /**//*按了往下键,但不能下移,就产生新方块*/ if(flag_newbox) ...{ /**//*这时相当于方块到底部了,把其中出现点满一行的清去,置0*/ EraseBox(LeftWin_x,Sys_y+200,nextbox); nextbox=MkNextBox(nextbox); show_box(LeftWin_x,Curbox_y+200,nextbox,shapes[nextbox].col or); if(!MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown))/ **//*刚生一下就到东西,游戏结束*/ ...{ show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_ box_numb].color); GameOver=1; } else ...{ flag_newbox=false; } Currentaction=0; } else /**//*自由下落*/ ...{ if(Currentaction==MoveDown_direct) /**//*直接下落*/ ...{ int ls_i; for(ls_i=Curbox_y;ls_i (20-speed*2)) ...{ if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)) ...{ EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZ E; show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_ box_numb].color); } /**//* if (Currentaction==MoveDown)*/ TimerCounter=0; } } Currentaction=0; if(GameOver )/**//*|| flag_newbox==-1*/ ...{ printf("game over!"); initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs); getch(); break; } } getch(); KillTimer(); closegraph(); }
/
本文档为【俄罗斯方块[经典]】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索