这篇文章主要为大家详细介绍了C语言实现俄罗斯方块小游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
1.要先下载一个 graphics.h 的头文件来绘图。
2.初始化窗口:initgraph(x, y);这是先创建一个窗口的函数,以左上角为(0,0),向右为x轴,向下为y轴,其中x表示长x个单位,y表示宽y个单位。
3.关闭图像窗口:closegraph();结束时用来关闭用的。
4.按任意键继续:getch();这个就和getchar();差不多,为了防止以运行完就关了,这样能停顿一下,他的头文件是:conio.h 。
5.画线:line(x1, y1, x2, y2);在你创建的那么窗口里以(x1,y1)和(x2,y2)为两个端点画线。
6.画矩形:rectangle(x1,y1,x2,y2);以(x1,y1)和(x2,y2)为对角画一个矩形。
7.画圆:circle(x,y,r);以(x,y)为圆点,r为半径画圆。
8.颜色:setcolor(x);用来设置颜色的,其中x是你要设置的颜色,可以填这16种:黑 BLACK、蓝 BLUE、绿 GREEN、青 CYAN、红 RED、紫 MAGENTA、棕 BROWN、浅灰 LIGHTGRAY、深灰 DARKGRAY、亮蓝 LIGHTBLUE、亮绿 LIGHTGREEN、亮青 LIGHTCYAN、亮红 LIGHTRED、亮紫 LIGHTMAGENTA、黄 YELLOW、白 WHITE;当然,你也可以根据光的三原色来调自己喜欢的颜色,方法是:setcolor(RGB(x,y,z));其中RGB分别代表红绿蓝,对应的x,y,z是你选的该颜色的多少,范围是[0,255]。
#define FrameX 4 //游戏窗口左上角的X轴坐标 |
#define FrameY 4 //游戏窗口左上角的Y轴坐标 |
#define Frame_height 20 //游戏窗口的高度 |
#define Frame_width 18 //游戏窗口的宽度 |
int i,j,temp,temp1,temp2; //temp,temp1,temp2用于记住和转换方块变量的值 |
int a[80][80]={0}; //标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案 |
int b[4]; //标记4个"口"方块:1表示有方块,0表示无方块 |
int next; //下一个俄罗斯方块类型的序号 |
void gotoxy(HANDLE hOut, int x, int y); |
void get_flag(struct Tetris *); |
void make_tetris(struct Tetris *); |
void print_tetris(HANDLE hOut,struct Tetris *); |
void clear_tetris(HANDLE hOut,struct Tetris *); |
//判断是否能移动,返回值为1,能移动,否则,不动 |
int if_moveable(struct Tetris *); |
void del_full(HANDLE hOut,struct Tetris *); |
/******光标移到指定位置**************************************************************/ |
void gotoxy(HANDLE hOut, int x, int y) |
SetConsoleCursorPosition(hOut, pos); |
/******制作游戏窗口******************************************************************/ |
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量 |
gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); //打印游戏名称 |
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7); //打印选择菜单 |
printf("**********下一个方块:"); |
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13); |
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+17); |
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19); |
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15); |
gotoxy(hOut,FrameX,FrameY); //打印框角并记住该处已有图案 |
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY); |
gotoxy(hOut,FrameX,FrameY+Frame_height); |
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height); |
a[FrameX][FrameY+Frame_height]=2; |
a[FrameX+2*Frame_width-2][FrameY+Frame_height]=2; |
for(i=2;i<2*Frame_width-2;i+=2) |
gotoxy(hOut,FrameX+i,FrameY); |
for(i=2;i<2*Frame_width-2;i+=2) |
gotoxy(hOut,FrameX+i,FrameY+Frame_height); |
a[FrameX+i][FrameY+Frame_height]=2; //记住下横框有图案 |
for(i=1;i<Frame_height;i++) |
gotoxy(hOut,FrameX,FrameY+i); |
a[FrameX][FrameY+i]=2; //记住左竖框有图案 |
for(i=1;i<Frame_height;i++) |
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i); |
a[FrameX+2*Frame_width-2][FrameY+i]=2; //记住右竖框有图案 |
/******制作俄罗斯方块********************************************************************/ |
void make_tetris(struct Tetris *tetris) |
a[tetris->x][tetris->y]=b[0]; //中心方块位置的图形状态:1-有,0-无 |
switch(tetris->flag) //共6大类,19种类型 |
a[tetris->x][tetris->y-1]=b[1]; |
a[tetris->x+2][tetris->y-1]=b[2]; |
a[tetris->x+2][tetris->y]=b[3]; |
a[tetris->x-2][tetris->y]=b[1]; |
a[tetris->x+2][tetris->y]=b[2]; |
a[tetris->x+4][tetris->y]=b[3]; |
a[tetris->x][tetris->y-1]=b[1]; |
a[tetris->x][tetris->y-2]=b[2]; |
a[tetris->x][tetris->y+1]=b[3]; |
a[tetris->x-2][tetris->y]=b[1]; |
a[tetris->x+2][tetris->y]=b[2]; |
a[tetris->x][tetris->y+1]=b[3]; |
a[tetris->x][tetris->y-1]=b[1]; |
a[tetris->x][tetris->y+1]=b[2]; |
a[tetris->x-2][tetris->y]=b[3]; |
a[tetris->x][tetris->y-1]=b[1]; |
a[tetris->x-2][tetris->y]=b[2]; |
a[tetris->x+2][tetris->y]=b[3]; |
a[tetris->x][tetris->y-1]=b[1]; |
a[tetris->x][tetris->y+1]=b[2]; |
a[tetris->x+2][tetris->y]=b[3]; |
a[tetris->x][tetris->y+1]=b[1]; |
a[tetris->x-2][tetris->y]=b[2]; |
a[tetris->x+2][tetris->y+1]=b[3]; |
a[tetris->x][tetris->y-1]=b[1]; |
a[tetris->x-2][tetris->y]=b[2]; |
a[tetris->x-2][tetris->y+1]=b[3]; |
a[tetris->x][tetris->y-1]=b[1]; |
a[tetris->x-2][tetris->y-1]=b[2]; |
a[tetris->x+2][tetris->y]=b[3]; |
a[tetris->x][tetris->y+1]=b[1]; |
a[tetris->x+2][tetris->y-1]=b[2]; |
a[tetris->x+2][tetris->y]=b[3]; |
a[tetris->x][tetris->y-1]=b[1]; |
a[tetris->x][tetris->y+1]=b[2]; |
a[tetris->x-2][tetris->y-1]=b[3]; |
a[tetris->x-2][tetris->y]=b[1]; |
a[tetris->x-2][tetris->y+1]=b[2]; |
a[tetris->x+2][tetris->y]=b[3]; |
a[tetris->x][tetris->y-1]=b[1]; |
a[tetris->x][tetris->y+1]=b[2]; |
a[tetris->x+2][tetris->y+1]=b[3]; |
a[tetris->x-2][tetris->y]=b[1]; |
a[tetris->x+2][tetris->y-1]=b[2]; |
a[tetris->x+2][tetris->y]=b[3]; |
a[tetris->x][tetris->y+1]=b[1]; |
a[tetris->x][tetris->y-1]=b[2]; |
a[tetris->x+2][tetris->y-1]=b[3]; |
a[tetris->x-2][tetris->y]=b[1]; |
a[tetris->x-2][tetris->y-1]=b[2]; |
a[tetris->x+2][tetris->y]=b[3]; |
a[tetris->x][tetris->y-1]=b[1]; |
a[tetris->x][tetris->y+1]=b[2]; |
a[tetris->x-2][tetris->y+1]=b[3]; |
a[tetris->x-2][tetris->y]=b[1]; |
a[tetris->x+2][tetris->y+1]=b[2]; |
a[tetris->x+2][tetris->y]=b[3]; |
//******判断是否可动*************************************************************************/ |
int if_moveable(struct Tetris *tetris) |
if(a[tetris->x][tetris->y]!=0)//当中心方块位置上有图案时,返回值为0,即不可移动 |
if( //当为田字方块且除中心方块位置外,其他"口"字方块位置上无图案时,返回值为1,即可移动 |
( tetris->flag==1 && ( a[tetris->x][tetris->y-1]==0 && |
a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || |
//或为直线方块且除中心方块位置外,其他"口"字方块位置上无图案时,返回值为1,即可移动 |
( tetris->flag==2 && ( a[tetris->x-2][tetris->y]==0 && |
a[tetris->x+2][tetris->y]==0 && a[tetris->x+4][tetris->y]==0 ) ) || |
( tetris->flag==3 && ( a[tetris->x][tetris->y-1]==0 && |
a[tetris->x][tetris->y-2]==0 && a[tetris->x][tetris->y+1]==0 ) ) || |
( tetris->flag==4 && ( a[tetris->x-2][tetris->y]==0 && |
a[tetris->x+2][tetris->y]==0 && a[tetris->x][tetris->y+1]==0 ) ) || |
( tetris->flag==5 && ( a[tetris->x][tetris->y-1]==0 && |
a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y]==0 ) ) || |
( tetris->flag==6 && ( a[tetris->x][tetris->y-1]==0 && |
a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y]==0 ) ) || |
( tetris->flag==7 && ( a[tetris->x][tetris->y-1]==0 && |
a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || |
( tetris->flag==8 && ( a[tetris->x][tetris->y+1]==0 && |
a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) || |
( tetris->flag==9 && ( a[tetris->x][tetris->y-1]==0 && |
a[tetris->x-2][tetris->y]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) || |
( tetris->flag==10 && ( a[tetris->x][tetris->y-1]==0 && |
a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || |
( tetris->flag==11 && ( a[tetris->x][tetris->y+1]==0 && |
a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || |
( tetris->flag==12 && ( a[tetris->x][tetris->y-1]==0 && |
a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y-1]==0 ) ) || |
( tetris->flag==13 && ( a[tetris->x-2][tetris->y]==0 && |
a[tetris->x-2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || |
( tetris->flag==14 && ( a[tetris->x][tetris->y-1]==0 && |
a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) || |
( tetris->flag==15 && ( a[tetris->x-2][tetris->y]==0 && |
a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || |
( tetris->flag==16 && ( a[tetris->x][tetris->y+1]==0 && |
a[tetris->x][tetris->y-1]==0 && a[tetris->x+2][tetris->y-1]==0 ) ) || |
( tetris->flag==17 && ( a[tetris->x-2][tetris->y]==0 && |
a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || |
( tetris->flag==18 && ( a[tetris->x][tetris->y-1]==0 && |
a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) || |
( tetris->flag==19 && ( a[tetris->x-2][tetris->y]==0 && |
a[tetris->x+2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ) |
/******随机产生俄罗斯方块类型的序号**********************************************************/ |
void get_flag(struct Tetris *tetris) |
tetris->count++; //记住产生方块的个数 |
srand((unsigned)time(NULL)); //初始化随机数 |
tetris->flag = rand()%19+1; //记住第一个方块的序号 |
tetris->next = rand()%19+1; //记住下一个方块的序号 |
/******打印俄罗斯方块**********************************************************************/ |
void print_tetris(HANDLE hOut,struct Tetris *tetris) |
b[i]=1; //数组b[4]的每个元素的值都为1 |
make_tetris(tetris); //制作俄罗斯方块 |
for( i=tetris->x-2; i<=tetris->x+4; i+=2 ) |
for(j=tetris->y-2;j<=tetris->y+1;j++) |
if( a[i][j]==1 && j>FrameY ) |
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1); |
printf("level : %d",tetris->level); |
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3); |
printf("score : %d",tetris->score); |
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5); |
printf("speed : %dms",tetris->speed); |
热门跟贴